Git: Como retornar do estado 'desanexado HEAD'

217

Se alguém compraria uma filial:

git checkout 760ac7e

por exemplo b9ac70b, como se pode voltar à última cabeça conhecida b9ac70bsem conhecer seu SHA1?

James Raitsev
fonte

Respostas:

331

Se você se lembrar de qual ramo foi retirado antes (por exemplo master), você pode simplesmente

git checkout master

para sair do estado HEAD desanexado .

De um modo geral: git checkout <branchname>você ficará fora disso.

Se você não se lembra do último nome do ramo, tente

git checkout -

Isso também tenta verificar sua última ramificação com check-out.

eckes
fonte
17
git checkout -- recurso matador!
dimpiax
1
Se você não fizer git checkout -b new_branch_nameisso, perde os commits feitos enquanto no estado HEAD desanexado?
Jocassid
2
@jocassid Sim, você faz. Eles estão presentes por um tempo, mas quando git gcsão executados, eles são removidos para sempre. Você pode assisti-los git reflogenquanto eles ainda estiverem lá.
Eckes
você não perderá nenhuma confirmação / alteração feita no HEAD desanexado se fizer isso? Não é este o melhor caminho? stackoverflow.com/a/61489179/13087176
tipsy boopenstein
@tipsyboopenstein correto. jocassid já mencionou isso: stackoverflow.com/questions/11801071/…
eckes 28/04
16

Use git reflogpara encontrar os hashes de confirmações enviadas anteriormente.

Um comando de atalho para chegar à sua última ramificação com check-out (embora não esteja certo se isso funciona corretamente com HEAD desanexado e confirmações intermediárias) é git checkout -

knittl
fonte
4

Eu tive esse caso extremo, em que verifiquei uma versão anterior do código na qual minha estrutura de diretório de arquivos 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'

Em um caso como esse, pode ser necessário usar --force (quando você sabe que voltar ao ramo original e descartar mudanças é uma coisa segura a se fazer).

git checkout master não funcionou:

$ 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(ou git checkout master -f) trabalhou:

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
fonte
1

Você pode ter feito alguns novos commit no detached HEADestado. Eu acredito que se você fizer como outras respostas aconselhar:

git checkout master
# or
git checkout -

então você pode perder seus commits !! Em vez disso, você pode fazer o seguinte:

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

e, em seguida, junte commits-from-detached-head- se ao ramo que desejar, para não perder os commits.

embriagado boopenstein
fonte