İki farklı şubeden dosyalar nasıl karşılaştırılır?


1537

Bir dalda iyi çalışan ve başka bir kırık bir komut dosyası var. İki versiyona yan yana bakmak ve neyin farklı olduğunu görmek istiyorum. Bunu yapmanın herhangi bir yolu var mı?

Açıkçası bir karşılaştırma aracı aramıyorum (Karşılaştırmanın Ötesinde kullanıyorum). Ne değiştiğini görmek için benim ana şube sürümü ile ana sürümünü karşılaştırmak sağlayacak bir git diff komutu arıyorum. Bir birleşme veya başka bir şeyin ortasında değilim. Sadece şöyle bir şey söylemek istiyorum

git diff mybranch/myfile.cs master/myfile.cs

Yanıtlar:


2208

git diff size iki taahhüt arasındaki farkı gösterebilir:

git diff mybranch master -- myfile.cs

Veya eşdeğer olarak:

git diff mybranch..master -- myfile.cs

Her iki tarafında ise, ikinci sözdizimi kullanılarak HEADbu ihmal edilebilir (örneğin master..karşılaştırır masteriçin HEAD).

Ayrıca ilginizi çekebilir mybranch...master( git diffdokümanlardan ):

Bu form, <commit>her ikisinin ortak atalarından başlayarak daldaki ve ikinciye kadar olan değişiklikleri görüntülemek içindir <commit>. git diff A...Beşittir git diff $(git-merge-base A B) B.

Başka bir deyişle, bu masterayrıştığından beri farklı değişiklikler verecektir mybranch(ancak o zamandan beri yeni değişiklikler olmadan mybranch).


Her durumda, --dosya adından önceki ayırıcı, komut satırı bayraklarının sonunu gösterir. Eğer argüman bir taahhüt veya dosyaya atıfta bulunursa, ancak dahil edilmesi kötü bir alışkanlık değilse, Git karışmazsa bu isteğe bağlıdır. Birkaç örnek için bkz. Https://stackoverflow.com/a/13321491/54249 .


git difftoolEğer yapılandırılmış bir tane varsa , aynı argümanlar iletilebilir .


44
Ve karşılaştırmak istediğiniz iki sürümden hiçbiri çalışma ağacı değilse, kullanabilirsiniz git diff branch1 branch2 myfile.cs. ( --Artık gerekli olmamalıdır, çünkü yalnızca iki düzeltme argümanı alabilir.)
Cascabel

8
Bunun her versiyonunu denedim ve hiçbir şey olmuyor. Benim difftool yapılandırılmış var (birleştirme için çalışır). Bd.ps1 adlı bir dosyam var. Yazdığım komutun her sürümü hiçbir şey yapmaz. Bir errer bile vermez. WTH!?!?!
Micah

3
@Micah: Bunu düz farkla mı deniyorsunuz? Geçerli dizine göre yolu doğru yazıyor musunuz? (Dosya mevcut değilse sessizce hiçbir fark göstermez --ve yapmak için . Ortak ve kolay hatayı kullanırsınız.)
Cascabel

5
Dosyanın tam yolunu gösterildiği gibi eklemedikçe bu benim için işe yaramadı git diff --name-status branch1..branch2(muhtemelen açık, ancak başka birinin yaptığım aynı soruna sahip olması durumunda söz edeceğimi düşündüm).
hBrent

4
Mybranch ve master'ın sırası da önemlidir. İlk daldaki dosya '-' önekleriyle, ikinci daldaki dosya '+' önekleriyle gösterilir.
timbo

414

Bunu yapabilirsiniz: git diff branch1:path/to/file branch2:path/to/file

Diftool yapılandırdıysanız, şunları da yapabilirsiniz: git difftool branch1:path/to/file branch2:path/to/file

İlgili soru: Git fark çıktısını görsel fark programıyla nasıl görüntülerim


4
İki nokta üst üste işaretlerini kullanmak gerçekten harika bir yol değildir - bu, dosyalara ağaç nesneleri üzerinden atıfta bulunduğunuz anlamına gelir; bu nedenle geçerli dizininize göre tam yolu yazmanız gerekir.
Cascabel

13
@Jefromi, bu daha yeni bir sürümde değişmiş olabilir, ancak en azından şimdi göreli yolları kullanabilirsiniz (ör. branch1:./file). Bu, dosya dallar (örneğin git diff branch1:old/path/to/file branch2:new/path/to/file) arasında ayrı bir konumdaysa da yararlıdır .
redbmk

4
@redbmk Evet, 2010 ile şimdi arasında bir zamandı! Yine de, her iki dalda da aynı dosya varsa, bunu böyle yapmaya gerek yok, sadece git diff branch1 branch2 path/to/file.
Cascabel

3
@jefromi cool, ne zaman eklendiğine dair emin değildim. Evet, normalde bahsettiğiniz sözdizimini kullanırdım, ancak Tim'in cevabı, sorunun sorduğu şey olmasa da, farklı yollarla dosyaları nasıl karşılaştıracağımı
anlamama yardımcı

1
Bu fikri sevdiğim halde, git fark belgelerinde bu sözdizimini çalıştıramaz veya herhangi bir sözünü bulamıyorum. Neyi kaçırıyorum? Teşekkürler!
yoyo

160

Daha modern sözdizimi:

git diff ..master path/to/file

Çift noktalı önek, "geçerli çalışma dizininden" konumuna anlamına gelir. Ayrıca şunları da söyleyebilirsiniz:

  • master.., yani yukarıdakilerin tersi. Bu ile aynı master.
  • mybranch..master, geçerli çalışma ağacından başka bir duruma açıkça gönderme yapıyor.
  • v2.0.1..master, yani bir etikete referansta bulunmak.
  • [refspec]..[refspec], temelde git için kod durumu olarak tanımlanabilir herhangi bir şey.

33

İki farklı daldan dosyaları karşılaştırmanın birçok yolu vardır:

  • Seçenek 1: Dosyayı n belirli daldan başka bir dalla karşılaştırmak istiyorsanız:

    git diff branch1name branch2name path/to/file
    

    Misal:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    Bu örnekte, “mybranch” dalındaki dosyayı “mysecondbranch” dalındaki dosyayla karşılaştırıyorsunuz.

  • Seçenek 2: Basit yol:

     git diff branch1:file branch2:file
    

    Misal:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    Bu örnek, 1. seçeneğe benzer.

  • Seçenek 3: Geçerli çalışma dizininizi bir şubeyle karşılaştırmak istiyorsanız:

    git diff ..someBranch path/to/file
    

    Misal:

    git diff ..master myfile.cs
    

    Bu örnekte, dosyayı gerçek dalınızdan ana daldaki dosyayla karşılaştırıyorsunuz.


12

Basitçe yaparım git diff branch1 branch2 path/to/file

Bu dosyalar arasındaki farkları kontrol eder. Değişiklikler branch1kırmızı renkte olacaktır. Değişiklikler branch2yeşil olur.

branch1Geçmiş ve branch2gelecek olduğu varsayılmaktadır . Farkdaki dalların sırasını ters çevirerek bunu tersine çevirebilirsiniz:git diff branch2 branch1


Git farkının hangi sürümü bunu yapabilir? Çalıştığım sürümde desteklenmiyor gibi görünüyor (2..9.2.windows.1).
Vince Bowdren

9

Mevcut dalda bir fark yaratmak istiyorsanız, ommit yapabilir ve kullanabilirsiniz:

git diff $BRANCH -- path/to/file

bu şekilde mevcut daldan başvurulan dala ( $BRANCH) farklılık gösterir .


5

@Dahlbyk tarafından önerilen cevapla aynı fikirde olmak. Diff'in kod incelemeleri için diff dosyasına yazılmasını istiyorsanız aşağıdaki komutu kullanın.

git diff branch master -- filepath/filename.extension > filename.diff --cached

2

Benim durumumda aşağıdaki komutu kullanıyorum:

git diff <branch name> -- <path + file name>

Bu komut, aynı dosyayı iki farklı dalda karşılaştırmanıza yardımcı olabilir


1

Bunu yapmanın en iyi yolu git diffaşağıdaki şekilde kullanmaktır: git diff <source_branch> <target_branch> -- file_path

Bu dallardaki dosyalar arasındaki farkı kontrol edecektir. Git komutları ve nasıl çalıştığı hakkında daha fazla bilgi için bu makaleye göz atın .


1

Taahhüt karmaları şu şekilde kullanın:

git diff <hash1> <hash2> <filename>

burada hash1 herhangi bir daldan herhangi bir taahhüt olabilir, hash2 için aynıdır .


1

Dosyaları karşılaştırmak için iki senaryo vardır:

Senaryo 1: Uzak dallardaki dosyaları karşılaştırın (her iki dal uzak depoda bulunmalıdır)

Senaryo 2: Yerel dosyaları (yerel çalışma alanı kopyasında) uzak depodaki dosyalarla karşılaştırın.

Mantık basit. Fark için iki şube adı sağlarsanız, her zaman uzak dalları karşılaştırır ve yalnızca bir şube adı sağlarsanız, yerel çalışma kopyanızı her zaman uzak repo (sağladığınız) ile karşılaştırır. Aralığı, uzak depolar sağlamak için kullanabilirsiniz.

Örneğin bir şubeyi satın alma

git checkout branch1
git diff branch2 [filename]

bu durumda, dosya adı sağlarsanız, yerel dosya adı kopyanızı " branch2 " adlı uzak dal ile karşılaştırır .

git diff branch1 branch2 [filename]

bu durumda, " branch1 " ile " branch2 " adlı uzak şubelerin dosya adlarını karşılaştıracaktır

git diff ..branch2 [filename]

bu durumda da " branch1 " ve " branch2 " adlı uzak dallardan dosya adını karşılaştıracaktır . Yani, yukarıdakiyle aynı. Ancak, başka bir daldan yeni bir dal oluşturduysanız, "ana" deyin ve geçerli dalınız uzak depoda yoksa, uzak " ana " ve uzak " dal2 " ile karşılaştırılacaktır.

Umarım faydalıdır.


0

Git bash içindeki iki dosyayı karşılaştırmak için şu komutu kullanmanız gerekir:

git diff <Branch name>..master -- Filename.extension   

Bu komut bash'ın içindeki iki dosya arasındaki farkı gösterecektir.

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.