git - एक पुल के दौरान अपने परिवर्तन के पक्ष में गिट विलय विवादों को हल करें




git-merge git-conflict-resolution (6)

https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging

यह मूल रूप से नकली विलय करेगा। यह दोनों शाखाओं के साथ माता-पिता के रूप में एक नई विलय प्रतिबद्धता रिकॉर्ड करेगा, लेकिन यह उस शाखा को भी नहीं देखेगा जिसमें आप विलय कर रहे हैं। यह आपकी वर्तमान शाखा में सटीक कोड विलय के परिणाम के रूप में रिकॉर्ड होगा।

$ git merge -s ours mundo

'हमारी' रणनीति द्वारा मर्ज करें।

$ git diff HEAD HEAD~

आप देख सकते हैं कि हम जिस शाखा में थे और विलय के परिणाम के बीच कोई अंतर नहीं है।

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

यदि मैं एक नई विषय शाखा के परिवर्तनों को प्रतिबिंबित करने के लिए मास्टर चाहता हूं तो एक स्थिति मुझे उपयोगी साबित हुई है। मैंने देखा है कि -Xtheirs कुछ परिस्थितियों में संघर्ष के बिना विलय नहीं करता है ... उदाहरण के लिए

$ git merge -Xtheirs topicFoo 

CONFLICT (modify/delete): js/search.js deleted in HEAD and modified in topicFoo. Version topicFoo of js/search.js left in tree.

इस मामले में मैंने पाया समाधान था

$ git checkout topicFoo

विषय से, पहले हमारी रणनीति का उपयोग कर मास्टर में विलय करें, यह नकली प्रतिबद्धता बनाएगा जो सिर्फ विषय की स्थिति है। $ git विलय - हमारा मास्टर है

बनाई गई मर्ज प्रतिबद्धता की जांच करें

$ git log

अब मास्टर शाखा चेकआउट करें

$ git checkout master

विषय शाखा को वापस विलय करें लेकिन इस बार -Xtheirs रिकर्सिव रणनीति का उपयोग करें, यह अब आपको विषय की स्थिति के साथ एक मास्टर शाखा के साथ पेश करेगा।

$ git merge -X theirs topicFoo

खींचने वाले बदलावों के पक्ष में मैं गिट विलय संघर्ष को कैसे हल करूं?

मूल रूप से मुझे सभी संघर्ष-मुक्त परिवर्तनों को रखते हुए git mergetool साथ सभी संघर्षों के बिना किसी काम करने वाले पेड़ से सभी विरोधाभासी परिवर्तनों को हटाने की आवश्यकता होती है। खींचते समय इसे पसंद करते हुए, बाद में नहीं।


आप रिकर्सिव "उनके" रणनीति विकल्प का उपयोग कर सकते हैं:

git merge --strategy-option theirs

man :

ours
    This option forces conflicting hunks to be auto-resolved cleanly by 
    favoring our version. Changes from the other tree that do not 
    conflict with our side are reflected to the merge result.

    This should not be confused with the ours merge strategy, which does 
    not even look at what the other tree contains at all. It discards 
    everything the other tree did, declaring our history contains all that
    happened in it.

theirs
    This is opposite of ours.

नोट: जैसा कि मैन पेज कहता है, "हमारा" विलय रणनीति विकल्प "हमारी" विलय रणनीति से बहुत अलग है।


कृपया यह न करें कि कभी-कभी यह काम नहीं करेगा:

गिट चेकआउट - पथ पथ / फ़ाइल / फ़ाइल

या

गिट चेकआउट --थी पथ / से / फ़ाइल

मैंने इसके बजाय यह माना, हेड हमारा है और MERGE_HEAD उनका है

git checkout HEAD -- path/to/file

या:

git checkout MERGE_HEAD -- path/to/file

ऐसा करने के बाद और हम अच्छे हैं:

git add .

यदि आप और अधिक समझना चाहते हैं, तो यहां टॉरेक की अद्भुत पोस्ट देखें: गिट चेकआउट - आपकी फ़ाइलों को अनमोल फ़ाइलों की सूची से नहीं हटाता


ठीक है, उस परिदृश्य को चित्रित करें जिसमें मैं बस था:

आप merge प्रयास करते हैं, या शायद cherry-pick , और आप के साथ रुक गए हैं

$ git cherry-pick 1023e24
error: could not apply 1023e24... [Commit Message]
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

अब, आप विवादित फ़ाइल देखते हैं और आप वास्तव में अपने परिवर्तन नहीं रखना चाहते हैं। उपरोक्त मेरे मामले में, फाइल को केवल एक नई लाइन पर विवादित किया गया था, जिस पर मेरा आईडीई ऑटो-जोड़ा गया था। अपने परिवर्तनों को पूर्ववत करने और उनके स्वीकार करने के लिए, सबसे आसान तरीका यह है:

git checkout --theirs path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php

इसके विपरीत (आपके संस्करण के साथ आने वाले संस्करण को ओवरराइट करने के लिए) है

git checkout --ours path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php

हैरानी की बात है, मुझे नेट पर यह जवाब बहुत आसानी से नहीं मिला।


git pull -X theirs जवाब एक बदसूरत विलय प्रतिबद्धता बना सकते हैं, या एक मुद्दा जारी कर सकते हैं

त्रुटि: निम्न फ़ाइलों में आपके स्थानीय परिवर्तन विलय से ओवरराइट किए जाएंगे:

यदि आप रेपो से फ़ाइलों में किसी भी स्थानीय संशोधन को अनदेखा करना चाहते हैं, उदाहरण के लिए क्लाइंट पर जो हमेशा मूल का दर्पण होना चाहिए, इसे चलाएं (अपनी इच्छित शाखा के साथ master को प्रतिस्थापित करें):

git fetch && git reset --hard origin/master

यह कैसे काम करता है? git fetch git pull लेकिन विलय के बिना । फिर git reset --hard आपके काम करने वाले पेड़ को आखिरी प्रतिबद्धता से मेल खाता है। रेपो में फ़ाइलों में आपके सभी स्थानीय परिवर्तनों को discarded जाएगा, लेकिन नई स्थानीय फाइलें अकेले रह जाएंगी।


git pull -s recursive -X theirs <remoterepo or other repo>

या, बस, डिफ़ॉल्ट भंडार के लिए:

git pull -X theirs

यदि आप पहले से ही विवादित राज्य में हैं ...

git checkout --theirs path/to/file






git-conflict-resolution