2012-06-12 9 views
30

Zaten 3 yollu bir farkla işlenen bir birleştirmeyi görüntülemenin bir yolu var mı? dalları arasında büyük birleştirme 3 hafta önce işlendiği takdirdeHalihazırda eklenmiş olan Git birleştirme özelliğini harici 3 yollu fark aracında görüntüleme

, ben BeyondCompare3 gibi bir dış fark-aracı bunun bir 3-way fark görebilirsiniz bir yolu var mı? 'u arıyorum, yalnızca birleştirme işlemi olarak değiştirilmiş dosyaları arıyorum. Bonus, eğer iki şube arasındaki bir dosyanın tüm farkını görmektense, sadece el değiştiren şeyleri ve anlaşmazlıkları sadece bana göstermek için alabilseydim.

Ben sol taraf çatışma işaretleri >>>>> < < < < < ===== vardı ve sağ taraf kararlı sonucuydu eğer 2 yönlü fark için yerleşme sakıncası olmaz.

Ben fark ağacının, fark dosyaları, fark, difftool, göstermek ve diğerleri ve onu çözemedim bakarak çalıştı. Gitk'in değişimleri sadece birleştirme işleminde göstereceğini biliyorum, ama aşırı farklı görünümden hoşlanmıyorum ve tonlarca değişiklik olduğunda bunu anlamak çok zor.

sadece ben bazı hackery olmadan GIT'de üç yönlü diff nasıl bilmiyorum git difftool --cc firstparent..secondparent..result

cevap

2

gibi bir şey yapabilseydim, ama bir iki yol ı meld kullanmayı tercih ediyorum fark. meld projenizin üç farklı versiyonunu kontrol edip, dizine göre yeni bir fark yaparsanız ve "Üç Yollu Karşılaştırma" seçeneğini seçerseniz üç yollu bir fark yaratabilir.

İlk kaydedilmesini

git log | more

bul difftool

git config --global diff.tool meld

olarak zihin birleştirme

sudo apt-get install meld

Sonra set birleştirmesi yüklemek Aç kaydedilmesini

git difftool <old-version>..HEAD

6

Güncelleme cevap: aşağıda aslında $conflicting_files gerçekten çatışmaları vardı dosyaları içermiyordu anlamında kusurlu script Benim orijinal versiyonu, ama değiştirilmiş olan tüm dosyalar Her iki ana dalda da (ancak zorunlu olarak çatışmalar yoktu). Ayrıca, mantıksal olarak reklamı yapılan "yapılandırılmış birleştirme aracı" kullanılmıyordu, ancak diffuse. Her iki sorunu da current version of the script numaralı telefondan ele aldım.

Orjinal cevap: en ana gelişme oluyor bir "ana" şube var diyelim ve ustanın (eski) bazı devlet üstündeki bazı özellik ekler bir "konu" dalı.Sadece birleştirme işleminde değiştirilen dosyaları aradığınızı söyleyerek, yalnızca birleşme işleminde "ana" ye ("herhangi bir uyuşmazlık çözümü de dahil olmak üzere") getirilen "konu" değişiklikleriyle ilgilendiğinizi, ancak "konu" dan bu yana "usta" da yapılan çelişen değişiklikler dallanmıştı. Ayrıca "ana", birleştirme birinci ebeveyn taahhüt ve "konu" ikinci, işte bu anlamda burada fark 3 yol kullanmak yapmaz

git difftool <merge commit>^1 <merge commit> 

Not ile elde edilebilir olduğunu varsayarak 'un herhangi bir çakışma çözünürlüğü'u içerdiği duruma bakıyoruz. Bu aynı zamanda GitHub'un birleştirme taahhütleri için gösterdiği şeydir, bu arada, bkz. Test için kullandığım this merge commit. Git taahhüt ilk doğrudan çalışabilir çünkü

ben Diffuse yerine Beyond Compare kullanıyorum

#!/bin/sh 

if [ $# -ne 1 ]; then 
    echo "Rationale : Show the conflict resolution of a given merge commit in the configured merge tool." 
    echo "Usage : $(basename $0) <merge commit>" 
    exit -1 
fi 

# Test e.g. with https://github.com/git/git/commit/8cde60210dd01f23d89d9eb8b6f08fb9ef3a11b8 
our=$1^1 
their=$1^2 
base=$(git merge-base $our $their) 

conflicting_files=$(git merge-tree $base $our $their | grep -A 3 "changed in both" | grep "base" | grep -Po "[^\s]+$") 
for f in $conflicting_files; do 
    diffuse -r $our -r $base -r $their $f 
done 

bu komut ile geldi bir 3 yollu fark aracında sadece çatışan dosya ve onların kararlarını görmek için yerel dosyaların aksine; argümanların sırasını beğeninize göre değiştirin. BC kullanmak için muhtemelen geçici kontroller yapmanız gerekecektir; Ayrıca, birleştirme işlemini yeniden yapmak, bilinen çözünürlüğü uygulamak ve hiçbir zaman git mergetool'un yapılandırıldığını çalıştırmayı düşünüyordum, ancak bu fikirlerin her ikisi de çalışma ağacınızı karıştırmamak ve temizliği düzgün bir şekilde yapmamak için daha fazla çalışma gerektiriyordu.

+0

+1, farklı taahhütlerle 4 yönlü fark bile yapabilir – Johan

0

sschuberth gibi, birleştirme taahhüdünde değişiklik bulma konusunda bana yardımcı olan bir senaryo yazdım. Ebeveynler ve birleştirme işlemi arasındaki farklılıkları göstermek için vimdiff kullanarak tek seferde tek bir dosya üzerinde çalışır.

#! /usr/bin/env ruby 

require 'pp' 
require 'tmpdir' 

merge = ARGV[0] || abort("I need a merge commit as the first argument") 
file = ARGV[1] || abort("I need a path as the second argument") 
cmd = "vimdiff" 

commits = `git log -n 1 #{merge} --format="%H %P"`.split(' ') 
abort "expected three commits" unless commits.size == 3 
commits[0], commits[1] = commits[1], commits[0] 
tmpdir = Dir.mktmpdir 
commits.each do |commit| 
    tfile = "#{tmpdir}/#{commit[0..10]}" 

    puts "git show #{commit}:./#{file} > #{tfile}" 
    `git show #{commit}:./#{file} > #{tfile}` 
    cmd += " #{tfile}" 
end 
puts cmd 
exec(cmd) 

Bu biraz hacky ama ben kapalı bir olasılıkla ilan ettim birilerine yardımcı olur. Yaygın kullanım için

İlgili konular