Pregunta ¿Arreglar una cabeza separada de Git?


Estaba haciendo un trabajo en mi repositorio y noté que un archivo tiene cambios locales. Ya no los quería, así que borré el archivo, pensando que puedo sacar una nueva copia. Yo quería hacer el equivalente git de

svn up .

Utilizando git pull no pareció funcionar Algunas búsquedas aleatorias me llevaron a un sitio donde alguien me recomendó hacer

git checkout HEAD^ src/

(src es el directorio que contiene el archivo eliminado).

Ahora descubro que tengo una cabeza desprendida. No tengo idea de qué es eso. ¿Cómo puedo deshacer?


982
2018-04-19 13:07


origen


Respuestas:


Cabeza separada significa que ya no estás en una rama, has comprobado una única confirmación en el historial (en este caso, la confirmación anterior a HEAD, es decir, HEAD ^).

Si quieres borrar sus cambios asociados con HEAD separado

Solo debe realizar el pago en la sucursal en la que se encontraba, p.

git checkout master

La próxima vez que haya cambiado un archivo y desee restaurarlo al estado en el que se encuentra, no lo elimine primero, solo haga

git checkout -- path/to/foo

Esto restablecerá el archivo foo al estado en que se encuentra en el índice.

Si quieres mantener sus cambios asociados con HEAD separado

  1. correr git log -n 1; esto mostrará la confirmación más reciente en el HEAD separado. Copie y pegue el hash de confirmación.
  2. correr git checkout master
  3. correr git branch tmp <commit-hash>. Esto guardará sus cambios en una nueva rama llamada tmp.
  4. Si desea incorporar los cambios realizados en master, correr git merge tmp desde el master rama. Deberías estar en el master rama después de correr git checkout master.

1406
2018-04-19 13:32



Si ha cambiado archivos que no desea perder, puede presionarlos. Los he asignado en el modo separado y después de eso puedes mover a una rama temporal para integrarlos más tarde en el maestro.

git commit -m "....."
git branch my-temporary-work
git checkout master
git merge my-temporary-work

Extraído de:

Qué hacer con commit hecho en una cabeza separada


368
2017-12-09 20:05



Cómo salir ("arreglar") estado HEAD separado cuando ya has cambiado algo en este modo y, opcionalmente, quiere guardar sus cambios.

Esta solución funciona sin crear una rama temporal.

  1. Confirme los cambios que desea mantener. Si desea hacerse cargo de cualquiera de los cambios que realizó en el estado de HEAD separado, hágalo. Me gusta:

    git commit -a -m "your commit message"
    
  2. Descarta los cambios que no quieres mantener. El restablecimiento completo descartará cualquier cambio no confirmado que haya realizado en el estado HEAD desconectado:

    git reset --hard
    

    (Sin esto, el paso 3 fallaría, quejándose de archivos no confirmados modificados en el HEAD separado).

  3. Mira tu sucursal. Salga del estado HEAD desconectado revisando la rama en la que trabajó anteriormente, por ejemplo:

    git checkout master
    
  4. Controla tus compromisos. Ahora puede encargarse de las confirmaciones que realizó en el estado de HEAD separado mediante el método de selección rápida, como se muestra en mi respuesta a otra pregunta.

    git reflog
    git cherry-pick <hash1> <hash2> <hash3> …
    

105
2018-06-11 13:23



Cabeza separada significa:  (1) Ya no estás en una sucursal,  (2) Ha comprobado una única confirmación en el historial

si no tienes cambios: puedes cambiar a maestro aplicando el siguiente comando

  git checkout master

si tiene cambios que quiere mantener: 

En caso de HEAD desconectado, realiza un trabajo normal, excepto que no se actualiza ninguna rama con nombre. Para obtener la rama principal actualizada con sus cambios comprometidos, haga una bifurcación temporal donde se encuentre (de esta forma la bifurcación temporal tendrá todos los cambios comprometidos que haya realizado en HEAD separado), luego cambie a la bifurcación principal y fusione la bifurcación temporal con la maestra.

git branch  temp
git checkout master
git merge temp

87
2017-08-29 00:39



Esto es lo que acabo de hacer después de darme cuenta de que estaba en una cabeza separada y que ya había hecho algunos cambios.

Yo cometí los cambios.

$ git commit -m "..."
[detached HEAD 1fe56ad] ...

Recordé el hash (1fe56ad) del commit. Luego revisé la rama en la que debería haber estado.

$ git checkout master
Switched to branch 'master'

Finalmente apliqué los cambios del compromiso a la rama.

$ git cherry-pick 1fe56ad
[master 0b05f1e] ...

Creo que esto es un poco más fácil que crear una sucursal temporal.


49
2017-08-02 23:33



Cuando revisa un compromiso específico en git, terminas en una cabeza separada estado ... es decir, su copia de trabajo ya no refleja el estado de una referencia nombrada (como "maestro"). Esto es útil para examinar el estado anterior del repositorio, pero no lo que desea si realmente está tratando de revertir los cambios.

Si ha realizado cambios en un archivo en particular y simplemente quiere descartarlos, puede usar checkout comando como este:

git checkout myfile

Esto descartará cualquier cambio no confirmado y revertirá el archivo al estado que tenga en el encabezado de su rama actual. Si desea descartar los cambios que ya ha cometido, es posible que desee utilizar el reset mando. Por ejemplo, esto restablecerá el repositorio al estado de la confirmación anterior, descartando cualquier cambio posterior:

git reset --hard HEAD^

Sin embargo, si comparte el repositorio con otras personas, git reset puede ser perjudicial (porque borra una parte del historial del repositorio). Si ya ha compartido cambios con otras personas, generalmente desea ver git revert en su lugar, lo que genera un "anticompetito", es decir, crea un nuevo compromiso que "deshace" los cambios en cuestión.

El libro de Git tiene mas detalles


39
2018-04-19 13:32



Si realizó algunos cambios y luego se dio cuenta de que está en una cabeza separada, hay una solución simple para eso: escondite -> maestro de pago -> escondite:

git stash
git checkout master   # Fix the detached head state
git stash pop         # ... or for extra safety use 'stash apply' then later 
                      # after fixing everything do 'stash drop'

Tendrás tus cambios sin compromiso y una CABEZA "adjunta" normal, como si nada hubiera pasado.


37
2018-01-01 22:40



Dado que el "estado de la cabeza separada" lo tiene en una rama temporal, solo use git checkout - que te pone en la última rama en la que estabas.


14
2017-11-20 19:30