Git: Cara kembali dari keadaan 'HEAD terlepas'

217

Jika seseorang akan checkout cabang:

git checkout 760ac7e

dari eg b9ac70b, bagaimana kita bisa kembali ke kepala yang terakhir diketahui b9ac70btanpa mengetahui SHA1-nya?

James Raitsev
sumber

Jawaban:

331

Jika Anda ingat cabang mana yang sudah diperiksa sebelumnya (misal master) Anda bisa saja

git checkout master

untuk keluar dari negara KEPALA lepas .

Secara umum: git checkout <branchname>akan membuat Anda keluar dari itu.

Jika Anda tidak ingat nama cabang terakhir, coba

git checkout -

Ini juga mencoba memeriksa cabang terakhir yang Anda periksa.

eek
sumber
17
git checkout -- Fitur pembunuh!
dimpiax
1
Jika Anda tidak melakukan, git checkout -b new_branch_nameapakah Anda kehilangan komitmen yang dibuat saat dalam kondisi HEAD terpisah?
jocassid
2
@ jocassid Ya Anda tahu. Mereka hadir untuk sementara waktu tetapi ketika git gcdijalankan, mereka dihapus selamanya. Anda dapat menontonnya git reflogselama mereka masih di sana.
eckes
tidakkah Anda akan kehilangan komitmen / perubahan yang Anda buat dalam KEPALA terlepas jika Anda melakukan ini? Bukankah ini cara yang lebih baik? stackoverflow.com/a/61489179/13087176
tipsy boopenstein
@tipsyboopenstein benar. jocassid sudah menyebutkan ini: stackoverflow.com/questions/11801071/…
eckes
16

Gunakan git refloguntuk menemukan hash dari commit yang sudah diperiksa sebelumnya.

Perintah pintas untuk sampai ke cabang yang terakhir Anda periksa (tidak yakin apakah ini berfungsi dengan benar dengan HEAD yang terlepas dan komitmen antara) adalah git checkout -

rajutan
sumber
4

Saya memiliki kasus tepi ini, tempat saya memeriksa versi kode sebelumnya di mana struktur direktori file saya berbeda:

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'

Dalam kasus seperti ini, Anda mungkin perlu menggunakan --force (ketika Anda tahu bahwa kembali ke cabang asli dan membuang perubahan adalah hal yang aman untuk dilakukan).

git checkout master tidak bekerja:

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

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

Anda mungkin telah membuat beberapa komitmen baru di detached HEADnegara bagian. Saya percaya jika Anda lakukan sebagai jawaban lain menyarankan:

git checkout master
# or
git checkout -

maka Anda mungkin kehilangan komitmen Anda !! Sebaliknya, Anda mungkin ingin melakukan ini:

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

dan kemudian bergabung commits-from-detached-headke cabang apa pun yang Anda inginkan, sehingga Anda tidak kehilangan komitmen.

boopenstein mabuk
sumber