KEPALA dan ORIG_HEAD di Git

252

Apa yang dimaksud dengan simbol-simbol ini dan apa artinya?

(Saya tidak dapat menemukan penjelasan dalam dokumentasi resmi)

collimarco
sumber
4
Catatan: HEADsekarang (git1.8.4 mendatang) ' @'! Lihat jawaban saya yang diedit di bawah ini
VonC
Catatan-bis: ' @' (untuk HEAD) masih akan datang, tetapi tidak untuk 1,8,4 jawaban diedit dan diubah .
VonC
1
Catatan ter: ' @' untuk HEADkembali untuk git 1.8.5 / 1.9. jawabannya diedit lagi .
VonC
21
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).

Untuk informasi lebih lanjut baca git (1) manual , Manual Pengguna Git , Buku Komunitas Git dan Glosarium Git

Jakub Narębski
sumber
2
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).
dahlbyk
104

Dari git reset

"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'.


Catatan: dari sini

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) memperkenalkan memperkenalkan 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 @".

Lihat komit cdfd948

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.


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 untuk HEAD"

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.

VONC
sumber
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.
VonC
1
@VonC @alias untuk HEADsedang dikembalikan (sementara?) Untuk rilis Git 1.8.4 ! Itu baru saja diumumkan hari ini!
Menikmati komentar "mengepalai"!
Robino
2

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.

yimous
sumber
4
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.

Nathan Chappell
sumber