Git: Jak wrócić ze stanu „odłączonej HEAD”

218

Jeśli ktoś będzie kasował oddział:

git checkout 760ac7e

np. b9ac70bjak można wrócić do ostatniej znanej głowy, b9ac70bnie znając jej SHA1?

James Raitsev
źródło

Odpowiedzi:

332

Jeśli pamiętasz, który oddział został wcześniej sprawdzony (np. master), Możesz po prostu

git checkout master

wyjść z odłączonego stanu HEAD .

Ogólnie rzecz biorąc: git checkout <branchname>wyciągnie cię z tego.

Jeśli nie pamiętasz ostatniej nazwy oddziału, spróbuj

git checkout -

Spróbuje to również sprawdzić Twój ostatni wyrejestrowany oddział.

eckes
źródło
17
git checkout -- funkcja zabójcy!
dimpiax
1
Jeśli tego nie zrobisz git checkout -b new_branch_name, czy stracisz zobowiązania dokonane w stanie HEAD odłączonym?
jocassid,
2
@jocassid Tak robisz. Są obecni przez chwilę, ale po git gcuruchomieniu są usuwani na zawsze. Możesz je oglądać, git reflogdopóki są tam.
eckes
czy nie stracisz żadnych zmian / zmian dokonanych w odłączonym HEAD, jeśli to zrobisz? Czy to nie jest lepszy sposób? stackoverflow.com/a/61489179/13087176
tipy boopenstein
@ tipsyboopenstein poprawny. jocassid już wspomniał o tym: stackoverflow.com/questions/11801071/...
eckes
16

Posługiwać się git reflog do znajdowania skrótów wcześniej sprawdzonych zatwierdzeń.

Polecenie skrótu, aby dostać się do ostatniej wypisanej gałęzi (nie jestem pewien, czy działa poprawnie z odłączoną HEAD i pośrednimi zatwierdzeniami) to git checkout -

knittl
źródło
4

Miałem ten przypadek krawędzi, w którym sprawdziłem poprzednią wersję kodu, w której moja struktura katalogów plików była inna:

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'

W takim przypadku może być konieczne użycie opcji --force (gdy wiesz, że powrót do pierwotnego oddziału i odrzucenie zmian jest bezpieczną czynnością).

git checkout master nie działał:

$ 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(lub git checkout master -f) pracował:

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
źródło
1

Być może dokonałeś kilku nowych zmian w detached HEADstanie. Wierzę, że jeśli zrobisz tak, jak inne odpowiedzi radzą:

git checkout master
# or
git checkout -

wtedy możesz stracić swoje zobowiązania !! Zamiast tego możesz to zrobić:

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

a następnie połączyć się commits-from-detached-headw dowolną gałąź, aby nie stracić zobowiązań.

tipy boopenstein
źródło