İki depo arasındaki farkı elde etme


184

İki git deposu arasındaki farkı nasıl alabiliriz?

Senaryo: Bir repo_a ve repo_b var. İkincisi, repo_a'nın bir kopyası olarak oluşturuldu. Daha sonra her iki depoda da paralel bir gelişme olmuştur. Bu iki deponun mevcut sürümlerindeki farklılıkları listeleyebilmemizin bir yolu var mı?


Yanıtlar:


250

Repo_a'da:

git remote add -f b path/to/repo_b.git
git remote update
git diff master remotes/b/master
git remote rm b

3
Repo_a / master'ı belirli bir repo_b etiketi ile karşılaştırmanız gerekirse ne olur?
David Torres

2
benim için çalışmıyorsa, atar: ölümcül: belirsiz argüman 'remotes / b / master': bilinmeyen revizyon veya çalışma ağacında olmayan yol. Yolları revizyonlardan ayırmak için '-' kullanın, 'git <command> [<revision> ...] - [<file> ...]' Burada herhangi bir fikir var mı?
Andrew Heekin

2
@AndrewHeekin ile aynı şeyi alıyorum. Herkesin bir çözümü var mı?
parlamento

4
origin/masterÇıplak yerine belirtmem gerekiyor gibi görünüyor master. Ayrıca, bu ana dallar arasındaki farkı bulur, bu yüzden farklı olan tüm dalları bulmak isterseniz? Depo yedeklemesinin durumunu kontrol etmek için?
davidA

1
Her çizgide ne yaptığını açıklayabilir misiniz? Teşekkürler !
Enrique

34

Meld dizinleri karşılaştırabilir:

meld directory1 directory2

Sadece iki git deposunun dizinlerini kullanın ve güzel bir grafik karşılaştırma elde edersiniz:

resim açıklamasını buraya girin

Mavi öğelerden birine tıkladığınızda nelerin değiştiğini görebilirsiniz.


1
Meld, VS çözümümdeki projeleri karşılaştırırken donuyor, BeyondCompare değil.
Sasha Bond

4
OSX'de: diff -rq folder1 folder2
Mark

1
Harika bağlantı! Çok basit bir program, şimdi bunu OSX için diff programım olarak kullanıyorum.
dmanexe

1
Bu kesinlikle çok güzel! Paylaşım için teşekkürler.
Şihab Hanı

Meld

11

Mevcut deponuza uzaktan kumanda olarak başka bir repo ekleyebilirsiniz:

git remote add other_name PATH_TO_OTHER_REPO

sonra braketi o uzaktan kumandadan getirin:

git fetch other_name branch_name:branch_name

bu, o şubeyi mevcut deponuzda yeni bir şube olarak oluşturur, ardından bu dalı, örneğin geçerli dalı yeni dalla (dal_adı) karşılaştırmak için herhangi bir dalınızla dağıtabilirsiniz:

git diff branch_name

8

Bir depoda her iki dalınız olduğunda bir yapabilirsiniz git diff. Ve onları tek bir depoya almak kadar kolay

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/*

Küçük bir değişiklik ile kiraz seçim tarihinin bir yolu var mı: Örneğin uzak repo dosyasında bir dizine yerleştirilir, ancak aynı dosyaya değişiklikler uygulamak istiyorum ama yerel repo farklı dizine yerleştirilir?
Eugen Konkov

Küçük bir değişiklikten bahsediyorsanız, en kolayı sadece bir fark yaratmak ve daha sonra düzeltme ekini kullanarak diğer dosyaya uygulamak olacaktır.
Michael Krelin - hacker

Aynı dosyalar olmasına rağmen farklı dosya adları nedeniyle düzeltme eki uygulanmadı
Eugen Konkov

Oh, sadece farklı dizinleri düşünüyordum, dosya isimlerini değil (dizinler yama seçenekleri ile kolayca ele alınabilir). Dosya adları için bunları manuel olarak veya komut dosyasıyla değiştirirdim. Bununla birlikte, daha iyi bir çözüm olmadığını söylemiyorum, sadece herhangi bir yerde kazmadan ortaya çıkabilecek şeylerim.
Michael Krelin - hacker

tüm dalları karşılaştırmak istersem ne olur?
endolith

7
git diff master remotes/b

Bu yanlış. remotes/bbir uzak, ama bir şube değil.

Çalışması için şunları yapmam gerekiyordu:

git diff master remotes/b/master

2
Bu gerçekten ilgili cevap hakkında bir yorum olmalı.
EntangledLoops

6

Http://git.or.cz/gitwiki/GitTips , "Genel" bölümündeki "İki yerel depo nasıl karşılaştırılır" bölümüne bakın .

Kısacası diğer depo amacı veritabanına erişmesini GIT_ALTERNATE_OBJECT_DIRECTORIES ortam değişkeni kullanıyorsanız ve kullanan git rev-ayrıştırma ile --git-dirSHA-1 tanımlayıcı diğer depoda sembolik bir ad dönüştürmek / GIT_DIR.

Modern versiyon böyle bir şey olurdu ('repo_a' içinde olduğunuzu varsayarak):

GIT_ALTERNATE_OBJECT_DIRECTORIES = .. / repo_b / .git / objects \
   git diff $ (git --git-dir = .. / repo_b / .git rev-ayrıştırma - KAFA doğrula) KAFA

burada ../repo_b/.gitrepo_b'de nesne veritabanına giden yol (çıplak depo olsaydı repo_b.git olurdu). Tabii ki sadece HEAD'leri değil, rastgele sürümleri de karşılaştırabilirsiniz.


Repo_a ve repo_b aynı havuzsa, her ikisini de aynı depoya koymanın, " git remote add -f ..." tekrarlanan güncellemeler için depo için takma ad (lar) oluşturmak veya " git fetch ..." kapatmak " için daha mantıklı olabileceğini unutmayın ; diğer yanıtlarda açıklandığı gibi.


5

Klasörler ve dosyalar arasında karşılaştırma yapabilmek için harika özelliklere sahip PyCharm kullanıyorum.

Her iki depo için üst klasörü açın ve dizine eklenene kadar bekleyin. Daha sonra bir klasör veya dosyaya sağ tıklayıp Compare to...diğer taraftan ilgili klasörü / dosyayı seçebilirsiniz.

Sadece hangi dosyaların farklı olduğunu değil, içeriklerini de gösterir. Komut satırından çok daha kolay.


2

En iyi seçeneğiniz, yerel makinenizde her iki depoya sahip olmak ve linux diff komutunu iki dizinle birlikte parametre olarak kullanmaktır:

diff -r repo-A repo-B


2
Bu kullanılabilir kılmanın tek yolu .git dizinlerinden birini yeniden adlandırmaktır. bu, önemli olmayan iki satırlık sayfalara düşer. Orada, bunu yaptım, daha iyi bir cevap aramaya geldi.
Hildred

2

Uzaktan kumanda yapılandırmanıza dokunmadan bunu yapmanın kolay bir yolu. A deposundan, master olarak (master dalları karşılaştırmak istediğinizi varsayalım):

git fetch path/to/repo_b.git master
git diff FETCH_HEAD

0

Aşağıdaki komutu kullanabilirsiniz:

diff -x .git -r repo-A repo-B

veya yan yana için şunları kullanabilirsiniz:

diff -x .git -W200 -y -r repo-A repo-B

Her fark dosyasını Renklendirme durumunda şunları kullanabilirsiniz:

diff -x .git -W200 -y -r repo-A repo-B | sed -e "s/\(^diff .*\)/\x1b[31m\1\x1b[0m/"

@ andrew-heekin çözümüne dayalı
Gerard

0

Kendine hatırlatma ... önce getir, yoksa deponun yerel hash'i yok (sanırım).

adim 1. Yukarı akış uzaktan kumandayı ve üstünü kurun ^

tek bir dosyayı ayırmak şu kalıbı izler:

git diff localBranch yukarı akışBranch --spepepath / singlefile

git diff master upstream/nameofrepo -- src/index.js

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.