Git फ़ाइल के किस संस्करण का अंत में उपयोग किया जाएगा: LOCAL, BASE या REMOTE?


174

के दौरान एक collison वहाँ जब git merge, मैं एक mergetool बुलाया खोलने मिलकर एक हो जाना । यह तीन फाइलें खोलता है LOCAL, BASE और REMOTE। जैसा कि मैंने पढ़ा है LOCAL मेरी स्थानीय शाखा है, BASE सामान्य पूर्वज है और REMOTE विलय होने वाली शाखा है।

अब मेरे प्रश्न के लिए: फ़ाइल का कौन सा संस्करण अंत में उपयोग किया जाएगा? क्या यह रिमोट है? यदि हां, तो क्या मैं इसे संपादित कर सकता हूं, जैसे कि चाहे, उदाहरण के लिए आधार शाखा में क्या है?

जवाबों:


142

यह बीच में से एक है BASE:।

वास्तव में, BASEसामान्य पूर्वज नहीं है, लेकिन आधे-अधूरे विलय से जहां संघर्षों को चिह्नित किया जाता है >>>>और <<<<

आप मेल संपादन विंडो के शीर्ष पर फ़ाइल नाम देख सकते हैं।

यहाँ स्क्रीनशॉट देखें

पिघला हुआ आधार

आप BASEफ़ाइल को संपादित कर सकते हैं जैसा कि आप चाहते हैं या बिना मेल्ड कमांड का उपयोग किए।
आप मेल्ड से भी छुटकारा पा सकते हैं और अपने पसंदीदा टेक्स्ट एडिटर के साथ फाइल को एडिट कर सकते हैं।

  • मर्ज के बीच कोड <<<< HEADऔर =====मार्कर के बीच आपकी स्थानीय फ़ाइल में से एक है।
  • के बीच का कोड ====और >>>> <branch name>रिमोट फाइल में से एक है।

3
कुछ लोगों को एक फ़ाइल में परस्पर विरोधी विखंडन की बेहतर समझ मिलती है जो डिफ़ॉल्ट के बजाय merge.conflictstyleकॉन्फ़िगरेशन विकल्प सेट होने पर स्वचालित विलय में विफल हो diff3जाता है merge
कोस्टिक्स

3
मैं वास्तव में HEAD, <<< और === गाना नहीं देखता। मामले में आप प्रदान मध्य खिड़की खाली हो जाएगा। लेकिन यह सिर्फ दूसरों के लिए एक नोट है, आपके उत्तर के लिए thx।
tususanka

आप नहीं देखते हैं HEAD, <<<<<और =====संकेत, इसका मतलब है सब पर कोई विवाद नहीं है। इस स्थिति में, मध्य विंडो खाली नहीं होगी, यह मर्ज का परिणाम दिखाएगा, लेकिन कोई "लाल" भाग नहीं होगा
फैबिन क्वात्रावाक्स

10
जब मैं मिलकर एक हो जाना के साथ विलय कर रहा हूँ, मैं किसी भी दिख रहा है नहीं <<<<<<, ======और न ही >>>>>>मध्य फलक में मार्कर (आधार संस्करण यानी) या तो; और कभी-कभी, मध्य फलक खाली होगा, जैसे कि aGr ने रिपोर्ट किया था। हो सकता है कि यह अंतर अलग-अलग सेटिंग्स के कारण हो। जब मैं मिलकर एक हो जाना उपकरण शुरू, निम्न फ़ाइलें, उपलब्ध नहीं होगा यह सोचते हैं कि भंडार में फ़ाइल का नाम है X.java: X.java, X.java.orig, X.java.BACKUP.#, X.java.BASE.#, X.java.LOCAL.#, X.java.REMOTE.#, जहां #कुछ संख्या है। मर्ज परिणाम कॉलिंग बेस संस्करण भ्रामक है; बेहतर होगा।
तेमू लीस्टी

3
आधार वास्तव में सामान्य पूर्वज है, MERGED फ़ाइल का नाम है जिसमें आंशिक मर्ज जानकारी है। कृपया मेरे प्रश्न और उत्तर को देखें और अपने git difftool और mergetool के रूप में Meld की स्थापना और उपयोग करें जो यह बताता है कि यह कैसे काम करता है। HTH।
20

107

मेल्ड में एक छिपा हुआ 3-वे मर्ज सुविधा है जिसे 4 वें पैरामीटर में पास करके सक्रिय किया गया है:

meld $LOCAL $BASE $REMOTE $MERGED

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

मेरे द्वारा उपयोग की जाने वाली ~ / .gitconfig फ़ाइल में निम्नलिखित सेटिंग्स हैं:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

यह 3 टैब के साथ मेल खाता है, पहला और दूसरा टैब जिसमें साधारण अंतर है जिसे मैं मर्ज करने की कोशिश कर रहा हूं, और 3 टैब डिफ़ॉल्ट रूप से खुलता है, 3-तरफा मर्ज दृश्य दिखाता है।

अब, विशेषता छिपी होने का कारण यह है कि यह अभी तक पर्याप्त पॉलिश नहीं किया गया है। यह बहुत उपयोगी है क्योंकि यह अब है, लेकिन काई विलडसन, जो कि पिघले हुए लेखक हैं, ने कुछ झुर्रियों की ओर इशारा किया, जिन्हें इस्त्री करने की आवश्यकता होती है। उदाहरण के लिए 3-वे मर्ज मोड को शुरू करने के लिए कोई GUI नहीं है, कमांड लाइन सिंटैक्स थोड़ा आर्कन है, और ऐसा है। यदि आप अजगर बोलते हैं और आपके हाथों पर कुछ समय है - तो आप जानते हैं कि क्या करना है।

संपादित करें: मेल्ड के नए संस्करणों में, सिनैक्स थोड़ा बदल गया है। यह टिप्पणियों में था, लेकिन यह उत्तर में है।

मेल्ड कमांड अब --आउटपुट विकल्प का उपयोग करता है, इसलिए ऊपर के स्निपेट से अंतिम पंक्ति होनी चाहिए:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

7
@Jesse, @lumbric, ऐसा प्रतीत होता है कि नए संस्करण --outputमेल्ड $ $ MERGED परिणाम के लिए ध्वज का उपयोग करते हैं । मैंने इसे गट लॉन्च स्क्रिप्ट को देखते हुए खोजा, जो मेरे संस्करण git के साथ आई: github.com/git/git/blob/master/mergetools/meld
जोहान

1
@ लेम्ब्रिक का मानना ​​है कि यह मेल्ड 1.7.x + के लिए करता है --output option। इस लाइन को लॉन्च स्क्रिप्ट में देखें:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
जोहान

12
नवीनतम मेल्ड (संस्करण> 1.8.4) में, हमें --ऑटो-मर्ज विकल्प का उपयोग करना होगा। cmd = मेल्ड - डफ $ BASE $ LOCAL - डेली $ BASE $ REMOTE - ऑटो-मर्ज $ LOCAL $ BASE $ REMOTE
ऑउटपुट

7
मुझे मेल्डिंग 1.8.4 का उपयोग करके @pingpongboss जैसी ही समस्या थी: मेल टैब को 3 टैब खोलने के बजाय एक अलग फलक में चीजें खोल रहा था। आदेश आखिरकार काम ठीक है: cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED। तो, यह 3 टैब (अच्छा पुराना तरीका) खोलता है, ऑटो गैर-परस्पर विलय को मध्य में विलय करता है, जहां मध्य $ MERGED है, और इसे संघर्ष रिज़ॉल्यूशन आउटपुट के रूप में उपयोग किया जाएगा।
फार्मर

2
आउटपुट के लिए वाक्यविन्यास हो सकता है --output=<file>या -o <file>, देखेंmeld --help
लेवसा

57

इसमें 4 फाइलें शामिल हैं:

  1. $LOCALउस शाखा पर फ़ाइल जहाँ आप विलय कर रहे हैं; जब दिखाया गया है तो मर्ज प्रक्रिया से अछूता

  2. $REMOTEउस शाखा पर फ़ाइल जहाँ से आप विलय कर रहे हैं; जब दिखाया गया है तो मर्ज प्रक्रिया से अछूता

  3. $BASE$ LOCAL और $ REMOTE का सामान्य पूर्वज, यानी। वह बिंदु जहां दो शाखाओं ने माना फ़ाइल को बदलना शुरू कर दिया; जब दिखाया गया है तो मर्ज प्रक्रिया से अछूता

  4. $MERGEDआंशिक रूप से मर्ज की गई फ़ाइल, संघर्षों के साथ; यह केवल मर्ज प्रक्रिया द्वारा छुआ गया फ़ाइल है, और वास्तव में, आपको कभी नहीं दिखाया गया हैmeld


$MERGEDफ़ाइल एक ही है कि होता है <<<<<<, >>>>>>, =====(और, शायद, ||||||) मार्कर (कि परिसीमित संघर्ष)। यह वह फ़ाइल है जिसे आप संघर्षों को ठीक करने के लिए मैन्युअल रूप से संपादित करते हैं।

मैनुअल टकराव संपादन और दृश्य संघर्ष संपादन अलग-अलग फ़ाइलों पर किया जाता है और अलग-अलग informations प्रस्तुत किया जाता है।

Mergetool (मान का उपयोग करते समय meld), फ़ाइलों को उसमें देख रहे हैं कर रहे हैं: $LOCAL, $BASE, $REMOTE। ध्यान दें कि आप $MERGEDफ़ाइल को नहीं देखते हैं , हालाँकि इसे एक छिपे हुए पैरामीटर के रूप में पास किया गया हैmeld वहाँ संपादित किए गए परिणाम को लिखने के लिए ।

दूसरे शब्दों में meld, आप फ़ाइल को बीच में, फ़ाइल में संपादित कर रहे हैं $BASE, और आप बाईं ओर से या दाईं ओर से मैन्युअल रूप से सभी परिवर्तन उठाते हैं । यह एक साफ फ़ाइल है, जिसे मर्ज प्रक्रिया द्वारा स्पर्श नहीं किया गया है। एकमात्र गड़बड़ यह है कि जब आप सहेजते हैं, तो आप $BASEफ़ाइल में नहीं बचाते हैं , लेकिन चौथे छिपे हुए पैरामीटर में meld, वह $MERGEDफ़ाइल है (जिसे आप देखते भी नहीं हैं)। $BASEफ़ाइल है नहीं कोई विरोध या आंशिक सफल मर्ज के होते हैं, क्योंकि यह नहीं है $MERGEDफ़ाइल

दृश्य संपादन में, जब आपके पास $BASEफ़ाइल (फ़ाइल के बजाय $MERGED) पेश होती है, तो gitमूल रूप से विलय करने के लिए अपने सभी प्रयासों को छोड़ देता है (वे प्रयास दिखाई देते हैं, यदि आप $ MERGED फ़ाइल में चाहते हैं) और आपको पूरी तरह से विलय करने की अनुमति देता है खरोंच से

लब्बोलुआब यह है कि मैनुअल और विजुअल मर्जिंग टकराव में आप एक ही फाइल को नहीं देख रहे हैं, लेकिन अंतिम परिणाम उसी फाइल में लिखा है (वह $MERGEDफाइल है)।

संघर्ष के मैनुअल सुधार पर किया जाता है $MERGEDक्योंकि git इसका मतलब नहीं है कि आप तीन फ़ाइलों पेश करने के लिए, तो यह तीन फ़ाइलें (से जानकारी squashes $LOCAL, $BASE, $REMOTEकि में) $MERGEDफ़ाइल।

लेकिन दृश्य उपकरण साधन आप तीन फ़ाइलों को दिखाने के लिए: वे आपको बताएंगे कि $LOCAL, $BASE, $REMOTEफ़ाइलें। आप फ़ाइलों $LOCALऔर $REMOTEफ़ाइलों से परिवर्तन उठा रहे हैं और आप $BASEफ़ाइल में ला रहे हैं , पूरी तरह से फिर से निर्माण कर रहे हैं और यहां तक ​​कि $MERGEDफ़ाइल के विलय के असफल प्रयास को भी लिख रहे हैं ।


मैं बस चाहता था कि उपकरण हों (तुलना से परे) जो सभी 4 फाइलों को दिखाते हैं
yoniLavi

@yoniYalovitsky: हाँ, या p4merge
user1284631

मैंने क्लियरकेस पैकेज से मर्ज टूल का उपयोग किया
mishmashru

@yoniLavi - अच्छी तरह से ये उपकरण 4 पैन दिखाते हैं , लेकिन जरूरी नहीं कि इस उत्तर में वर्णित सभी चार फाइलें हों। विशेष रूप से, आप आप को दिखाने के लिए इन 4-फलक उपकरण स्थापित कर सकते हैं $LOCAL, $REMOTE, $BASEऔर उत्पादन शुरू में करने के लिए बराबर $BASEहै, लेकिन जो से अलग है $MERGEDमें है कि उस पर फ़ाइलें और संघर्ष मार्करों और इसलिए विलय करने के लिए Git की कोशिश नहीं है। वास्तव में, यह इन उपकरणों का उपयोग करने का तरीका होगा जो LOCAL / REMOTE / BASE + OUTPUT के 3-फलक दृष्टिकोण के समान है, जो मर्ज नहीं दिखाता है। 4 वें फलक बस आपको आउटपुट से आधार को अलग करने की अनुमति देता है।
बीऑनरोप

16

Cosmin का समाधान काम करता है, लेकिन $ BASE फ़ाइल अपडेट की गई है - $ MERGED नहीं । यह $ MERGED फ़ाइल को अपडेट करेगा :

मिलकर एक हो जाना: v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE

मैं इस बात की पुष्टि कर सकता हूं। उडस पर मेरे लिए सैड का समाधान काम करता है। जहाँ तक मूल प्रश्न है, यह वर्तमान सही उत्तर है।
कॉसमैन

3
मेल्ड के मेरे संस्करण में - 3.11, यह कमांड बढ़िया काम करता है:cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
मेल्ड के मार्टिन '

आपको आखिर में क्यों आवश्यकता होगी --diff $BASE $LOCAL --diff $BASE $REMOTE? मेरे लिए cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
१. as.४

1
@farmir: यह आवश्यक नहीं है। यह मेल में दो और टैब खोलता है ताकि आप व्यक्तिगत रूप से आधार के मुकाबले LOCAL और REMOTE देख सकें।
सैम कौफमैन 20

1
कोई फर्क नहीं पड़ता कि मैं उन तर्कों के साथ क्या आदेश देता हूं, तीन-तरफा टैब हमेशा तीसरा टैब होता है, जबकि पहला टैब हमेशा डिफ़ॉल्ट रूप से चुना जाता है। क्या डिफ़ॉल्ट रूप से चयनित तीन-तरफ़ा टैब बनाने का कोई तरीका है?
सैम कॉफ़मैन

13

मेल्ड 1.7 के साथ टोमेक बरी द्वारा समाधान अब काम नहीं करता है।

डिफ़ॉल्ट सेटिंग्स मुझे पूरा नहीं किया:

डिफ़ॉल्ट सेटिंग्स

मेल्ड> = 1.7 के बजाय मैं दो अन्य समाधानों में से एक का सुझाव देता हूं।

पहला उपाय :

 meld $LOCAL $BASE $REMOTE --auto-merge

पहला उपाय

दूसरा उपाय :

 meld $LOCAL $MERGED $REMOTE

दूसरा उपाय

.gitconfig

.gitconfigउपरोक्त वर्णित समाधान प्राप्त करने के लिए अपनी फ़ाइल में इसे कॉपी और पेस्ट करें :

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

.gitconfig.localइस मशीन के लिए केवल इस मशीन के लिए meld17 या meld16 को सेट करने के लिए इसे कॉपी और पेस्ट करें यदि आप कई मशीनों के लिए अपने .gitconfig का उपयोग करते हैं:

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17

यह मेल्ड 1.8.4 पर काम नहीं करता है। यदि आप चलाते हैं cmd = meld $LOCAL $BASE $REMOTE --auto-merge, तो मध्य फलक $ BASE होगा, न कि $ MERGE जो वास्तव में संघर्ष समाधान के आउटपुट के रूप में उपयोग किया जाता है।
फार्मिर

1
@farmir आपने दूसरे टैब के रूप में $ BASE चुना।
एलेक्स78

11

मैंने पाया कि दिखाई गई डिफ़ॉल्ट फ़ाइलों में से कोई भी सहेजा नहीं जा रहा था। मेल दिखा रहा था $LOCAL, $REMOTEऔर $BASEडिफ़ॉल्ट रूप से। इसे काम करने के लिए, मुझे $MERGEDइसके बजाय मेल्ड शो बनाने की आवश्यकता थी $BASE। यह मेरे ~/.gitconfigलिए यह तय में डाल :

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

मैं आर्क का उपयोग कर रहा हूं:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1

क्षमा करें, क्या यह कॉन्फ़िगरेशन inux संगत है?
20

2

किसी कारणवश मेल के नवीनतम संस्करण संघर्षों के लिए जोड़े गए मार्कर लाइनों को प्रदर्शित नहीं करते हैं (<<<<<<<<<, =======, >>>>>>>)। यदि आप उन पंक्तियों को देखना चाहते हैं, तो आपको meld v 1.3.3 या पिछले स्थापित करना चाहिए।



2

कृपया सही उत्तर के लिए साद का उत्तर देखें।

उबंटू पर मैं 1.8.1 के साथ मिल रहा था

-diff को दिए गए तर्कों की गलत संख्या

और $ MERGED से पहले -आउटपुट जोड़ना मेरे लिए इसे निर्धारित करता है:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.