2009-02-25 17 views
50

मुझे गिट mergetool मिला है जो दृश्यों को विलय करने के लिए एक आसान उपयोगिता है, लेकिन जिस तरह से मैं इसके बारे में जा रहा हूं वह वास्तव में भद्दा लगता है। अनिवार्य रूप से, मेरी प्रक्रिया इस तरह दिखता है जब संघर्ष रिपोर्ट कर रहे हैं:"गिट मेरेटूल" के साथ विलय

  1. एक Git mergetool
  2. निष्पादित प्रॉम्प्ट पर, मारा मेरी diff उपकरण (मिलकर एक हो जाना या FileMerge, जो कंप्यूटर के आधार पर) शुरू करने के लिए दर्ज
  3. संघर्ष
  4. सहेजें परिवर्तन का समाधान करें
  5. diff उपकरण
बंद

यदि मेरे पास एक से अधिक संघर्ष हैं, कुल्ला, दोहराना। हां, यह विलय में प्रत्येक संघर्ष के लिए एक बार मेरे diff दर्शक को खोलना और बंद करना है। चूंकि इसे कमांड लाइन से लॉन्च किया गया है, इसलिए यह बंद करने का एकमात्र तरीका है जिसे मैं गिट मेरेटूल को बताने के बारे में जानता हूं कि मैंने इस विशेष संघर्ष को हल किया है और यह अगले स्थान पर जा सकता है।

निश्चित रूप से एक बेहतर तरीका है, लेकिन मुझे कोई जानकारी नहीं है। कृपया मदद करें? यह प्रक्रिया पागल अक्षम है।

+6

आप बीच में संकेतों को छोड़ने के लिए 'गिट mergetool -y' भी चला सकते हैं। आपको अभी भी मर्जेटूल को बंद करना होगा, लेकिन आपको टर्मिनल पर वापस जाना होगा और प्रत्येक नए विलय के लिए वापसी की आवश्यकता नहीं होगी। – moeffju

+1

यदि आप फ़ाइलों के समूह की गिट मर्ज कर रहे हैं और आपको केवल चिंता करने की ज़रूरत है, तो आपके पास चिंता करने की कोई बात नहीं है। – jwg

+0

@ मोफजू यह विलय संघर्ष प्रक्रिया को गति देने का सबसे अच्छा जवाब है। – mqklin

उत्तर

34

पहली नज़र में, बाहरी diff टूल सत्र का पुन: उपयोग करना संभव नहीं लगता है।

git-mergetool documentation स्पष्ट रूप से कहा गया है:

कस्टम मर्ज उपकरण सही ढंग से मर्ज संकल्प अपने से बाहर निकलें कोड, तो विन्यास चर mergetool.<tool>.trustExitCode सही पर सेट किया जा सकता है के साथ की सफलता को इंगित करता है, तो।
अन्यथा, git-mergetool उपयोगकर्ता को कस्टम टूल से बाहर निकलने के बाद रिज़ॉल्यूशन की सफलता का संकेत देने के लिए संकेत देगा।

तो बाहर निकलने के कोड (या diff उपकरण के निकास के बाद उपयोगकर्ता के सत्यापन) की जरूरत है, जिसका अर्थ है कि उपयोगकर्ता द्वारा पहली बार बाहरी diff उपकरण बंद कर दें।

एक महान प्रोत्साहन लगता है कि/प्रत्येक मर्ज पर संघर्ष की संख्या कम करने के लिए एक प्रयास rebase;) (जो भी इस्तेमाल किया VCScs उपकरण)

नोट:
दो अन्य Git बाहरी diff उपकरण सेटिंग्स ("Setting up diff and merge tools for Git on Windows" और "Setting up SourceGear DiffMerge with Git") अधिक उम्मीदें नहीं देते जब यह बाहरी diff उपकरण बंद करने नहीं करने के लिए आ ...

+1

पर्याप्त सच है। :-) सैनिटी चेक के लिए धन्यवाद। आप और दूसरों को विलय करने के लिए क्या उपयोग कर रहे हैं? बस अपनी पसंद के संपादक में फाइलें खोलना? –

+0

मैं विंडोज पर WinMerge का उपयोग करता हूं, लेकिन मुझे आपके जैसे प्रत्येक रिज़ॉल्यूशन के बाद इसे बंद करना होगा। – VonC

12
mergetool के लिए समस्या

है कि यह जानबूझ कर किसी मर्ज सत्र और फिर इंतजार करता है आरंभ करने के लिए एक कमांड लाइन इंटरफेस का उपयोग करता है उपयोगकर्ता द्वारा निर्धारित किए जाने के लिए वापस आने के लिए आवंटित आदेश के लिए संचालित विलय पूरा हो गया है।

अधिकतर विलय उपकरण पहले से चल रहे प्रक्रिया में विलय सत्र शुरू करने के लिए कमांड लाइन तंत्र प्रदान नहीं करते हैं, यह निर्धारित करने के लिए कि संकल्प पूरा हो गया है या नहीं या नहीं।

यह कल्पना की जा सकती है कि कुछ विलय उपकरण इस कार्यक्षमता को एक अलग रैपर कमांड और कुछ प्रकार के आईपीसी के माध्यम से प्रदान कर सकते हैं, लेकिन यह सामान्य उपकरण और जेनेरिक मेरेटूल प्रोग्राम में कार्यान्वित करना मुश्किल होगा।

+1

मैं इस विश्लेषण से सहमत हूं। +1 – VonC

+0

गिट मर्ज लक्ष्य अपडेट (बदला गया) के आधार पर "विलय सफलता स्थिति" निर्धारित कर सकता है। फिर यदि मैं "विलय को सहेजता हूं", तो इसका तात्पर्य है कि मैंने सफलतापूर्वक पूरा किया। अन्यथा यह नहीं था। लेकिन शायद इस उपयोग के मामले के लिए 2-चरण विलय की आवश्यकता है। – phord

+0

@phord: यह ऐसा टूल के लिए करता है जो उनके रिटर्न वैल्यू के माध्यम से किसी स्थिति की रिपोर्ट नहीं करते हैं, लेकिन इससे इस मामले में मदद नहीं मिलती है क्योंकि उपकरण सत्र के रूप में स्थिति की जांच करने के लिए गिट के लिए उपयुक्त होने पर अभी भी कोई संकेत नहीं होगा पहले ही शुरू हो चुका था और मर्ज पूरा होने के बाद आगे बढ़ सकता है। –

22

अपनी पसंद के mergetool का समर्थन करता है एक मौजूदा उदाहरण में फ़ाइलों को खोलने, आप कमांड अपना Git config में निर्दिष्ट कर सकते हैं, तो:

% git config mergetool.whatever_you_want.cmd 'exec /path/to/merge/tool $LOCAL $MERGED $REMOTE' 
% git config merge.tool whatever_you_want 

git mergetool तो अपने कस्टम आदेश पर अमल और उसके बाद क्या फ़ाइल के रूप में संकेत देगा सफलतापूर्वक विलय कर दिया गया था (निकास कोड को देखने के बदले में)।

एक उदाहरण मैं सिर्फ vimdiff के लिए एक साथ काट दिया:

% git config mergetool.persistent.cmd 'gvim --remote-tab-silent "+set buftype=nowrite" "$PWD/$BASE" && sleep 1; gvim --remote-send ":split $PWD/$REMOTE<CR>:set buftype=nowrite<CR>:vertical diffsplit $PWD/$MERGED<CR>:vertical diffsplit $PWD/$LOCAL<CR>:set buftype=nowrite<CR><C-W>l"' 

यह काफी अच्छी तरह से काम करता है, मैं इसे अपने आप का उपयोग शुरू कर सकते हैं!

+0

दिलचस्प। मैं WinMerge के साथ कोशिश करेंगे। +1 – VonC

+0

मुझे स्वीकार करना है, यह बहुत बढ़िया है। निश्चित रूप से देखना होगा कि मैं मेल्ड के लिए क्या कर सकता हूं। –

+0

ऐसा लगता है कि इस तरह से मेल्ड का उपयोग करने की अनुमति देने के लिए लंबित पैच और बग टिकट है: http://bugzilla.gnome.org/show_bug.cgi?id=453670 –

संबंधित मुद्दे