İki düzeltme arasında hangi dosyaların değiştiğini gösteren


2105

Bir süredir ayrılmış olan ve hangi dosyaların değiştirildiğini bilmek isteyen iki dalı birleştirmek istiyorum.

Bu bağlantıya rastladım: http://linux.yyz.us/git-howto.html ki bu oldukça faydalıydı.

Karşılaştığım dalları karşılaştırmak için araçlar:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

Sadece iki şube arasında farklı olan dosyaları görmek için "git status master..branch" gibi bir şey olup olmadığını merak ediyordum.

Yeni bir araç oluşturmadan, bunu şimdi yapabileceğiniz en yakın şey olduğunu düşünüyorum (bir dosya birden fazla değiştirildiyse elbette tekrarlar gösterecektir):

  • git diff master..branch | grep "^diff"

Kaçırdığım bir şey olup olmadığını merak ediyordum ...


12
Başka kaç kişi bu sorunun başlığını yanıltıcı buluyor? Aslında iki dal arasındaki dosya farklılıklarını bulmakla ilgilidir. Buraya bakmaya geldiğimde, aynı daldaki iki revizyon arasındaki dosya farklılıklarını nasıl görebileceğimdi. Yoksa sadece ben miyim?
Sandeepan Nath

4
@SandeepanNath: git ile fark yok. Her zaman bireysel taahhütlere atıfta bulunuyorsunuz.
Samuel O'Malley

@ SamuelO'Malley Gitmek için yeniyim ve görünüşte yaygın olan dallanma stratejisini göz önünde bulundurarak, tüm dalların nihayetinde ana dalla birleştirildiği ve nihayetinde usta yayıldığı ortaya çıktı. Şimdi, üretimin zaten master'da olduğu, ancak ipucunun arkasında (son dağıtımın son ana birleşmeden sonra gerçekleşmiş olması durumunda bir revizyonla) bir sunum olayı göz önüne alındığında, bu iki revizyon arasındaki farkları görmek istiyorum. neyin yayılacağını öğren. En son birleştirilen şubeye bakmak istemiyorum. Yanlışım varsa düzelt.
Sandeepan Nath

2
@SandeepanNath: şube adlarını kullanmak yerine aşağıdaki yanıtları alabilir ve bunun yerine yalnızca taahhüt kimliklerini belirtebilirsiniz. Ya da dağıtım yaparken etiketler oluşturursanız, taahhütleri etiket adlarına göre yönlendirin.
Samuel O'Malley

1
@SandeepanNath 2 dalı karşılaştıramazsınız, düzeltmeyi belirtmelisiniz. Yani 2 dalı karşılaştırmak 2 revizyonu karşılaştırmaktır.
Bastien Vandamme

Yanıtlar:


2574

Mevcut şubeyi şubeyle karşılaştırmak için master:

$ git diff --name-status master

Herhangi iki dalı karşılaştırmak için:

$ git diff --name-status firstbranch..yourBranchName

Resmi belgelerden okumaya devam git diffedin .


2
Sol taraftaki indekslerin her biri ne anlama geliyor (bir sürü M ve D görüyorum)?
gogogadgetinternet

15
@ user446936 - Git durumu kılavuz sayfasında harflerin ne anlama geldiğini görebilirsiniz @ kernel.org/pub/software/scm/git/docs/git-status.html - özellikle, M == değiştirildi, D == silindi
James Manning

12
git diff --name-status your_branch...masterbeyniniz ondan yaratıldığından beri master'da meydana gelen değişiklikleri çıktılar
Radu

1
Burada çift nokta operatörü gereksizdir, çünkü diffs çifttir.
jub0bs

2
Çalışma ağacında olmayan bilinmeyen bir düzeltme veya yol alıyorum.
SuperUberDuper

408

Deneyin

$ git diff --stat --color master..branchName

Bu, aynı sayıda satırı kullanmaya devam ederken, her değişiklik hakkında daha fazla bilgi verecektir.

Ayrıca, başka bir şekilde birleştirecek olursanız, farkın daha net bir resmini elde etmek için dalları çevirebilirsiniz:

$ git diff --stat --color branchName..master

77
Git rengini açtıysanız (şiddetle tavsiye edilir, imho) ( config --global color.ui true), --color'u atlayabilirsiniz. (Ben lks - tembel klavye sendromu var.)
Art Swri

25
Seninle renkteyim! BTW Demek istediğim git config --global color.ui true- tam olmak gerekirse .
Art Swri

2
fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
Çalışmıyor

7
@ TomášZato özür dilerim ama "branchName" ile şubenizin adını değiştirmeniz gerekiyor.
Gerry

161

Ayrıca git ucuz ve kolay dallanma olduğunu unutmayın. Birleşmenin sorunlu olabileceğini düşünürsem, birleşme için bir şube oluştururum. Bu yüzden masterbirleştirmek istediğim değişiklikler varsa ve bamaster'dan kod gerektiren şubem ise aşağıdakileri yapabilirim:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

Sonuç olarak, şubeme vidalamadan önce bir fırlatma kolundaki birleşmeyi denemem gerekiyor. Kendimi dolaştırırsam, ba-mergedalı silip baştan başlayabilirim.


4
Muhteşem. Hiç bu şekilde dallanmayı düşünmemiştim. Bence bu birleşme sırasında "en iyi uygulamaların" bir parçası olarak görülmelidir.
egelev

Ba-marge'ı ba ile birleştirdiğinizde, çatışmaları tekrar çözme potansiyeli yok mu?
Josef.B

2
@EricAnderson Doğru, bu bir grafik. SVN okul masasının altına sakız gibi yapışır. Teşekkür.
Josef.B

1
Eğer ba-
merge'de

Bırakabilirsin. Bunun yararlı olmasının tek nedeni master, kodu gözden geçirmek ve çakışmaları düzeltmek için çalışırken yeni öğelerin iniş yapmasıdır.
Eric Anderson

58

Birisi iki daldan bir fark dosyası oluşturmaya çalışıyorsa:

git diff master..otherbranch > myDiffFile.diff

2
Bu, özellikle çok fazla farklılık içeren büyük dallarda kullanışlı hale geldi.
vandsh

Bu fark gerçekten büyük olduğunda faydalıdır. Varsayılan olarak konsoldaki tüm farkları göstermez (nedenini merak ediyordum), farkın bir dosyaya geçirilmesi bu durumda gitmenin yoludur.
rotimi-best

42

GUI tabanlı bir yöntem de vardır.

Gitk kullanabilirsiniz .

  1. Çalıştırmak:

    $ gitk --all
    
  2. Bir dalın taahhüdüne sağ tıklayın ve açılır menüden Bu taahhüdü işaretle'yi seçin.

  3. Başka bir dalın taahhüdüne sağ tıklayın ve Bunu farklılaştır -> işaretli taahhüt veya Diff işaretli taahhüt -> bunu seçin .

Ardından, sağ alt panelde değiştirilmiş bir dosya listesi ve sol alt panelde fark ayrıntıları olacaktır.


3
@Orwellophile Nasıl yapılacağını göstermek için bir video yüklüyorum . Umarım sana yardımcı olur.
Yantao Xie

Vay canına, sadece benim için özel hissediyorum. Gelecekte başvurmak ve ekstra google-foo için delicious.com'a yer işareti koydum.
Orwellophile

Ciddi derecede önemsiz cevap. Teşekkürler!
Koshinae

36

Bu durumda meld kullanarak bir seçenek daha:

git difftool -d master otherbranch

Bu, yalnızca dosyalar arasındaki farkları görmekle kalmaz, aynı zamanda belirli bir dosyayı işaret etmenin ve tıklamanın kolay bir yolunu sunar.


6
Meld'i varsayılan difftool olarak ayarlamak isteyebilir: git config --global diff.tool meld
bwv549

1
Bu benim favorim çünkü yapılandırdığınız tüm diftoolleri kullanacak.
Josiah

OSX'te desteklenmez. :-(
Mike S.

@MikeS. lütfen bu cevaba göz atın stackoverflow.com/a/12815806/151918 OSX için talimatlar içerir. En azından benim için çalışıyor, umarım yardımcı olur.
rsilva4

Güzel. Ama -dseçenek ne için?
Scotty.NET

29

Git, sonucu beğenmezseniz birleştirmeyi denemeyi ve sorunlardan uzak durmayı kolaylaştırır. Potansiyel sorunları önceden aramaktan daha kolay olabilir.


10
David, bu iyi bir nokta, ancak elden önce neler olduğunu bilmek güzel olurdu ...
johannix

18

Ve yalnızca belirli dosya (lar) arasında değişiklik arıyorsanız, o zaman:

git diff branch1 branch2 -- myfile1.js myfile2.js

branch1 isteğe bağlıdır ve branch1 sağlanmadıysa geçerli dalınız (bulunduğunuz dal) varsayılan olarak dikkate alınır. Örneğin:

git diff master -- controller/index.js

15

İşbirliği içinde veya aynı anda birden çok özellik üzerinde çalışırken, yukarı akış veya hatta master'ınızın dalınıza dahil olmayan ve temel farklarda yanlış görünecek işleri içermesi yaygındır.

Yukarı Akımınız taşınmışsa, bunu yapmanız gerekir:

git fetch
git diff origin/master...

Sadece git diff master kullanımı ilgili değişiklikleri içerebilir veya içermez.



8

İki dalı var diyelim

  • A (Üzerinde çalıştığınız şube)
  • B (Karşılaştırmak istediğiniz başka bir dal)

A dalında olmak yazabilirsiniz

git diff --color B

o zaman bu size bir çıktı verecektir

resim açıklamasını buraya girin

Bununla ilgili önemli olan nokta

  1. Yeşil renkli metin A dalında mevcut

  2. Kırmızı metin B Şubesinde bulunur


8

Burada birçok cevap var, ama sık kullandığım bir şey eklemek istedim. Karşılaştırmak istediğiniz dallardan birindeyseniz tipik olarak aşağıdakilerden birini yaparım. Bu cevap uğruna ikincil şubemizde olduğumuzu söyleyeceğiz. O anda hangi görünüme ihtiyacınız olduğuna bağlı olarak, hangisini seçtiğinize bağlı olacaksınız, ancak çoğu zaman ikisinin ikinci seçeneğini kullanıyorum. Orijinal kopyaya geri dönmeye çalışıyorsanız ilk seçenek kullanışlı olabilir - her iki durumda da, her ikisi de işi halledin!

Bu, master'ı içinde bulunduğumuz şubeyle (ikincil olan) karşılaştıracak ve orijinal kod eklenen satırlar olacak ve yeni kod kaldırılan satırlar olarak kabul edilecektir.

git diff ..master

VEYA

Bu aynı zamanda master'ı içinde bulunduğumuz şubeyle (ikincil olan) karşılaştıracak ve orijinal kod eski satırlar olacak ve yeni kod yeni satırlar olacak

git diff master..

1

Github / Github Enterprise kullanıyorsanız, /comparedepo yolunuzun URL'sine (örneğin, https://github.com/http4s/http4s/compare) basarak Web kullanıcı arayüzünü kullanabilirsiniz . Karşılaştırmak istediğiniz dalı / taahhüt / etiketi seçebilirsiniz: Github Karşılaştır Ekran Görüntüsü

Ve fark url'deki github arayüzünde sunulacak /compare/{x1}...{x2}olan x2ve x1: dal / taahhüt / mesela karşılaştırmak istediğiniz etiket vardır https://github.com/http4s/http4s/compare/release-0.18.x ...usta

Github Doc'ta daha fazlasını görebilirsiniz .


0

Bir GUI çözümü arayan insanlar için Git Cola'nın çok güzel bir "Şube Farkı Görüntüleyicisi ( Diff -> Şubeler .. ) var.


-1
git diff revision_n revision_m

eğer revision_nve revision_mardışık onaylatabilirsiniz vardır o zaman aynı çıkışı git show revision_m



-2

GUI'yi seviyorsanız ve Windows kullanıyorsanız, işte kolay bir yol.

  1. WinMerge indir
  2. Farklı klasörlerde iki dalı kontrol edin
  3. WinMerge kullanarak bir klasör klasör karşılaştırması yapın. Ayrıca, dallardan biri üzerinde çalıştığınız dalda kolayca değişiklik yapabilirsiniz.

Bu en basit yol değil, aslında şubeler arasında farklılık göstermek için depoları indirmeye gerek yok.
stefgosselin

Gerçekten de en basit yol değil, ancak özellikle tüm dosyalardaki
farkları

-3

Ayrıca TortoiseGit kullanarak değiştirilen dosyalar için dalları kolayca karşılaştırabilirsiniz . Referanslara Gözat'a tıklayın ve karşılaştırmak istediğiniz şubeleri seçin.

Karşılaştırmak Örneğin şubenize ile usta sen değişecektir dosyaların bir sonuç listesi olarak alacak usta sen birleştirmeye karar eğer sizin-dalı haline ustası .

Karşılaştırmak eğer farklı bir sonuç olacağını remmber ustası ile sizin-şube ve your-şube ile usta .


1
soru yerel git yardımcı programı ile ilgili gibi görünüyor
Vladimir Hraban
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.