Apa perbedaan antara titik ganda ".." dan titik tiga "..." dalam rentang komit Git?

Jawaban:

251

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.

Pieter
sumber
31
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:

 diagram "git log A..B"Pohon 1

Ini adalah diagram untuk git log A...B. Perhatikan bahwa komit yang dibagikan oleh kedua cabang tidak dikembalikan oleh perintah:

 diagram "git log A ... B"Pohon 2

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:

$ git log --oneline --decorate --left-right --graph master...origin/master
< 1794bee (HEAD, master) Derp some more
> 6e6ce69 (origin/master, origin/HEAD) Add hello.txt

Dalam output di atas, Anda akan melihat komit yang dimiliki masterdiawali dengan <, sementara komit yang milik origin/masterawalan 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

Komunitas
sumber
35
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.
wejrowski
2
Setidaknya untuk git log. Untuk git diff mungkin semuanya terbalik: stackoverflow.com/questions/7251477/...
Benjamin Atkin