Apa perbedaan antara titik ganda ".." dan titik tiga "..." dalam rentang komit Git?
412
Beberapa perintah Git mengambil rentang komit dan satu sintaks yang valid adalah untuk memisahkan dua nama komit dengan dua titik .., dan sintaks lain menggunakan tiga titik ....
Itu tergantung pada apakah Anda menggunakan logperintah atau diffperintah. Dalam hal logini, ada dalam man git-rev-parsedokumentasi:
Untuk mengecualikan komit yang dapat dijangkau dari komit, notasi awalan digunakan. Misalnya ^ r1 r2 berarti komit yang dapat dijangkau dari r2 tetapi mengecualikan yang dapat dijangkau dari r1.
Operasi set ini sering muncul sehingga ada singkatan untuknya. Ketika Anda memiliki dua commit r1 dan r2 (dinamai sesuai dengan sintaks yang dijelaskan dalam SPESIFIKASI REVISI di atas), Anda dapat meminta komit yang dapat dijangkau dari r2 tidak termasuk komit yang dapat dijangkau dari r1 dengan "^ r1 r2" dan dapat ditulis sebagai "r1..r2".
Notasi serupa "r1 ... r2" disebut selisih simetris r1 dan r2 dan didefinisikan sebagai "r1 r2 --not $ (git merge-base --all r1 r2)". Ini adalah himpunan komit yang dapat dijangkau dari salah satu dari r1 atau r2 tetapi tidak dari keduanya.
Yang pada dasarnya berarti bahwa Anda akan mendapatkan semua komitmen yang ada di salah satu dari dua cabang, tetapi tidak di keduanya.
Dalam hal diffini, ada dalam man git-diffdokumentasi:
git diff [--options] <commit>...<commit> [--] [<path>...]
This form is to view the changes on the branch containing and up to
the second <commit>, starting at a common ancestor of both
<commit>. "git diff A...B" is equivalent to "git diff
$(git-merge-base A B) B". You can omit any one of <commit>, which
has the same effect as using HEAD instead.
Yang agak kabur. Pada dasarnya itu berarti hanya menunjukkan perbedaan di cabang itu dibandingkan dengan cabang lain: mencari komit umum terakhir dengan komite pertama yang Anda berikan, dan kemudian berbeda komit kedua dengan itu. Ini adalah cara mudah untuk melihat perubahan apa yang dibuat di cabang itu, dibandingkan dengan cabang ini, tanpa memperhatikan perubahan di cabang ini saja.
Ini ..agak sederhana: Dalam git-diffkasus ini, itu sama dengan a git diff A Bdan hanya beda A terhadap B. Dalam logkasus ini, itu menunjukkan semua komit yang ada di B tetapi tidak di A.
Sangat konyol bagaimana arti ..dan ...persis ditukar untuk log dan diff: log A..Badalah perubahan dari gabungan basis menjadi B yang diff A...Bartinya
phiresky
1
@phiresky Ya, itu benar-benar kegunaan yang buruk. Saya sarankan untuk tidak menggunakan notasi titik untuk git diff.
wisbucky
2
Apakah ini berarti A...B== A..B + B..A?
Danon
2
@Danon untuk git logini benar-benar ya
maoizm
659
Menggunakan Commit Ranges dengan Git Log
Saat Anda menggunakan rentang komit seperti ..dan ...dengan git log, perbedaan di antara mereka adalah, untuk cabang A dan B,
git log A..B
akan menunjukkan kepada Anda semua komitmen yang B miliki yang tidak dimiliki A , sementara
git log A...B
akan menunjukkan kepada Anda kedua komit yang dimiliki A dan B tidak ada, dan komit bahwa B memiliki komit A, atau dengan kata lain, itu akan menyaring semua komit yang dimiliki A dan B, dengan demikian hanya menunjukkan komitmen yang tidak mereka bagikan .
Visualisasi dengan Diagram Venn & Pohon Komit
Berikut ini adalah representasi visual dari git log A..B. Komit yang berisi cabang B yang tidak ada di A adalah apa yang dikembalikan oleh rentang komit, dan disorot dalam warna merah di diagram Venn, dan dilingkari dengan warna biru di pohon komit:
Ini adalah diagram untuk git log A...B. Perhatikan bahwa komit yang dibagikan oleh kedua cabang tidak dikembalikan oleh perintah:
Membuat Rentang Komit Triple-Dot ...Lebih Berguna
Anda bisa membuat rentang komit tiga-titik ...lebih berguna dalam perintah log dengan menggunakan --left-rightopsi untuk memperlihatkan komit yang dimiliki cabang mana:
Jawaban ini sebenarnya menjelaskan perbedaannya dengan teks, contoh, dan gambar yang ringkas. Saya menyukainya jauh lebih baik daripada jawaban terpilih saat ini yang hanya mengutip dokumentasi yang tidak jelas. (tl; dr, terima kasih atas jawaban ini, saya benar-benar memahami perbedaannya.)
aerique
4
@Cupcake dapatkah Anda menambahkan artinya ... di git diff?
Marius
1
@Marius sebenarnya, sekarang setelah Anda membahasnya, saya akan melanjutkan dan menautkan ke pertanyaan lain dalam jawaban saya, untuk pembaca masa depan seperti Anda.
2
Bukankah ini sebaliknya? dig diff a..b adalah SEMUA diffs, atau pada dasarnya sama dengan git diff a. Sedangkan git dif a ... b adalah HANYA perubahan yang telah dilakukan b sejak bercabang dari a.
Jawaban:
Itu tergantung pada apakah Anda menggunakan
log
perintah ataudiff
perintah. Dalam hallog
ini, ada dalamman git-rev-parse
dokumentasi:Yang pada dasarnya berarti bahwa Anda akan mendapatkan semua komitmen yang ada di salah satu dari dua cabang, tetapi tidak di keduanya.
Dalam hal
diff
ini, ada dalamman git-diff
dokumentasi:Yang agak kabur. Pada dasarnya itu berarti hanya menunjukkan perbedaan di cabang itu dibandingkan dengan cabang lain: mencari komit umum terakhir dengan komite pertama yang Anda berikan, dan kemudian berbeda komit kedua dengan itu. Ini adalah cara mudah untuk melihat perubahan apa yang dibuat di cabang itu, dibandingkan dengan cabang ini, tanpa memperhatikan perubahan di cabang ini saja.
Ini
..
agak sederhana: Dalamgit-diff
kasus ini, itu sama dengan agit diff A B
dan hanya beda A terhadap B. Dalamlog
kasus ini, itu menunjukkan semua komit yang ada di B tetapi tidak di A.sumber
..
dan...
persis ditukar untuk log dan diff:log A..B
adalah perubahan dari gabungan basis menjadi B yangdiff A...B
artinyagit diff
.A...B
==A..B + B..A
?git log
ini benar-benar yaMenggunakan Commit Ranges dengan Git Log
Saat Anda menggunakan rentang komit seperti
..
dan...
dengangit log
, perbedaan di antara mereka adalah, untuk cabang A dan B,akan menunjukkan kepada Anda semua komitmen yang B miliki yang tidak dimiliki A , sementara
akan menunjukkan kepada Anda kedua komit yang dimiliki A dan B tidak ada, dan komit bahwa B memiliki komit A, atau dengan kata lain, itu akan menyaring semua komit yang dimiliki A dan B, dengan demikian hanya menunjukkan komitmen yang tidak mereka bagikan .
Visualisasi dengan Diagram Venn & Pohon Komit
Berikut ini adalah representasi visual dari
git log A..B
. Komit yang berisi cabang B yang tidak ada di A adalah apa yang dikembalikan oleh rentang komit, dan disorot dalam warna merah di diagram Venn, dan dilingkari dengan warna biru di pohon komit:Ini adalah diagram untuk
git log A...B
. Perhatikan bahwa komit yang dibagikan oleh kedua cabang tidak dikembalikan oleh perintah:Membuat Rentang Komit Triple-Dot
...
Lebih BergunaAnda bisa membuat rentang komit tiga-titik
...
lebih berguna dalam perintah log dengan menggunakan--left-right
opsi untuk memperlihatkan komit yang dimiliki cabang mana:Dalam output di atas, Anda akan melihat komit yang dimiliki
master
diawali dengan<
, sementara komit yang milikorigin/master
awalan dengan>
.Menggunakan Commit Ranges dengan Git Diff
Suatu hari saya mungkin menambahkan penjelasan saya sendiri tentang bagaimana rentang komit bekerja dengan
git diff
, tetapi untuk sekarang, Anda mungkin ingin memeriksa Apa perbedaan antara titik-ganda ".." dan titik-tiga "..." di Git diff commit rentang? .Lihat juga
sumber