2012-06-12 27 views
30

क्या विलय को देखने का कोई तरीका है जो पहले से ही 3-तरफा diff में किया गया है?बाहरी 3-तरफा diff उपकरण में पहले से ही प्रतिबद्ध गिट विलय देखें

यदि 3 सप्ताह पहले शाखाओं के बीच एक बड़ा विलय किया गया था, तो क्या कोई तरीका है कि मैं बाहरी diff-tool में BeyondCompare3 की तरह 3-तरफा अंतर देख सकता हूं? मैं की तलाश में हूं बस मर्ज प्रतिबद्ध में फ़ाइलें बदल दी गई हैं। बोनस अगर मैं इसे केवल दो संघर्षों के बीच फ़ाइल के पूरे अंतर को देखने के विरोध में संघर्ष और कुछ भी मैन्युअल रूप से परिवर्तित करने के लिए प्राप्त कर सकता हूं।

मैं एक 2 तरह diff के लिए व्यवस्थित करता है, तो बाईं ओर संघर्ष मार्करों >>>>> < < < < < ===== था और दाईं ओर प्रतिबद्ध परिणाम था कोई फ़र्क नहीं पड़ेगा।

मैं diff पेड़, diff-फ़ाइलें, diff, difftool, दिखाने के लिए, और अन्य लोगों और यह पता लगा नहीं कर सकता है पर देख रहे हैं की कोशिश की। मुझे पता है कि गिटक विलय प्रतिबद्धता में बदलाव दिखाएगा, लेकिन मुझे ओवर-अंडर डिफ व्यू पसंद नहीं है और इसमें बहुत सारे बदलाव होने पर समझना बहुत मुश्किल है।

केवल मैं की तरह git difftool --cc firstparent..secondparent..result

उत्तर

2

कुछ मैं कैसे कुछ hackery बिना Git में एक तीन तरह से diff करने के लिए पता नहीं है कर सकता है, लेकिन एक दो रास्ते के लिए diff मैं meld का उपयोग चाहते हैं। meld यदि आप अपनी परियोजना के तीन अलग-अलग संस्करणों की जांच करते हैं, तो निर्देशिका द्वारा एक नया अंतर करें और "थ्री वे तुलना करें" विकल्प का चयन करें, तो तीन-तरफा अंतर करने में सक्षम है।

पहले difftool

git config --global diff.tool meld

के रूप में मिलकर एक हो जाना

sudo apt-get install meld

फिर सेट मिलकर एक हो जाना स्थापित करता

git log | more

का पता लगाएं प्रतिबद्ध खोलें

git difftool <old-version>..HEAD

6

अपडेट किया गया जवाब: स्क्रिप्ट नीचे अर्थ में त्रुटिपूर्ण था कि वास्तव में $conflicting_files केवल उन्हीं फ़ाइलों को वास्तव में संघर्ष किया था नहीं था की मेरी मूल संस्करण है, लेकिन वह बदल रहे थे सभी फ़ाइलें दोनों माता-पिता शाखाओं में (लेकिन जरूरी नहीं कि संघर्ष हो)। साथ ही, यह "कॉन्फ़िगर किए गए मर्ज टूल" का उपयोग नहीं कर रहा था जैसा कि तर्क में विज्ञापित किया गया था, लेकिन diffuse। मैंने current version of the script में दोनों मुद्दों को संबोधित किया है।

मूल जवाब: मान लीजिए कि हम मुख्य विकास पर जाने के साथ एक "मास्टर" शाखा चलाते हैं और एक "विषय" शाखा है जो कुछ (पुराने) गुरु के राज्य के शीर्ष पर कुछ सुविधा जोड़ता है।यह कहकर कि आप विलय प्रतिबद्धता में केवल फाइलों को बदल रहे हैं, मुझे लगता है कि आप विलय प्रतिबद्धता (किसी भी विवाद समाधान सहित) में "मास्टर" से जुड़े "विषय" में किए गए परिवर्तनों में रुचि रखते हैं, न कि गैर- "विषय" के बाद से "मास्टर" में किए गए विरोधाभासी परिवर्तनों को ब्रांच किया गया था। इसके अलावा यह सोचते हैं कि "मास्टर" अपने मर्ज के पहले माता-पिता के लिए प्रतिबद्ध है और "विषय" पीछे नहीं है, इस के साथ

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

ध्यान दें कि यह के रूप में यहाँ 3-ओर diff उपयोग करने के लिए कोई मतलब नहीं है प्राप्त किया जा सकता है हम राज्य को देख रहे हैं कि में कोई भी संघर्ष समाधान शामिल है। यह भी है कि गिटहब मर्ज काम के लिए दिखा रहा है, वैसे, उदाहरण देखें this merge commit जिसे मैंने परीक्षण के लिए उपयोग किया है।

3-ओर diff उपकरण में केवल विरोधी फ़ाइलों और उनके प्रस्तावों को देखने के लिए मैं इस स्क्रिप्ट

#!/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 

मैं Diffuse बजाय Beyond Compare उपयोग कर रहा हूँ के साथ आया था Git पर करता है क्योंकि पहले सीधे काम कर सकते हैं स्थानीय फाइलों के विरोध में; अपनी पसंद के लिए तर्क के क्रम को बदलें। बीसी का उपयोग करने के लिए, आपको शायद अस्थायी चेकआउट करने की आवश्यकता होगी; मैं विलय को फिर से शुरू करने, ज्ञात संकल्प को लागू करने और git mergetool को चलाने के बारे में भी सोच रहा था, लेकिन इन दोनों विचारों को आपके काम करने वाले पेड़ को अव्यवस्थित करने और सही तरीके से साफ करने के लिए और अधिक काम की आवश्यकता होगी।

+0

+1 प्रसार के लिए +1, यह अलग-अलग कामों के साथ 4 तरीके भिन्न हो सकता है – Johan

0

sschuberth की तरह, मैंने एक स्क्रिप्ट लिखी जिसने मुझे विलय प्रतिबद्धता में बदलाव खोजने में मदद की। यह एक समय में एक ही फाइल पर काम करता है ताकि विमडिफ का उपयोग माता-पिता के बीच अंतर दिखाने और प्रतिबद्धता को मर्ज करने के लिए किया जा सके।

#! /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) 

यह थोड़ा हैकी है लेकिन मैंने इसे किसी मौके पर पोस्ट किया है जिससे यह किसी की मदद करता है।