2011-09-20 18 views
10

Aşağıdaki durumu aldığımı varsayalım: Git, bu arada gerçekleşen birleştirme taahhütleri hariç, konu dalında fark var mı?

 B---D---F---G topic 
/ /
--A---C---E master 

Kod gözden geçirme amacı için, A işleminden A işlemine kadar bir fark çıkarmak istiyorum, ancak ana dalda gerçekleşen E ve C işlemlerini içermez, ve aynı zamanda birleştirme taahhüdü olan taahhüt F'yi de içermez.

Diğer bir deyişle, F'den G'ye değişen değişiklikleri içeren bir değişiklik oluşturmak ve bu değişiklikleri A'dan D'ye olan değişikliklerle birleştirmek istiyorum.

Diğer bir deyişle, gözden geçirme farkının içerilmesini istiyorum. Sadece konu dalından yaptığım değişiklikler, arada sırada gelen ustadan bir kod içermiyor.

Bu mümkün mü? Eğer git böyle "diff aggregations" ile başa çıkamazsa, eğer birisi bazı harici komutların bunu nasıl yapabildiğine dair bazı işaretçiler sağlayabilirse çok minnettar olurdum (böylece hile yapacak bir bash betiğini yazmayı deneyebilirim).

+0

A ve G dosyasındaki dosyaları ayrı ayrı kontrol etme ve bir vim farkı oluşturma hakkında ne düşünüyorsunuz ??? –

+0

Tek bir dosya için değil, tüm dosyalar için farklılığa ihtiyacım var. Ayrıca, önerdiğin şeyin birleştirme taahhüdünün getirdiği değişiklikleri de içereceğini düşünüyorum. –

cevap

4

Eğer farkların "bağlam" bölümünde ne olduğuyla ilgilenmiyorsanız, git diff master..topic size ne istediğinizi verecektir. C ve E'da getirilen değişiklikler, farkın "temelinin" bir parçası olarak kabul edilir, dolayısıyla master arasındaki değişiklikler içeriğinde olacaktır, ancak yalnızca konu dalınızda yapılan gerçek değişiklikler, değişiklikler olarak + veya - ile işaretlenecektir . Bu genellikle insanların kod incelemeleri için istediği şeydir. Birleştirme hiç olmamış gibi davranmak istiyorum Bunun yerine

, orda rebase gerekir:

git rebase --onto A master 
+2

Teşekkürler Karl, 'git diff master..topic' hile yaptı. Fark betiğini çalıştırmadan önce ana konusunu bir araya getirmek zorunda kaldım. –

1

Ne hakkında:

  1. git ödeme konu

  2. git ödeme -b geçici

  3. git F dönmek

  4. git A

fark

Daha sonra geçici dalı kaldırabilirsiniz.

1

Karl gelen cevap yanıltıcı:

git diff asla doğru aralıklarda çalışır (yani birden fazla taahhüt), sadece arasında iki taahhüt eder!

Aralık sözdiziminin git diff için özel anlamı vardır. (E ikisi arasındaki birleştirme-nokta için ve
git diff E...G bu durumda git diff E G eşittir)

git diff E..G zaman git diff E G eşittir.

git diff master...topic bu ve genel durumda istediğini şudur: o son kez birleşti zaman yani usta onu zıt (son birleştirme-tabanına karşılaştırarak, size konu dalı tüm değişiklikleri gösterir Yine de, ana branşında olmayan tüm usta değişiklikleri görmezden geliyorsa).

Not: (? Tesadüfen) ne yazık kigit log içinde x..y etkisi, vs. en tersi git diff içinde x...y ile temsil edilir ve!

+1

Evet, bu doğru cevap. Kılavuzdan: "git diff A ... B", "git diff $ (git-merge-base A B) B" ye eşdeğerdir. – jmiserez

İlgili konular