Git, geçerli şube ile ana sistem arasında farklılık gösterir ancak birleştirilmemiş ana taahhütler dahil değildir


171

Henüz master ile birleştirilmemiş bir daldaki tüm değişikliklerin bir farkını istiyorum.

Denedim:

git diff master
git diff branch..master
git diff branch...master

Ancak, bu durumların her birinde fark, ana dalımda henüz şubemle birleştirilmemiş içerik barındırır.

Şube ile master arasında henüz şubemde birleştirilmemiş değişiklikleri hariç tutan bir fark yapmanın bir yolu var mı?


9
İkinci versiyon etrafında çevirmek varsa, istediğini elde: git diff master..branch. Şubedeyseniz kısaltabilirsiniz git diff master... r1..r2Sözdizimi kısa ^r1 r2vasıta "dan alçalır bu bana her şeyi göstermek hangi r2ve erişilebilir değil r1". git help gitrevisionskullanabileceğiniz çeşitli sözdizimleri hakkında bilgi içerir.
John Szakmeister

1
...Sözdizimi hakkında daha fazla bilgi okuduktan sonra cevabımı genişlettim git diff. Yorumunuz yanlış, @jszakmeister, çünkü açıklandığı gibi revizyon aralıkları gitrevisionsile ilgisi yok git diff. Diff, tarihteki iki noktayı karşılaştırır, bir aralıkla çalışamaz.
Palec

Haklısın. Bunun git diffdiğer komutlardan farklı çalıştığını her zaman unuturum ... sinir bozucu bulduğum bir gerçek. :-(
John Szakmeister

karşılaştırma yapmadan önce master'ın yerel kopyasını güncellediğinizden emin olun
joe

Yanıtlar:


232
git diff `git merge-base master branch`..branch

Birleştirme tabanıbranch ayrıldığı noktadır master.

Git diff bunun için özel bir sözdizimini destekler:

git diff master...branch

Yanları değiştirmemelisiniz çünkü o zaman diğer dalı alırsınız. Başka türlü değil, branchayrıldığından beri neyin değiştiğini bilmek istersiniz master.

Gevşeklikle ilgili:


..Ve ...sözdiziminin diğer Git araçlarındakiyle aynı semantiğe sahip olmadığını unutmayın . 'De belirtilen anlamdan farklıdır man gitrevisions.

Alıntı man git-diff:

  • git diff [--options] <commit> <commit> [--] [<path>…]

    Bu, iki keyfi arasındaki değişiklikleri görüntülemek içindir <commit>.

  • git diff [--options] <commit>..<commit> [--] [<path>…]

    Bu, önceki formla eşanlamlıdır. Bir <commit>tarafta atlanırsa, bunun HEADyerine kullanmakla aynı etkiye sahip olacaktır .

  • git diff [--options] <commit>...<commit> [--] [<path>…]

    Bu form, <commit>her ikisinin ortak bir atasından başlayarak daldaki ve ikinciye kadar olan değişiklikleri görüntülemek içindir <commit>. " git diff A...B", " " ile eşdeğerdir git diff $(git-merge-base A B) B. Bunun yerine <commit>kullanmakla aynı etkiye sahip olan herhangi birini atlayabilirsiniz HEAD.

Egzotik bir şey yapıyorsanız, <commit>".." notasyonlarını kullanan son iki form hariç, yukarıdaki açıklamanın hepsinin herhangi biri olabileceğine dikkat edilmelidir <tree>.

Yazım yollarının daha eksiksiz bir listesi için <commit>, "REVİZYONLARIN BELİRTİLMESİ" bölümüne bakın gitrevisions[7]. Bununla birlikte, "fark", aralıklar değil iki uç noktanın karşılaştırılmasıyla ilgilidir ve aralık gösterimleri (" <commit>..<commit>" ve " <commit>...<commit>"), "ARALIK ARALIKLARI" bölümünde tanımlandığı gibi bir aralık anlamına gelmez gitrevisions[7].


Benim için $ git diff master...branchüretildi fatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.- bu sürüme bağlı bir komut mu?
Joel Peltonen

Aslında, "dal" ın dalınızın adı olması gerektiğini fark ettim, bunun mevcut dal için bir referans olduğunu düşündüm
Joel Peltonen

4
Haklısın, cevabım çağrılan şubeye dayanıyor branch. OP'nin soruda seçtiği isimle sadık kalmayı seçtim. Geçerli dalı kullanmak istiyorsanız, yerini branchile HEAD.
Palec

14
git diff master...Şube belirtmekten kaçınmak için kullanabileceğinizi unutmayın (geçerli olan alınacaktır).
VasiliNovikov

1
devel@ChrisGuest kontrol ettikten sonra orijinal komut çalışıyor mu? Muhtemelen Git, ödeme sırasında sizin için uzak bir şubenin (genellikle origin/devel) yerel bir kopyası olarak dalı oluşturdu . Eğer durum buysa, git diff origin/devel...bugfix/API-353-api-allows-database-access-whenödeme öncesinde bile çalışırdı.
Palec

45

İşte benim için işe yarayan:

git diff origin/master...

Bu, yalnızca seçili olan yerel dal ile uzak ana dal arasındaki değişiklikleri gösterir ve yerel şubemde birleştirme işlemlerinden gelen tüm değişiklikleri yoksayar.


Referans olarak, bu değişiklikleri içeren taahhütlerin taahhüt referanslarına ihtiyacınız varsa kullanın git cherry origin/master.
jaytibann

Bu, beklemediğiniz bir sürü çöp gösteriyorsa master, altınızdan bir dizi taahhütte bulunmuş olabilirsiniz.
Michael - Clay Shirky

21

John Szakmeister ve VasiliNovikov tarafından da belirtildiği gibi, dalınızdaki ustanın bakış açısından tam farkı elde etmek için en kısa komut:

git diff master...

Bu, yerel ana kopyasını kullanır.

Belirli bir dosyayı karşılaştırmak için şunu kullanın:

git diff master... filepath

Çıktı örneği:

Örnek kullanım

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.