Saya berakhir dengan kepala yang terpisah hari ini, masalah yang sama seperti yang dijelaskan dalam: git push mengatakan semuanya mutakhir meskipun saya memiliki perubahan lokal
Sejauh yang saya tahu saya tidak melakukan sesuatu yang luar biasa, hanya melakukan dan mendorong dari repo lokal saya.
Jadi bagaimana saya bisa mendapatkan detached HEAD
?
branch-name@{n}
, posisi ke - 9 sebelumnyabranch-name
. Tapi tidak peduli apa, pada titik tertentu pasti adagit checkout <rev>
. Jika itu tidak membunyikan bel, maka mungkin Anda melakukan apa yang disebutkan Will - coba lakukangit checkout <file>
dan berhasil menentukan revisi secara tidak sengaja.git status
:all conflicts fixed: run "git rebase --continue"
git checkout remotes/origin/my-branch
bukangit checkout my-branch
ataugit checkout origin/my-branch
.Jawaban:
Setiap checkout dari komit yang bukan nama salah satu cabang Anda akan membuat Anda HEAD terpisah. A SHA1 yang mewakili ujung cabang masih memberikan KEPALA terpisah. Hanya checkout dari nama cabang lokal yang menghindari mode itu.
Lihat melakukan dengan KEPALA terpisah
Misalnya, jika Anda checkout "cabang jarak jauh" tanpa melacaknya terlebih dahulu, Anda dapat berakhir dengan KEPALA terpisah.
Lihat git: beralih cabang tanpa melepaskan kepala
Dengan Git 2.23 (Agustus 2019), Anda tidak perlu menggunakan perintah yang membingungkan
git checkout
lagi.git switch
juga dapat checkout cabang, dan mendapatkan KEPALA lepas, kecuali:--detach
opsi eksplisitLihat:
Vs. menggunakan
git switch
perintah baru :Jika Anda ingin membuat cabang lokal baru yang melacak cabang jarak jauh:
Tidak salah lagi!
Tidak ada lagi KEPALA terlepas yang tidak diinginkan!
sumber
git commit files creates a new commit containing the contents of the latest commit, plus a snapshot of files taken from the working directory. Additionally, files are copied to the stage.
Apa yang dimaksud dengan "file disalin ke panggung"? Saya pikir file-file tersebut dikomit, yang berarti tahap dihapus?master
beradaed489
pada diagram di atas,git checkout ed489
akan memberi Anda KEPALA terpisah, sementaragit checkout master
tidak."You can think of this as an anonymous branch"
:) Saya suka analoginyaSaya mereproduksi ini barusan secara tidak sengaja:
daftar cabang jarak jauh
Saya ingin checkout secara lokal, jadi saya memotong tempel:
Presto! Keadaan HEAD terlepas
Solusi # 1:
Jangan sertakan
origin/
di bagian depan spek cabang saya saat memeriksa:Solusi # 2:
Tambahkan
-b
parameter yang membuat cabang lokal dari jarak jauhgit checkout -b origin/Feature/f1234
ataugit checkout -b Feature/f1234
itu akan kembali ke asal secara otomatissumber
git checkout -b Feature/f1234
<=>git branch Feature/f1234
dangit checkout Feature/f1234
.origin/branchname
, ia mencariorigin/origin/branchname
tahu bahwa yang pertama adalah nama jarak jauh yang Anda gunakan-b
, jika Anda tidak membuatnya membuatanonymous
cabang yang terlepas. Demikian pula untuk memeriksa dari remote yang berbeda Anda harus menyebutkan-b
parameter jika git tidak memiliki cara untuk mengetahui itu dari remote baru, ia akan mencariorigin/remote/branchname
.mencoba
ini memberi Anda sejarah tentang bagaimana KEPALA dan pointer cabang Anda bergerak di masa lalu.
misalnya:
88ea06b HEAD @ {0}: checkout: pindah dari DEVELOPMENT ke remote / origin / SomeNiceFeature e47bf80 HEAD @ {1}: pull origin DEVELOPMENT: Maju cepat
bagian atas daftar ini adalah satu reasone yang mungkin ditemui kondisi HEAD DETACHED ... memeriksa cabang pelacakan jarak jauh.
sumber
Ini dapat dengan mudah terjadi jika Anda mencoba untuk membatalkan perubahan yang telah Anda lakukan dengan memeriksa kembali file dan tidak mendapatkan sintaks yang tepat.
Anda dapat melihat output dari
git log
- Anda dapat menempelkan ekor log di sini sejak komit terakhir yang berhasil, dan kita semua bisa melihat apa yang Anda lakukan. Atau Anda bisa menempel-bin itu dan bertanya dengan baik di#git
freenode IRC.sumber
Itu bisa terjadi jika Anda memiliki tag yang bernama sama dengan cabang.
Contoh: jika "release / 0.1" adalah nama tag, maka
menghasilkan HEAD terlepas pada "release / 0.1". Jika Anda mengharapkan rilis / 0,1 menjadi nama cabang, maka Anda bingung.
sumber
Detached HEAD
berarti apa yang saat ini diperiksa bukan cabang lokal.Beberapa skenario yang akan menghasilkan
Detached HEAD
keadaan:Jika Anda checkout cabang jauh , katakan
origin/master
. Ini adalah cabang read-only. Jadi, ketika membuat komit dariorigin/master
itu akan mengambang bebas , yaitu tidak terhubung ke cabang apa pun.Jika Anda checkout tag tertentu atau komit . Ketika melakukan komit baru dari sini, itu akan kembali mengambang bebas , yaitu tidak terhubung ke cabang apa pun. Perhatikan bahwa ketika cabang dicentang, komit baru selalu ditempatkan secara otomatis di ujung.
Saat Anda ingin kembali dan checkout komit atau tag tertentu untuk mulai bekerja dari sana, Anda bisa membuat cabang baru yang berasal dari komit itu dan beralih dengan
git checkout -b new_branch_name
. Ini akan mencegahDetached HEAD
negara karena Anda sekarang memiliki cabang diperiksa dan bukan komit.sumber
Cara sederhana yang tidak disengaja adalah dengan melakukan
git checkout head
sebagai salah ketikHEAD
.Coba ini:
pemberian yang mana
sumber
checkout -b
yang terlihat seperti checkout tetapi sebenarnya cabang) tetapi daftar lain hanya disambut.Cara lain untuk masuk dalam kondisi head terpisah git adalah mencoba untuk berkomitmen ke cabang terpencil. Sesuatu seperti:
Perhatikan bahwa jika Anda melakukan ini, upaya lebih lanjut untuk checkout asal / foo akan menjatuhkan Anda kembali ke keadaan kepala terpisah!
Solusinya adalah membuat cabang foo lokal Anda sendiri yang melacak asal / foo, lalu secara opsional dorong.
Ini mungkin tidak ada hubungannya dengan masalah awal Anda, tetapi halaman ini tinggi di google hits untuk "git detached head" dan skenario ini sangat tidak terdokumentasi.
sumber
Saat Anda checkout ke komit
git checkout <commit-hash>
atau ke cabang jarak jauh, KEPALA Anda akan terlepas dan mencoba membuat komit baru di atasnya.Komit yang tidak dapat dijangkau oleh cabang atau tag apa pun akan menjadi sampah yang dikumpulkan dan dihapus dari repositori setelah 30 hari.
Cara lain untuk mengatasi ini adalah dengan membuat cabang baru untuk komit yang baru dibuat dan memeriksa untuk itu.
git checkout -b <branch-name> <commit-hash>
Artikel ini mengilustrasikan bagaimana Anda bisa mendapatkan status HEAD terpisah .
sumber