Git diff taahhüt aralıklarında çift noktalı “..” ve üçlü “…” arasındaki farklar nelerdir?


190

Aşağıdaki komutlar arasındaki farklar nelerdir ?:

git diff foo master   # a 
git diff foo..master  # b
git diff foo...master # c

Diff manuel bundan bahsediyor:

Şubeleri karşılaştırma

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
  1. Konunun ipuçları ve ana dallar arasındaki değişiklikler.
  2. Yukarıdaki ile aynı.
  3. Ana dalda, konu dalının başlatıldığı zamandan bu yana yapılan değişiklikler.

ama bana pek açık değil.


Soru yinelenmese de, bu cevap grafiksel olarak ..ve ...içindeki anlamı git diffve farklı anlamlarını gösterir git log.
Mark Longair

Yanıtlar:


335

Bu görüntüleri zaten oluşturduğumdan, onları başka bir cevapta kullanmaya değer olabileceğini düşündüm, ancak ..(nokta-nokta) ve ...(nokta-nokta-nokta) arasındaki farkın tanımı esasen manojlds cevabı ile aynıdır .

Komut git difftipik olarak yalnızca, komut grafiğinde tam olarak iki nokta arasındaki ağacın durumları arasındaki farkı gösterir. İçindeki ..ve ...gösterimlerinin git diffanlamları:

Git diff için taahhütleri belirtmenin farklı yollarının bir örneği

Başka bir deyişle, git diff foo..bartam olarak aynıdır git diff foo bar; Her iki sana iki dal uçlarına arasındaki farkı gösterecektir foove bar. Öte yandan, git diff foo...barsize iki şube "birleştirme tabanı" ve ucu arasındaki farkı gösterecektir bar. "Birleştirme tabanı" genellikle bu iki dal arasında ortak olan son işlemdir, bu nedenle bu komut size ortalama barolarak yapılan her şeyi yok sayarken çalışmanızın getirdiği değişiklikleri gösterecektir foo.

Hakkında bilmeniz gereken tek şey ..ve ...gösterimler git diff. Ancak...


... burada yaygın bir karışıklık kaynağı, bir komutta kullanıldığında, bir veya daha fazla argüman olarak bir dizi taahhüt beklediği anlamına gelen ..ve ...oldukça farklı şeyler anlamına gelir git log. (Bu komutların tümü git rev-list, argümanlarından bir taahhüt listesini ayrıştırmak için kullanılır .)

Anlamı ..ve ...için git logaşağıda grafik olarak gösterilebilir:

Git günlüğü için taahhüt aralıklarını belirtmenin farklı yollarının bir örneği

Yani, git rev-list foo..barsize dalda barda olmayan her şeyi gösterir foo. Öte yandan, git rev-list foo...bargösteriler size ya tüm kaydedilmesini foo veya bar ancak ikisini birden . Üçüncü diyagram sadece iki dalı listelerseniz, bunlardan birinde veya her ikisinde bulunan taahhütleri aldığınızı gösterir.

Her neyse, biraz kafa karıştırıcı buluyorum ve bence taahhüt grafiği diyagramları yardımcı oluyor :)

Only Yalnızca "tipik" diyorum çünkü birleştirme çakışmalarını çözerken git diffsize üç yönlü birleşme gösterecektir.


1
Diyagramlarınızı seviyorum. Ben de bir süre önce kendime geldim . Kendi git diffdiyagramlarım için daha sonra yapacağım bazı fikirlerim var .

34
Birisi fark etti mi? Etkileri ..ve ...his tersine de git diff(karşılaştırıldığında git rev-list)!
Robert Siemer

2
Beni "Bilmen gereken tek şey bu [...]. Ancak ...". :-) Git, benzer gösterim ve terminolojinin farklı bağlamlarda farklı şeyler ifade ettiği gibi şeylerle doludur; bunu çok iyi açıkladığınız için teşekkürler.
ShreevatsaR

Rev listesinden bahsettiğiniz için teşekkürler. Rev-parse yoluyla rev-list'in yaptıklarını araştırmanın bir yolunu ararken bu soruya rastladım.
Mad Physicist

"Başka bir deyişle, git diff foo..bartam olarak aynı git diff foo bar; her ikisi de size iki dal foo ve bar'ın uçları arasındaki farkı gösterecektir." "İki dalın uçları arasındaki fark" ile tam olarak ne demek istiyorsun?
Asad Moosvi

60

Konsolide versiyonum .. vs ... ile diff vs log

Diff vs Log & .. vs .. Karşılaştırması


3
../ ...stuff ile karıştırılmış çok fazla farklı renk ve set işlemi olmasaydı bu çok iyi olurdu . Örneğin log A...B, komutun kesişimi (diyagramın beyaz kısmı) veya AB birliğinin geri kalanını (yeşil) döndürüp döndürmediği açık değildir. Herhangi bir set operandı olmadan ve sadece 1 renkle daha fazla noktaya gelecektir.
xealits

1
Bu gerçekten olmalı diff A..B<-> log A...B, yani gerçekten yok diff 2 noktalı, tekabül etmek log (!) 3 noktalı? Ya da görüntüde bir yazım hatası var mı? Noktaların nasıl renk kodlu olduğuna baktığımda, bana görüntüde bir yazım hatası var gibi geliyor. Sol alt köşe: log A...Bolmalı log A..B, sağ (?). Ve günlük sadece sağa doğru olmalı ...değil ...
KajMagnus

1
Merhaba DolphinDream, figürünüz için teşekkürler. Burada referans olarak kullanıyorum: gitlab.com/tortoisegit/tortoisegit/issues/3427#note_227200695
Yue Lin Ho

1
@KajMagnus aslında kırmızı / mavi renkler sadece 2 nokta ile 3 nokta arasında ayrım yapmak için kullanılır (fark veya günlük ile kullanılmasına bakılmaksızın). Diyagram doğrudur. İlk sütunda, 2-nokta ile farkın sonucu 3-nokta ile günlüğe benzer (bu nedenle, tüm amaç diyagramı ile başlar). 2 noktalı fark, kod değişikliklerini her iki devirde de ıraksama noktasına (komisyonların etrafındaki yeşil kabarcıklar ve minibüs diyagramlarının yeşil kısımları ile gösterilmiştir) verirken, 3 noktalı log, değişiklik günlüklerini verir (taahhüt mesajları) her iki devirde de ıraksama noktasına iner.
DolphinDream

28

git diff foo master Foo ve master'ın üst (baş) taahhütleri arasındaki fark.

git diff foo..master Aynı şeyi yapmanın başka bir yolu.

git diff foo...master Ortak atadan fark (git merge-base foo masterFoo ve ustanın ) ustanın ucuna fark. Başka bir deyişle, sadece ana dalın foo ile ortak atalarından bu yana getirdiği değişiklikleri gösterir.

Bu örnekGitHub'ın , ikisinin ne zaman kullanılacağını açıklar:

Örneğin, bir 'dev' dalı oluşturup bir dosyaya işlev eklerseniz, 'ana' dalınıza geri dönün ve README'den bir satır kaldırın ve sonra şöyle bir şey çalıştırın:

$ git diff master dev

İlk dosyadan bir işlev eklendiğini ve README'ye bir satır eklendiğini söyleyecektir. Neden? Çünkü dalda, README hala orijinal çizgiye sahip, ancak 'master'da onu kaldırdınız - bu yüzden anlık görüntüleri karşılaştırmak' dev 'eklenmiş gibi görünüyor.

Gerçekten karşılaştırmak istediğiniz şey, dallarınız birbirinden ayrıldığından beri 'dev' ne değişti. Bunu yapmak için Git'in hoş bir küçük stile sahip:

$ git diff master...dev

2
git diff foo ... foo ile ortak ata olduğu için ana dalın tanıttığı değişiklikler
0fnt

@manojlds tamam, çok farklı bir soru, dev dalındaysanız ve değişikliklerinizi (işlev) taahhüt ederseniz ve değişiklikleri uzak bir dev dalına iterseniz, görünür değişiklik sadece işlev veya işlev ve benioku anlamına mı geliyor?
David

Yanılmıyorsam GitHub'ın çekme isteği farkı üçlü noktayı kullanır. Bu doğru mu?
Shaun Luttin

GitHub örnek sayfasına bozuk bağlantı.
K.-Michael Aye

6
git diff foo master

o zaman konu ve ana dal arasındaki farkları gösterecek

git diff foo..master

bu aynı zamanda konu ve ana dal arasındaki zaman içindeki farkları da gösterecektir.

git diff foo...master

bu, konunun daldan ne zaman yapıldığı ve sonrası arasındaki tüm farkları gösterecektir.

bu yüzden ilk 2 komut aynı ve son komut fark geçmişinde daha geniş bir görüş gösteriyor


1

git log ağacı

Üstteki resim alttaki grafik ağacına eşdeğerdir

A0 <- A1 <- A2 <- A3 (master)
   \
    C0 <- C1 (test)

Bir resim bin kelimeye bedeldir, arasındaki fark .. ... ^aşağıda gösterilmiştir.

$ git log master..test
# output C0 C1

$ git log ^master test
# output C0 C1

$ git log master…test
# output A1 A2 A3 C0 C1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.