Ketika saya menentukan objek commit leluhur di Git, saya bingung antara HEAD^
dan HEAD~
.
Keduanya memiliki versi "bernomor" seperti HEAD^3
dan HEAD~2
.
Mereka tampak sangat mirip atau sama dengan saya, tetapi apakah ada perbedaan antara tilde dan caret?
Jawaban:
Aturan praktis
~
sebagian besar waktu - untuk kembali ke beberapa generasi, biasanya apa yang Anda inginkan^
komitmen gabungan - karena mereka memiliki dua orang tua (langsung) atau lebihIlmu tentang cara menghafal:
~
hampir linear dalam penampilan dan ingin mundur dalam garis lurus^
menyarankan segmen yang menarik dari pohon atau garpu di jalanTilde
Bagian “Menentukan Revisi” dari
git rev-parse
dokumentasi ini didefinisikan~
sebagaiAnda dapat menjangkau orang tua dari komitmen apa pun, bukan hanya
HEAD
. Anda juga dapat bergerak turun-temurun: misalnya,master~2
berarti kakek dari ujung cabang master, lebih menyukai orangtua pertama yang menggabungkan komitmen.Tanda sisipan
Sejarah Git adalah nonlinier: grafik asiklik terarah (DAG) atau pohon. Untuk komit dengan hanya satu orangtua,
rev~
danrev^
berarti hal yang sama. Selektor tanda kuret menjadi berguna dengan menggabungkan komitmen karena masing-masing adalah anak dari dua atau lebih orang tua - dan bahasa yang dipinjam dari biologi.HEAD^
berarti induk langsung pertama dari ujung cabang saat ini.HEAD^
kependekan dariHEAD^1
, dan Anda juga bisa mengatasinyaHEAD^2
dan seterusnya sesuai kebutuhan. Bagian yang sama darigit rev-parse
dokumentasi mendefinisikannya sebagaiContohnya
Penentu atau penyeleksi ini dapat dirantai secara sewenang-wenang, misalnya ,
topic~3^2
dalam bahasa Inggris adalah induk kedua dari komit gabungan yang merupakan kakek-nenek buyut (tiga generasi ke belakang) dari ujung cabang saat initopic
.Bagian
git rev-parse
dokumentasi yang disebutkan di atas melacak banyak jalur melalui sejarah git nosional. Waktu mengalir secara umum ke bawah. Komit D, F, B, dan A adalah gabungan komit.Jalankan kode di bawah ini untuk membuat repositori git yang sejarahnya cocok dengan ilustrasi yang dikutip.
Itu menambahkan alias di repo sekali pakai baru hanya untuk
git lol
dangit lola
sehingga Anda dapat melihat riwayat seperti diPerhatikan bahwa pada mesin Anda, nama objek SHA-1 akan berbeda dari yang di atas, tetapi tag memungkinkan Anda untuk mengatasi komit dengan nama dan memeriksa pemahaman Anda.
The “Menentukan Revisi” di
git rev-parse
dokumentasi penuh dengan informasi yang besar dan bernilai dibaca mendalam. Lihat juga Alat Git - Pilihan Revisi dari buku Pro Git .Perintah Orangtua Berkomitmen
Komit 89e4fcb0dd dari sejarah git sendiri adalah gabungan komit, seperti yang
git show 89e4fcb0dd
ditunjukkan dengan baris header Gabung yang menampilkan nama objek leluhur langsung.Kami dapat mengonfirmasi pemesanan dengan meminta
git rev-parse
menunjukkan orang tua langsung 89e4fcb0dd secara berurutan.Meminta orang tua keempat yang tidak ada menghasilkan kesalahan.
Jika Anda ingin mengekstrak orang tua saja, gunakan format cantik
%P
untuk hash lengkapatau
%p
untuk orang tua pendek.sumber
^^^^^^^
bukan~7
? Itu sebabnya~
bergunaPerbedaan antara
HEAD^
danHEAD~
dijelaskan dengan baik oleh ilustrasi (oleh Jon Loeliger) ditemukan di http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html .Dokumentasi ini bisa sedikit tidak jelas bagi pemula jadi saya telah mereproduksi ilustrasi di bawah ini:
sumber
F = A^2^
,.^ == ^1 == LEFTMOST PARENT
,^2 == SECOND LEFTMOST PARENT
dan sebagainya. Dan~ == ~1 == LEFTMOST PARENT
,~2 == LEFTMOST PARENTS LEFTMOST PARENT == LEFTMOST GRANDPARENT
. Dengan ekstensi,~2^2 == LEFTMOST GRANDPARENTS SECOND LEFTMOST PARENT
Keduanya
~
dan^
sendiri mengacu pada orang tua dari komit (~~
dan^^
keduanya merujuk pada komit kakek-nenek, dll.) Tetapi mereka berbeda artinya ketika mereka digunakan dengan angka:~2
berarti naik dua tingkat dalam hierarki , melalui induk pertama jika komit memiliki lebih dari satu orangtua^2
berarti induk kedua di mana komit memiliki lebih dari satu orangtua (yaitu karena gabungan)Ini dapat digabungkan, jadi itu
HEAD~2^3
berartiHEAD
komit ketiga kakek nenek.sumber
^^
itu sama^2
tetapi tidak.Dua sen saya ...
sumber
H=A~2^2
tidakH=A~2^1
?A
,B
,D
,G
berada di cabang yang sama dan komitD
adalah gabungan dariG
danH
, oleh karena itu memiliki dua orang tua. Jadi komit (H
) dari cabang lain adalah referensi oleh^2
.Berikut ini penjelasan yang sangat baik yang diambil secara verbatim dari http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde :
sumber
The
^<n>
Format memungkinkan Anda untuk memilih orang tua n dari komit (relevan dalam penggabungan). The~<n>
Format memungkinkan Anda untuk memilih n nenek moyang komit, selalu mengikuti orangtua pertama. Lihat dokumentasi git-rev-parse untuk beberapa contoh.sumber
Perlu dicatat bahwa git juga memiliki sintaks untuk melacak "dari-mana-Anda-datang" / "ingin-untuk-kembali-sekarang" - misalnya,
HEAD@{1}
akan merujuk tempat dari mana Anda melompat ke lokasi komit baru.Pada dasarnya
HEAD@{}
variabel menangkap sejarah pergerakan HEAD, dan Anda dapat memutuskan untuk menggunakan head tertentu dengan melihat reflog git menggunakan perintahgit reflog
.Contoh:
Contohnya adalah saya melakukan local-commit a-> b-> c-> d dan kemudian saya kembali membuang 2 commit untuk memeriksa kode saya -
git reset HEAD~2
- dan kemudian setelah itu saya ingin memindahkan HEAD saya kembali ke d -git reset HEAD@{1}
.sumber
Secara sederhana :
~
menentukan leluhur^
menentukan orang tuaAnda dapat menentukan satu atau beberapa cabang saat penggabungan. Kemudian komit memiliki dua atau lebih orangtua dan kemudian
^
berguna untuk menunjukkan orang tua.Misalkan Anda berada di cabang A dan Anda memiliki dua cabang lagi: B dan C .
Di setiap cabang, tiga komitmen terakhir adalah:
Jika sekarang di cabang A Anda menjalankan perintah:
maka Anda menggabungkan tiga cabang bersama (di sini gabungan Anda memiliki tiga orang tua)
dan
~
menunjukkan leluhur ke-9 di cabang pertama, jadiHEAD~
menunjukkan A3HEAD~2
menunjukkan A2HEAD~3
menunjukkan A1^
menunjukkan induk ke-n, jadiHEAD^
menunjukkan A3HEAD^2
menunjukkan B3HEAD^3
menunjukkan C3Penggunaan selanjutnya dari
~
atau^
samping satu sama lain adalah dalam konteks komit yang ditunjuk oleh karakter sebelumnya.Perhatikan 1 :
HEAD~3
selalu sama dengan:HEAD~~~
dan untuk:HEAD^^^
(setiap menunjukkan A1 ),dan umumnya :
HEAD~n
selalu sama dengan:HEAD~...~
( n kali~
) dan untuk:HEAD^...^
( n kali^
).Pemberitahuan 2 :
HEAD^3
adalah tidak sama denganHEAD^^^
(yang pertama menunjukkan C3 dan yang kedua menunjukkan A1 ),dan umumnya :
HEAD^1
sama denganHEAD^
,HEAD^n
selalu tidak sama denganHEAD^...^
( n kali~
).sumber
TLDR
~ adalah apa yang paling Anda inginkan, itu merujuk komit masa lalu ke cabang saat ini
^ referensi orang tua (git-merge menciptakan orangtua kedua atau lebih)
A ~ selalu sama dengan A ^
A ~~ selalu sama dengan A ^^, dan seterusnya
A ~ 2 tidak sama dengan A ^ 2,
karena ~ 2 adalah singkatan untuk ~~
sedangkan ^ 2 tidak singkatan untuk apa pun, itu artinya orangtua kedua
sumber
HEAD ^^^ sama dengan HEAD ~ 3, memilih komit ketiga sebelum HEAD
KEPALA ^ 2 menentukan kepala kedua dalam komit gabungan
sumber
KEPALA ~ menentukan orang tua pertama pada "cabang"
HEAD ^ memungkinkan Anda untuk memilih induk spesifik dari komit
Sebuah contoh:
Jika Anda ingin mengikuti cabang samping, Anda harus menentukan sesuatu seperti
sumber
contoh aktual perbedaan antara HEAD ~ dan HEAD ^
sumber
Sederhananya, untuk level pertama dari keturunan (keturunan, warisan, garis keturunan, dll.) KEPALA ^ dan KEPALA ~ keduanya menunjuk ke komit yang sama, yaitu (terletak) satu orangtua di atas KEPALA (komit).
Selanjutnya, KEPALA ^ = KEPALA ^ 1 = KEPALA ~ = KEPALA ~ 1. Tapi KEPALA ^^! = KEPALA ^ 2! = KEPALA ~ 2. Namun KEPALA ^^ = KEPALA ~ 2. Baca terus.
Di luar tingkat pertama dari keturunan, hal menjadi lebih rumit, terutama jika cabang kerja / cabang master telah memiliki penggabungan (dari cabang lain). Ada juga masalah sintaksis dengan tanda sisipan, KEPALA ^^ = KEPALA ~ 2 (mereka setara) TETAPI KEPALA ^^! = KEPALA ^ 2 (mereka dua hal yang berbeda sama sekali).
Setiap / tanda sisipan mengacu pada orang tua pertama KEPALA, oleh karena itulah tanda kurung yang dirangkai sama dengan ekspresi tilde, karena mereka mengacu pada orang tua pertama orang tua (orang tua pertama), dll., Dll. Berdasarkan ketat pada nomor pada carets yang terhubung atau pada nomor yang mengikuti tilde (keduanya, keduanya berarti hal yang sama), yaitu tetap dengan orangtua pertama dan naik x generasi.
KEPALA ~ 2 (atau KEPALA ^^) mengacu pada komit yang merupakan dua tingkat leluhur di atas / di atas komit saat ini (KEPALA) dalam hierarki, yang berarti komit kakek nenek HEAD.
KEPALA ^ 2, di sisi lain, TIDAK mengacu pada komit orang tua kedua dari orang tua pertama, tetapi hanya untuk komit orang tua kedua. Itu karena tanda sisipan berarti induk dari komit, dan angka berikut menandakan yang / apa yang dilakukan orangtua komit (orangtua pertama, dalam kasus ketika tanda sisipan tidak diikuti oleh angka [karena itu adalah singkatan untuk nomor menjadi 1, artinya orang tua pertama]). Berbeda dengan tanda sisipan, angka yang mengikutinya tidak menyiratkan tingkat hierarki lain ke atas, tetapi lebih menyiratkan berapa banyak level menyamping, ke dalam hierarki, seseorang harus mencari orang tua yang benar (komit). Berbeda dengan angka dalam ekspresi tilde, itu hanya satu induk di hierarki, terlepas dari nomor (segera) melanjutkan tanda sisipan. Alih-alih ke atas, tanda sisipan '
Jadi KEPALA ^ 3 sama dengan orang tua ketiga dari komit KEPALA (BUKAN kakek buyut, yang adalah KEPALA ^^^ DAN KEPALA ~ 3 akan menjadi ...).
sumber
~
ini berarti orang tua.^
jika memiliki orang tua dari dua atau lebih, seperti menggabungkan komit, kita dapat memilih yang kedua dari orang tua atau yang lain.jadi jika hanya satu hal seperti (HEAD ~ atau HEAD ^), ia memiliki hasil yang sama .
sumber