2013-01-06 102 views
12

मान लेते हैं कि मैं foo/bar.txt पर किसी मर्ज संघर्ष प्राप्त करते हैं जब चल रहा है इस:वर्तमान शाखा में संस्करण ले कर स्वचालित रूप से गिट संघर्ष को कैसे हल करें?

$ git checkout A 
$ git merge B 

मैं स्वचालित रूप से शाखा ए से foo/bar.txt लेकर संघर्ष का समाधान करना चाहते हैं (मैं जानता हूँ कि मैं क्या कर रहा हूँ, और मैं । इस की क्या ज़रूरत है शाखा बी में संस्करण गलत है, और मैं इस मामले में काम कर पेड़ में परिवर्तनों को खोने के बारे में परवाह नहीं है) ऐसा लगता है कि मैं इसे इन आदेशों चलाकर कर सकते हैं:।

$ git reset foo/bar.txt 
$ git checkout foo/bar.txt 

है वहाँ एक सरल, सिंगल कमांड समाधान है?

दुर्भाग्य से ये आदेश foo/bar.txt बदलते हैं भले ही कोई संघर्ष न हो, और मुझे वह नहीं चाहिए। यदि कोई संघर्ष नहीं है, तो मैं foo/bar.txt को जो भी राज्य git merge B में छोड़ना चाहता हूं उसे छोड़ना चाहता हूं।

तो मुझे यूनिक्स शेल कमांड की आवश्यकता है, जो पता लगाएगा कि foo/bar.txt में कोई संघर्ष है या नहीं, और यदि ऐसा है, तो यह वर्तमान शाखा से foo/bar.txt का संस्करण ले कर संघर्ष को हल करेगा। यह कुछ और नहीं करेगा, यानी यह अन्य फाइलों को संशोधित नहीं करेगा, यह बदलाव नहीं करेगा, और अगर उस फ़ाइल में कोई संघर्ष नहीं है तो यह foo/bar.txt नहीं बदलेगा।

+0

रिमोट: http://stackoverflow.com/questions/528659/git-automatic-conflict-resolution –

उत्तर

10

आप एक बंद के रूप में यह करना चाहते हैं, एकल लाइन आदेश है:

$ git checkout --ours foo/bar.txt # <-- resets it only if the merge found conflicts in this file 
$ git checkout HEAD -- foo/bar.txt # <-- resets it to that specific version no matter what 

Git के मर्ज कॉन्फ़िगर करने के लिए स्थायी रूप से एक स्थानीय बदल फाइल करने के लिए सभी नदी के ऊपर परिवर्तनों को अनदेखा करने के लिए:

$ git config merge.pin.driver true 
$ echo foo/bar.txt merge=pin >> .git/info/attributes 

(true ऊपर सिर्फ यूनिक्स true आदेश है, इसकी सफलता यह यह करने के लिए कुछ नहीं कर रहे द्वारा इस मामले में, स्थानीय संस्करण सही लग रही बनाया कहते हैं। आप निश्चित रूप से अपने मर्ज कमांड के साथ अधिक परिष्कृत हो सकते हैं।)

मुझे लगता है कि आप merge --strategy=ours या --strategy-option=ours नहीं चाहते हैं, जो पूरे विलय पर लागू होते हैं।

+0

सूचनात्मक उत्तर के लिए धन्यवाद (+1), मैंने इसे गिट के बारे में बहुत कुछ सीखा है। – pts

6

आप मर्ज रणनीति विकल्प oursrecursive (डिफ़ॉल्ट) मर्ज रणनीति में निर्दिष्ट कर सकते हैं। यह एक सामान्य विलय करेगा, लेकिन विवादित शिकारी के मामले में वर्तमान शाखा का संस्करण चुनना होगा।

git checkout A 
git merge -Xours B 
+0

इस अतिरिक्त जानकारी के लिए धन्यवाद। दुर्भाग्यवश यह मेरे प्रश्न का उत्तर नहीं देता है, क्योंकि 'गिट मर्ज बी' कमांड (और संभवतः कई अन्य असामान्य फाइल सिस्टम परिवर्तन) पहले ही चल चुके हैं। – pts

+0

यदि आप पहले से ही मर्ज कमांड चला चुके हैं, तो आपको 'रीसेट एंड चेकआउट' विधि का उपयोग करना होगा। – knittl

+0

रीसेट + चेकआउट विधि मेरे प्रश्न का उत्तर नहीं है, क्योंकि यदि कोई संघर्ष नहीं है तो यह नो-ऑप नहीं है (विवरण के लिए प्रश्न देखें)। – pts