Git: Cómo regresar del estado 'CABEZA separada'

217

Si uno verificara una sucursal:

git checkout 760ac7e

por ejemplo b9ac70b, ¿cómo se puede volver a la última cabeza conocida b9ac70bsin conocer su SHA1?

James Raitsev
fuente

Respuestas:

331

Si recuerda qué sucursal se desprotegió antes (por ejemplo master), simplemente

git checkout master

para salir del estado HEAD separado .

En términos generales: lo git checkout <branchname>sacará de eso.

Si no recuerda el último nombre de la sucursal, intente

git checkout -

Esto también intenta verificar su última sucursal desprotegida.

Eckes
fuente
17
git checkout -- característica asesina!
dimpiax
1
Si no lo git checkout -b new_branch_namehace, ¿pierde los compromisos realizados mientras está en estado HEAD separado?
jocassid
2
@jocassid Sí, lo haces. Están presentes por un tiempo, pero cuando git gcse ejecutan, se eliminan para siempre. Puedes verlos git reflogmientras estén allí.
eckes
¿no perderás ninguna confirmación / cambio que hayas realizado en HEAD separado si haces esto? ¿No es esta una mejor manera? stackoverflow.com/a/61489179/13087176
achispado boopenstein
@tipsyboopenstein correcto. jocassid ya mencionó esto: stackoverflow.com/questions/11801071/…
eckes
16

Úselo git reflogpara encontrar los hashes de confirmaciones previamente verificadas.

Un comando de acceso directo para llegar a su última rama desprotegida (aunque no estoy seguro si funciona correctamente con HEAD separado y confirmaciones intermedias) es git checkout -

knittl
fuente
4

Tuve este caso extremo, donde revisé una versión anterior del código en la que mi estructura de directorio de archivos era diferente:

git checkout 1.87.1                                    
warning: unable to unlink web/sites/default/default.settings.php: Permission denied
... other warnings ...
Note: checking out '1.87.1'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. 
Example:

  git checkout -b <new-branch-name>

HEAD is now at 50a7153d7... Merge branch 'hotfix/1.87.1'

En un caso como este, es posible que necesite usar --force (cuando sabe que volver a la rama original y descartar los cambios es algo seguro).

git checkout master no funcionó:

$ git checkout master
error: The following untracked working tree files would be overwritten by checkout:
web/sites/default/default.settings.php
... other files ...

git checkout master --force(o git checkout master -f) trabajado:

git checkout master -f
Previous HEAD position was 50a7153d7... Merge branch 'hotfix/1.87.1'
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
mcaleaa
fuente
1

Es posible que haya realizado algunos nuevos compromisos en el detached HEADestado. Creo que si haces como otras respuestas aconseja:

git checkout master
# or
git checkout -

entonces puedes perder tus commits !! En cambio, es posible que desee hacer esto:

# you are currently in detached HEAD state
git checkout -b commits-from-detached-head

y luego fusionarse commits-from-detached-headen la rama que desee, para no perder los commits.

Boopenstein borracho
fuente