Değiştirilen her dosya ebeveynlerden biriyle aynı fikirde olsa bile, birleştirilmiş fark çıktısıyla birleştirme taahhüdünü “git show” nasıl yapılır?


186

"Basit" birleştirme yaptıktan sonra (çakışma olmadan), git showgenellikle yalnızca

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

Bunun nedeni, birleştirme git showişleminde, üst sürümlerden herhangi birini kabul eden dosyaları atlayan birleşik fark biçimini kullanmasıdır.

Git'i kombine dif modundaki tüm farklılıkları göstermeye zorlamanın bir yolu var mı?

Yapmak git show -mfarkları gösterecektir (sırasıyla yeni ve tüm üst sürümler arasında çiftli diffs kullanarak), ancak kombine modda olduğu gibi ilgili sütunlarda +/- ile işaretlenmiş farklarla olmasını tercih ederim.


1
@ Tilman Vogel: Lütfen kabul edilen cevabı inceleyin - Daha iyi cevaplar var gibi görünüyor
Jayan

1
@Jayan Diğer ipuçları daha popüler olsa da yararlı ipuçları içerdiklerinden, aslında sadece iki yönlü farklar yapmaktan dolayı sorunuma yaklaşmıyorlar. Üç yönlü bir fark arıyordum.
Tilman Vogel

Yanıtlar:


-3

Hayır, bunu yapmanın bir yolu yok git show. Ama kesinlikle bazen güzel olurdu ve muhtemelen nispeten kolay (sonuçta, sadece bunu söylemek zorunda git kaynak kodunda uygulamak olacaktır değildir yama bunu böylece, bu gereksiz çıkışı ne düşündüğünü Döşeme) muhtemelen git sürdürenler tarafından kabul edilirdi.

Yine de ne istediğinize dikkat edin; bir şubeyi üç ay önce çatallanan tek satırlık bir değişiklikle birleştirmek , ana hatta karşı büyük bir fark yaratacaktır ve bu nedenle böyle bir tam fark neredeyse tamamen yararsız olacaktır. Bu yüzden git göstermiyor.


12
Lütfen "bunu yapmanın bir yolu yok" demeyin, mümkün olduğu kadar açık - diğer yanıtlara bakın. Bunu söylemek çok yanıltıcı.
kgadek

1
git show HEAD ^ ... KAFA; hesham_EE'nin çözümü başına #.
Michael Dimmitt

git show HEAD ~ 1 ... HEAD ~ 0 - yalnızca ad; # daha iyi sözdizimi. Tekrarlayan prler için.
Michael Dimmitt

256

İşleme mesajına bakın:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

Merge branch 'testing' into master

hatta dikkat edin:

Merge: fc17405 ee2de56

bu iki taahhüt kimliğini al ve tersine çevir. böylece istediğiniz farkı elde etmek için şunları yapardınız:

git diff ee2de56..fc17405

yalnızca değiştirilen dosyaların adlarını göstermek için:

git diff --name-only ee2de56..fc17405

ve bunları ayıklamak için gitconfig'inize ekleyebilirsiniz:

exportfiles = !sh -c 'git diff $0 --name-only | "while read files; do mkdir -p \"$1/$(dirname $files)\"; cp -vf $files $1/$(dirname $files); done"'

sonra şunu kullanarak kullanın:

git exportfiles ee2de56..fc17405 /c/temp/myproject

Öneri için teşekkürler ama sorunumu çözmediğini düşünüyorum. Sınırlı yorum işaretleme ve biçimlendirme nedeniyle, yorumumu yanıtınıza ekledim. Bunun için özür dilerim! Görünür oluncaya kadar hakem değerlendirmesi gerekiyor.
Tilman Vogel

6
Görünüşe göre düzenlemem reddedildi. Özetle: Farkınız hangi şubeden hangi ilavelerin geldiğini göstermez. Ve değişikliklerin ikinci dalda mı ekleneceğini yoksa ilk dalda mı kaldırıldığını ayırt edemezsiniz.
Tilman Vogel

45
Daha iyi bir çözüm git diff fc17405...ee2de56- bu, ee2de56'daki fc17405'teki taahhütlerden erişilebilen tüm değişiklikleri gösterecektir, ki bu da istediğiniz şey olduğuna inanıyorum. İki yerine 3 noktayı not edin.
Kris Nuttycombe

1
@KrisNuttycombe 3 nokta ve sipariş. Ve yorumunuz aradığım şeydi, bence OP'nin daha çok istediği gibi.
Izkata

@KrisNuttycombe Bu bir şekilde çalışmaz git log, bu da ..varyant gibi tüm taahhütleri gösterir . ..ve ...aynısını yapın log, ama diffonlar farklı !? Bu dalda birleştirilen taahhütlerin bir listesini nasıl alabilirim?
Rudie

77

Daha iyi bir çözüm (@KrisNuttycombe tarafından bahsedilen):

git diff fc17405...ee2de56

birleştirme taahhüdü için:

commit 0e1329e551a5700614a2a34d8101e92fd9f2cad6 (HEAD, master)
Merge: fc17405 ee2de56
Author: Tilman Vogel <email@email>
Date:   Tue Feb 22 00:27:17 2011 +0100

üzerinde ee2de56taahhütte bulunulan tüm değişiklikleri göstermek için fc17405. İşleme karmalarının sırasına dikkat edin - birleştirme bilgilerinde gösterilenle aynıdır:Merge: fc17405 ee2de56

Ayrıca ...iki yerine 3 noktaya dikkat edin !

Değiştirilen dosyaların listesi için şunları kullanabilirsiniz:

git diff fc17405...ee2de56 --name-only

Tam olarak +1'den sonra olduğum şey buydu.
geedoubleya

Bu aslında bir birleşme çatışmasının sonucunu gösterirken diğer cevap göstermez.
Pod

12

Birleştirme işleminden önce HEAD bir taahhüde ayarlanmış olarak şube oluşturabilirsiniz. Sonra şunları yapabilirsiniz:

git merge --squash testing

Bu birleşecek, ancak taahhütte bulunmayacaktır. Sonra:

git diff

5

Burada cevaplanmış gibi görünüyor: https://public-inbox.org/git/7vd392ezhx.fsf@alter.siamese.dyndns.org/

Benzer şekilde,

$ git diff --cc $ M $ M ^ 1 $ M ^ 2 $ (git birleştirme tabanı $ M ^ 1 $ M ^ 2)

ebeveynleri ve birleştirme tabanında kaydedilen durumlara göre durumu $ M olarak açıklayan birleşik bir yama göstermelidir.


herhangi bir aracın yan yana, potansiyel olarak birkaç sütunda (IntelliJ birleştirme çakışması çözümleme penceresinde olduğu gibi) yan yana gösterecek şekilde yapılandırılıp yapılandırılamayacağını biliyor musunuz? Cevabınız tam olarak aradığım şeydi
Max

@Max Hayır Korkarım ki yapmam. Googling "n-yönlü görsel fark" bazı bağlantılar sağlar, bu yüzden ben denedim.
max630

4

Sadece 'git show -c $ ref' ye ihtiyacınız olduğunu düşünüyorum. Bunu a8e4a59'daki git deposunda denemek, birleşik bir fark gösterir (2 sütundan birinde artı / eksi karakter). Git-show el kitabından bahsedildiği gibi, 'git diff-tree'a delege olur, böylece bu seçenekler faydalı görünür.


3
Hayır, "basit" birleştirme git show -c $refiçin alıntıladığım çıktıyı gösterir, yani fark yok. -c'--cc' olan birleştirme işlemleri için varsayılan moda çok benzeyen birleşik bir fark modu seçer, bkz. git help showve git help diff-tree. Her ikisi de o dosyanın üst sürümlerinden birini kabul eden dosyaları tamamen atlar.
Tilman Vogel

a8e4a59aslında birleştirme taahhütleri kategorisine girmez, yani. Bu birleştirme taahhüdü aslında her iki üst sürümden de farklı bir dosya içerir. Documentation/git-fast-import.txtbazı ebeveynlerden bazılarını diğerinden ekledi. Bunun sonucunda boş olmayan çıktılar elde edilir git diff-tree --cc. Ancak, yalnızca bu "çelişkili" durumdaki değişiklikler gösterilir. Bakın, tüm "temiz" birleştirme sonuçları git show -m a8e4a59hiç gösterilmez.
Tilman Vogel

1
@TilmanVogel: "İlginç" dosya birleştirmelerinin git show -cçıktı dışında kaldığına dikkat çektiğiniz için teşekkür ederiz . ( man git-diff-tree"Ayrıca, yalnızca tüm ebeveynlerden değiştirilmiş dosyaları listeler." diyor, ancak bir tanesi için kesinlikle bunu fark etmemiştim.)
Paul Whittaker

3

senin durumunda sadece ihtiyacın var

git diff HEAD^ HEAD^2

veya sadece hash taahhüt için:

git diff 0e1329e55^ 0e1329e55^2

4
Hayır, bu sadece iki ebeveyn arasında basit bir iki yönlü fark yaratır. Ne soruyordum aynı anda git merge-base HEAD^ HEAD^2ve HEAD^ve HEAD^2aynı tarzda farklılıklar gösteren çatışmalar ile birleştirilen dosyalar için yapılan bir mod oldu .
Tilman Vogel

3

Birleştirme taahhüdünüz taahhüt edildiği gibi 0e1329e5 ise, yukarıdaki gibi bu birleştirmede bulunan farkı alabilirsiniz:

git diff 0e1329e5^..0e1329e5

Umarım bu yardımcı olur!


3

Birleştirme işleminde oturuyorsanız, bu farkları gösterir:

git diff HEAD~1..HEAD

Birleştirme taahhüdünde değilseniz, HEAD'i birleştirme taahhüdü ile değiştirin. Bu yöntem en basit ve sezgisel gibi görünüyor.


1
Bu "birleşik fark" çıkışı değildir. Her ebeveyn çifti ve HEAD arasında fark bulmak burada bir sorun değildir.
Tilman Vogel

2

Diff-tree komutunu -c bayrağıyla kullanabilirsiniz. Bu komut, birleştirme işleminde hangi dosyaların değiştiğini gösterir.

git diff-tree -c {merged_commit_sha}

Git-Scm'den -c bayrağının açıklamasını aldım :

Bu bayrak, bir birleştirme işleminin görüntülenme şeklini değiştirir (bu, yalnızca komut verildiğinde veya --stdin kullanıldığında yararlı olduğu anlamına gelir). Bir üst öğe ile sonuç arasında bir kerede (-m seçeneğinin yaptığı şey) ikili fark göstermek yerine, ebeveynlerin her birinden birleştirme sonucuna olan farkları aynı anda gösterir. Ayrıca, yalnızca tüm ebeveynlerden değiştirilen dosyaları listeler.



1

Birleştirme taahhütlerinde çeşitli işlemler yapmak için genel amaçlı bir yaklaşım geliştirdim.

Birinci Adım : Git'i düzenleyerek bir takma ad ekleyin ~/.gitconfig:

[alias]
  range = "!. ~/.githelpers && run_on_merge_range"

İkinci Adım : ~/.githelpersIn'de bir bash işlevi tanımlayın:

run_on_merge_range() {
  cmd=$1; shift
  commit=$1; shift
  range=$(git show $commit | grep Merge: | awk '{print $2 "..." $3}')
  echo "git $cmd $range $@"
  if [ -z $range ]; then
    echo "No merge detected"
    exit 1
  fi
  git $cmd $range $@
}

Üçüncü Adım : Kâr!

git range log <merge SHA> --oneline
git range diff <merge SHA> --reverse -p
git range diff <merge SHA> --name-only

Muhtemelen burada iyileştirilmesi için bir sürü oda var, sadece bu can sıkıcı bir durum geçmiş olsun için birlikte çırpılmış. Bash sözdizimi ve / veya mantığımı taklit etmekten çekinmeyin.


Neye ihtiyacınız olduğunu ve hangi komutu çalıştırdığınıza bağlı olarak, "awk"
bitinde
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.