HEADdan ORIG_HEADdi Git seperti $PWDdan $OLDPWDdi Bash. :)
musiphil
Jawaban:
325
HEADadalah referensi (langsung atau tidak langsung, yaitu simbolik) untuk komit saat ini. Ini adalah komit yang telah Anda periksa di direktori kerja (kecuali jika Anda membuat beberapa perubahan, atau yang setara), dan itu adalah komit yang di atasnya "git commit" akan membuat yang baru. Biasanya HEADreferensi simbolis ke beberapa cabang bernama lain; cabang ini sedang diperiksa cabang, atau cabang saat ini. HEADjuga dapat menunjuk langsung ke sebuah komit; keadaan ini disebut "KEPALA terlepas", dan dapat dipahami sebagai cabang tanpa nama, anonim.
Dan @sendirian adalah jalan pintas untuk HEAD, karena Git 1.8.5
ORIG_HEADadalah kondisi sebelumnya HEAD, yang diatur oleh perintah yang mungkin memiliki perilaku berbahaya, agar mudah dipulihkan. Ini kurang berguna sekarang karena Git memiliki reflog: HEAD@{1}kira-kira setara dengan ORIG_HEAD( HEAD@{1}selalu nilai terakhir HEAD, ORIG_HEADadalah nilai terakhir HEADsebelum operasi berbahaya).
Hai Jakub. +1 untuk penjelasannya. Bisakah Anda merinci bagian "kira-kira setara" dari HEAD @ {1}? Saya merujuk jawaban saya ke utas thread.gmane.org/gmane.comp.version-control.git/38379 (Anda berada di dalamnya, kembali pada bulan Februari 2007), dan saya tidak benar-benar memahami diskusi yang kalian lakukan di sekitar sintaks @ {...}.
VonC
19
ORIG_HEAD diatur (saya pikir) hanya dengan perintah 'berbahaya', yang menggerakkan HEAD lebih dari satu komit. Jadi ORIG_HEAD tidak selalu disetel, sementara HEAD @ {1} selalu disetel. @ {1} adalah $ (git symbolic-ref HEAD) @ {1}, yaitu ia menggunakan reflog untuk cabang saat ini, bukan reflog HEAD.
Jakub Narębski
Riiight ... Saya mengerti sekarang :) Terima kasih atas klarifikasi itu. Betapapun nilainya, saya meningkatkan komentar Anda juga!
VonC
1
"dan KEPALA adalah komit yang di atasnya" git commit "akan membuat yang baru." - bagus untuk diingat, terima kasih! Juga dari @VonC, 'Ini adalah komit "git commit" dibangun di atas, dan "git diff --cached" dan "git status" dibandingkan dengan.'
Minqi Pan
1
revisi bantuan git memunculkan git-scm.com/docs/gitrevisions , yang menjelaskan semua cara untuk merujuk komit (termasuk HEADdan ORIG_HEAD).
"tarik" atau "gabungkan" selalu meninggalkan ujung asli dari cabang saat ini ORIG_HEAD.
git reset --hard ORIG_HEAD
Menyetel ulang dengan keras akan mengembalikan file indeks dan pohon kerja Anda ke status itu, dan mengatur ulang ujung cabang ke komit itu.
git reset --merge ORIG_HEAD
Setelah memeriksa hasil penggabungan, Anda mungkin menemukan bahwa perubahan di cabang lain tidak memuaskan. Menjalankan " git reset --hard ORIG_HEAD" akan membuat Anda kembali ke tempat Anda sebelumnya, tetapi itu akan membuang perubahan lokal Anda, yang tidak Anda inginkan. " git reset --merge" simpan perubahan lokal Anda.
Sebelum tambalan diterapkan, ORIG_HEAD disetel ke ujung cabang saat ini.
Ini berguna jika Anda memiliki masalah dengan banyak komit, seperti menjalankan ' git am' pada cabang yang salah atau kesalahan dalam komit yang lebih mudah diperbaiki dengan mengubah kotak surat (mis. + Kesalahan pada baris "Dari:").
Selain itu, gabungan selalu menyetel ' .git/ORIG_HEAD' ke status asli HEAD sehingga gabungan yang bermasalah dapat dihapus dengan menggunakan ' git reset ORIG_HEAD'.
KEPALA adalah pointer yang bergerak. Terkadang itu berarti cabang saat ini, kadang tidak.
Jadi HEAD BUKAN sinonim untuk "cabang saat ini" di mana-mana sudah.
KEPALA berarti "arus" di mana-mana di git, tetapi itu tidak harus berarti "cabang saat ini" (yaitu KEPALA terlepas).
Tetapi hampir selalu berarti "komit saat ini".
Ini adalah komit yang " git commit" dibangun di atas, dan " git diff --cached" dan " git status" dibandingkan.
Ini berarti cabang saat ini hanya dalam konteks yang sangat terbatas (tepatnya ketika kami ingin nama cabang untuk beroperasi --- mengatur ulang dan menumbuhkan ujung cabang melalui komit / rebase / dll.).
Reflog adalah kendaraan untuk kembali ke masa dan mesin waktu memiliki interaksi yang menarik dengan gagasan "saat ini".
HEAD@{5.minutes.ago}bisa berarti "dereference HEAD symref untuk mengetahui cabang apa yang kita miliki sekarang, dan kemudian cari tahu di mana ujung cabang itu 5 menit yang lalu".
Atau itu bisa berarti "apa komit saya akan disebut sebagai KEPALA 5 menit yang lalu, misalnya jika saya melakukan" git show KEPALA "saat itu".
git1.8.4 (Juli 2013)memperkenalkanmemperkenalkan notasi baru!
(sebenarnya, untuk 1.8.5 atau 1.9, Q4 2013: diperkenalkan kembali dengan commit 9ba89f4 )
Daripada mengetik empat huruf kapital " HEAD", Anda bisa mengatakan " @" sekarang,
mis. " git log @".
Mengetik ' HEAD' membosankan, terutama saat kita bisa menggunakan ' @' sebagai gantinya.
Alasan untuk memilih ' @' adalah karena mengikuti secara alami dari ref@opsintaks (misalnya HEAD@{u}), kecuali kita tidak memiliki ref, dan tidak ada operasi, dan ketika kita tidak memiliki itu, masuk akal untuk mengasumsikan ' HEAD'.
Jadi sekarang kita bisa menggunakan ' git show @~1', dan semua kebaikan itu.
Sampai sekarang ' @' adalah nama yang valid, tetapi bertentangan dengan ide ini, jadi mari kita buat itu tidak valid. Mungkin sangat sedikit orang, jika ada, yang menggunakan nama ini.
Ini mengembalikan komit cdfd948 , karena tidak hanya berlaku untuk " @" (dan bentuk dengan pengubah seperti @{u}diterapkan pada itu), tetapi juga mempengaruhi misalnya " refs/heads/@/foo", yang seharusnya tidak.
Gagasan dasar untuk memberikan bantuan mungkin bagus, dan topik tersebut dapat dicoba lagi nanti, tetapi mari kembali untuk menghindari memengaruhi kasus penggunaan yang ada untuk saat ini untuk rilis mendatang.
Setelah menjalankan git, reset ORIG_HEAD dan komit. ORIG_HEAD masih ada di bawah Referensi di sebelah HEAD. Mengapa itu tidak dihapus dari tampilan?
powder366
@ powder366 tetapi git resetakan menghasilkan a ORIG_HEAD. Jadi, Anda perlu melakukannya rmsecara manual. Lihat stackoverflow.com/a/12418078/6309 misalnya.
Pemahaman saya adalah bahwa HEAD menunjukkan cabang saat ini, sementara ORIG_HEAD digunakan untuk menyimpan HEAD sebelumnya sebelum melakukan operasi "berbahaya".
Misalnya git-rebase dan git-am merekam ujung cabang asli sebelum mereka menerapkan perubahan apa pun.
KEPALA tidak selalu menunjuk pada cabang saat ini (dapat dilepaskan)
VonC
1
Jadi apa "cabang saat ini" ketika KEPALA "terlepas?"
cjs
@ CurtJ.Sampson Itu adalah "no branch". itulah sebabnya ketika Anda berada di kepala yang terpisah, Anda melakukannya git branch foo -buntuk "membuat" cabang untuk anak yatim yang melakukan.
Royi Namir
1
Dari man 7 gitrevisions:
HEAD memberi nama komit tempat Anda mendasarkan perubahan di pohon kerja. FETCH_HEAD mencatat cabang yang Anda ambil dari repositori jarak jauh dengan doa git fetch terakhir. ORIG_HEAD dibuat oleh perintah yang menggerakkan HEAD Anda dengan cara yang drastis, untuk merekam posisi HEAD sebelum operasi mereka, sehingga Anda dapat dengan mudah mengubah ujung cabang kembali ke status sebelum Anda menjalankannya. MERGE_HEAD mencatat komit yang Anda gabungkan ke cabang Anda saat Anda menjalankan git merge. CHERRY_PICK_HEAD mencatat komit yang Anda pilih ketika Anda menjalankan git-pick.
HEAD
sekarang (git1.8.4 mendatang) '@
'! Lihat jawaban saya yang diedit di bawah ini@
' (untukHEAD
) masih akan datang, tetapi tidak untuk 1,8,4 jawaban diedit dan diubah .@
' untukHEAD
kembali untuk git 1.8.5 / 1.9. jawabannya diedit lagi .HEAD
danORIG_HEAD
di Git seperti$PWD
dan$OLDPWD
di Bash. :)Jawaban:
HEAD
adalah referensi (langsung atau tidak langsung, yaitu simbolik) untuk komit saat ini. Ini adalah komit yang telah Anda periksa di direktori kerja (kecuali jika Anda membuat beberapa perubahan, atau yang setara), dan itu adalah komit yang di atasnya "git commit" akan membuat yang baru. BiasanyaHEAD
referensi simbolis ke beberapa cabang bernama lain; cabang ini sedang diperiksa cabang, atau cabang saat ini.HEAD
juga dapat menunjuk langsung ke sebuah komit; keadaan ini disebut "KEPALA terlepas", dan dapat dipahami sebagai cabang tanpa nama, anonim.Dan
@
sendirian adalah jalan pintas untukHEAD
, karena Git 1.8.5ORIG_HEAD
adalah kondisi sebelumnyaHEAD
, yang diatur oleh perintah yang mungkin memiliki perilaku berbahaya, agar mudah dipulihkan. Ini kurang berguna sekarang karena Git memiliki reflog:HEAD@{1}
kira-kira setara denganORIG_HEAD
(HEAD@{1}
selalu nilai terakhirHEAD
,ORIG_HEAD
adalah nilai terakhirHEAD
sebelum operasi berbahaya).Untuk informasi lebih lanjut baca git (1) manual , Manual Pengguna Git , Buku Komunitas Git dan Glosarium Git
sumber
HEAD
danORIG_HEAD
).Dari git reset
Catatan: dari sini
git1.8.4 (Juli 2013)
memperkenalkanmemperkenalkan notasi baru!(sebenarnya, untuk 1.8.5 atau 1.9, Q4 2013: diperkenalkan kembali dengan commit 9ba89f4 )
Lihat komit cdfd948
Sebuah posting blog selama periode 1.8.4-rc3 (14 Agustus 2013) mengumumkan bahwa fitur ini dikembalikan dan ditunda (Terima kasih Cupcake untuk informasi lebih lanjut ).
Sekali lagi, ini diperkenalkan lagi dengan komit 9ba89f4 (September 2013).
Lihat komit 2c2b664 :
Kembalikan "Tambahkan
@
pintasan baru untukHEAD
"sumber
git reset
akan menghasilkan aORIG_HEAD
. Jadi, Anda perlu melakukannyarm
secara manual. Lihat stackoverflow.com/a/12418078/6309 misalnya.@
alias untukHEAD
sedang dikembalikan (sementara?) Untuk rilis Git 1.8.4 ! Itu baru saja diumumkan hari ini!Pemahaman saya adalah bahwa HEAD menunjukkan cabang saat ini, sementara ORIG_HEAD digunakan untuk menyimpan HEAD sebelumnya sebelum melakukan operasi "berbahaya".
Misalnya git-rebase dan git-am merekam ujung cabang asli sebelum mereka menerapkan perubahan apa pun.
sumber
git branch foo -b
untuk "membuat" cabang untuk anak yatim yang melakukan.Dari
man 7 gitrevisions
:sumber