Git में मर्ज विरोधों को कैसे हल करें


4763

मैं Git में मर्ज विरोधों को कैसे हल करूं?


30
निम्नलिखित ब्लॉग पोस्ट एक बहुत अच्छा उदाहरण देता है कि कैसे Git के साथ मर्ज संघर्ष को संभालना चाहिए जो आपको सही दिशा में जा रहा है। Git में संघर्ष और हैंडलिंग से बचना
mwilliams

4
आप एक मर्ज टूल (kdiff3 jebaird.com/2013/07/08/… ) को कॉन्फ़िगर कर सकते हैं और फिर git mergetool का उपयोग कर सकते हैं। जब आप बड़ी डेवलपर टीमों में काम कर रहे हैं तो आप हमेशा मर्ज संघर्ष का सामना करेंगे।
ग्रैडी जी कूपर

यह मत भूलो कि आप नियमित रूप से डाउनस्ट्रीम विलय करके अधिकांश मर्ज संघर्षों को कम कर सकते हैं!
एंट पी।


8
आकर्षक प्रश्न: 2008 में पूछे जाने पर, 100% खुला कोई संकेत नहीं है कि यह वास्तव में (GUI के बारे में क्या है? Git कमांड के बारे में? शब्दार्थ के बारे में? धक्का / खींचने या सिर्फ सामान्य टकराव के बारे में?) पूरी तरह से अचूक है। 30 उत्तर, उनमें से सभी (जहाँ तक एक त्वरित नज़र दिखाता है) कमोबेश विभिन्न diff3 और मर्ज टूल के बारे में चल रहा है, कोई भी स्वीकार नहीं करता है। टॉप-वोट किए गए उत्तर में एक कमांड का उल्लेख है जो डिफ़ॉल्ट gitस्थापना के साथ बॉक्स से बाहर भी काम नहीं करता है । आज, 2017 के मेरे लिए SE स्टार्ट पेज को हिट करने में सफल रहा, जिसमें 1.3m विचार और दोनों तरह से हजारों वोट थे। चित्त आकर्षण करनेवाला।
एओई

जवाबों:


2910

प्रयत्न: git mergetool

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

@JoshGlover टिप्पणी के अनुसार:

आदेश

जब तक आप एक स्थापित नहीं करते हैं, तब तक जरूरी नहीं है कि एक जीयूआई खोलें। git mergetoolमेरे लिए दौड़ने का vimdiffउपयोग किया गया। आप उसका उपयोग करना चाहते निम्नलिखित उपकरणों में से एक स्थापित कर सकते हैं: meld, opendiff, kdiff3, tkdiff, xxdiff, tortoisemerge, gvimdiff, diffuse, ecmerge, p4merge, araxis, vimdiff, emerge

नीचे vimdiffमर्ज संघर्ष के लिए उपयोग करने के लिए नमूना प्रक्रिया है । इस लिंक के आधार पर

चरण 1 : अपने टर्मिनल में निम्न आदेश चलाएँ

git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false

यह डिफ़ॉल्ट मर्ज टूल के रूप में vimdiff सेट करेगा।

चरण 2 : टर्मिनल में निम्नलिखित कमांड चलाएँ

git mergetool

चरण 3 : आपको निम्नलिखित प्रारूप में एक विमीडिफ डिस्प्ले दिखाई देगा

  ╔═══════╦══════╦════════╗
  ║       ║      ║        ║
  ║ LOCAL ║ BASE ║ REMOTE ║
  ║       ║      ║        ║
  ╠═══════╩══════╩════════╣
  ║                       ║
  ║        MERGED         ║
  ║                       ║
  ╚═══════════════════════╝

ये 4 विचार हैं

LOCAL - यह करंट ब्रांच से फाइल है

आधार - सामान्य पूर्वज, फ़ाइल दोनों परिवर्तनों से पहले कैसे दिखती थी

REMOTE - वह फ़ाइल जिसे आप अपनी शाखा में विलय कर रहे हैं

परिणाम - विलय परिणाम, यह वही है जो रेपो में सहेजा जाता है

आप इन दृश्यों का उपयोग करके ctrl+ के बीच नेविगेट कर सकते हैं w। आप सीधे ctrl+ के wबाद MERGED दृश्य तक पहुँच सकते हैं j

यहाँ और यहाँ vimdiff नेविगेशन के बारे में अधिक जानकारी

चरण 4 । आप निम्न तरीके से MERGED दृश्य संपादित कर सकते हैं

यदि आप REMOTE से परिवर्तन प्राप्त करना चाहते हैं

:diffg RE  

यदि आप BASE से परिवर्तन प्राप्त करना चाहते हैं

:diffg BA  

यदि आप LOCAL से परिवर्तन प्राप्त करना चाहते हैं

:diffg LO 

चरण 5 । सहेजें, बाहर निकलें, प्रतिबद्ध और साफ करें

:wqa सहेजें और vi से बाहर निकलें

git commit -m "message"

git clean अलग उपकरण द्वारा बनाई गई अतिरिक्त फ़ाइलें (जैसे * .orig) निकालें।


54
FYI करें git mergetool -yयदि आप एक बार में बहुत सारी फ़ाइलों को मर्ज कर रहे हैं, तो आप कुछ कीस्ट्रोक्स को बचाने के लिए उपयोग कर सकते हैं ।
davr

373
जब तक आप एक को स्थापित नहीं करते हैं, यह जरूरी नहीं है कि एक जीयूआई खोलें। git mergetoolमेरे लिए दौड़ने का vimdiffउपयोग किया गया। आप उसका उपयोग करना चाहते निम्नलिखित उपकरणों में से एक स्थापित कर सकते हैं: meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse ecmerge p4merge araxis vimdiff emerge
जोश ग्लोवर

31
अच्छी बात है जोश। Ubuntu पर मुझे मेल्ड के साथ सबसे अच्छी किस्मत मिली है, इसका तीन तरह से मर्ज प्रदर्शन बुरा नहीं है। OSX गिट पर एक अच्छा डिफ़ॉल्ट चुना।
पीटर बर्न्स

18
इससे केडीफ 3 खोला गया। जो मैं बिल्कुल कोई सुराग नहीं है कि कैसे उपयोग करना है।
डेविड मर्डोक

7
तुम भी अब तुलना 3 से परे ( git mergetool -t bc3) का उपयोग कर सकते हैं ।
अज़प १०

1702

यहां ऊपर से एक संभावित उपयोग-मामला है:

आप कुछ परिवर्तन करने जा रहे हैं, लेकिन उफ़, आप अद्यतित नहीं हैं:

git fetch origin
git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Updating a030c3a..ee25213
error: Entry 'filename.c' not uptodate. Cannot merge.

इसलिए आप अप-टू-डेट हो जाएं और फिर से प्रयास करें, लेकिन एक संघर्ष है:

git add filename.c
git commit -m "made some wild and crazy changes"
git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Auto-merging filename.c
CONFLICT (content): Merge conflict in filename.c
Automatic merge failed; fix conflicts and then commit the result.

इसलिए आप बदलावों पर एक नज़र डालते हैं:

git mergetool

ओह माय, ओह माय, अपस्ट्रीम ने कुछ चीजों को बदल दिया, लेकिन सिर्फ मेरे बदलाव का उपयोग करने के लिए ... नहीं ... उनके परिवर्तन ...

git checkout --ours filename.c
git checkout --theirs filename.c
git add filename.c
git commit -m "using theirs"

और फिर हम अंतिम समय का प्रयास करते हैं

git pull origin master

From ssh://gitosis@example.com:22/projectname
 * branch            master     -> FETCH_HEAD
Already up-to-date.

टा-दा!


19
यह सुपर सहायक था क्योंकि मुझे बाइनरी फ़ाइलों (कला संपत्ति) के साथ बहुत सारी मर्ज त्रुटियाँ हुई थीं और उन लोगों को विलय करना हमेशा विफल लगता है, इसलिए मुझे इसे हमेशा नई फ़ाइल के साथ अधिलेखित करने की आवश्यकता है और "मर्ज" नहीं करना चाहिए
पेट्रोनेट

188
सावधान! --Ours और --theirs का अर्थ उलटा है। --ours == दूरस्थ। - उनके == स्थानीय। देखेंgit merge --help
mmell

57
मेरे मामले में, मैं इस बात की पुष्टि करता हूं कि - Theirs = रिमोट रिपॉजिटरी, --ours = मेरे अपने स्थानीय रिपॉजिटरी। यह @mmell टिप्पणियों के विपरीत है।
आर्यो

24
@mmell केवल एक रिबास पर, जाहिरा तौर पर। देखेंthis question
नवीन

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

736

मुझे लगता है कि मर्ज उपकरण शायद ही कभी मुझे संघर्ष या संकल्प को समझने में मदद करते हैं। मैं आमतौर पर एक पाठ संपादक में संघर्ष मार्करों को देखने और पूरक के रूप में गिट लॉग का उपयोग कर रहा हूं।

यहां कुछ सलाह हैं:

टिप वन

सबसे अच्छी बात जो मुझे मिली है वह है "diff3" मर्ज संघर्ष शैली का उपयोग करना:

git config merge.conflictstyle diff3

यह इस तरह संघर्ष मार्करों का उत्पादन करता है:

<<<<<<<
Changes made on the branch that is being merged into. In most cases,
this is the branch that I have currently checked out (i.e. HEAD).
|||||||
The common ancestor version.
=======
Changes made on the branch that is being merged in. This is often a 
feature/topic branch.
>>>>>>>

मध्य भाग वह है जो आम पूर्वज जैसा दिखता था। यह उपयोगी है क्योंकि आप प्रत्येक शाखा पर क्या बदला गया था, इसकी बेहतर समझ पाने के लिए आप इसकी तुलना ऊपर और नीचे के संस्करणों से कर सकते हैं, जो आपको प्रत्येक बदलाव के उद्देश्य के बारे में बेहतर जानकारी देता है।

यदि संघर्ष केवल कुछ लाइनें हैं, तो यह आम तौर पर संघर्ष को स्पष्ट करता है। (यह जानना कि संघर्ष को कैसे ठीक किया जाए, यह बहुत अलग है; आपको इस बात से अवगत रहने की आवश्यकता है कि अन्य लोग क्या काम कर रहे हैं। यदि आप भ्रमित हैं, तो संभवतः उस व्यक्ति को अपने कमरे में कॉल करना सबसे अच्छा है ताकि वे देख सकें कि आप क्या देख रहे हैं। पर।)

यदि संघर्ष लंबा है, तो मैं तीन खंडों में से प्रत्येक को "अलग", "सामान्य" और "उनके" जैसे तीन अलग-अलग फ़ाइलों में काटूंगा और चिपकाऊंगा।

फिर मैं निम्नलिखित आदेशों को दो अलग-अलग हिस्सों को देखने के लिए चला सकता हूं जो संघर्ष का कारण बने:

diff common mine
diff common theirs

यह मर्ज टूल का उपयोग करने के समान नहीं है, क्योंकि मर्ज टूल में सभी गैर-परस्पर विरोधी भिन्न हॉक भी शामिल होंगे। मुझे लगता है कि विचलित होना।

टिप दो

किसी ने पहले से ही इसका उल्लेख किया है, लेकिन प्रत्येक भिन्न हंक के पीछे के इरादे को समझना आमतौर पर यह समझने के लिए बहुत उपयोगी है कि संघर्ष कहाँ से आया और इसे कैसे संभालना है।

git log --merge -p <name of file>

यह उन सभी कमिटों को दिखाता है जो आम पूर्वज और आपके द्वारा विलय किए जा रहे दो शीर्षों के बीच उस फ़ाइल को छूते थे। (इसलिए इसमें शामिल नहीं है कि विलय से पहले ही दोनों शाखाओं में मौजूद हैं।) इससे आपको ऐसे मतभेदों को अनदेखा करने में मदद मिलती है जो स्पष्ट रूप से आपके वर्तमान संघर्ष का कारक नहीं हैं।

टिप थ्री

स्वचालित टूल के साथ अपने परिवर्तनों को सत्यापित करें।

यदि आपके पास स्वचालित परीक्षण हैं, तो उन्हें चलाएं। यदि आपके पास एक लिंट है , तो उसे चलाएं। यदि यह एक निर्माण करने योग्य परियोजना है, तो इसे बनाने से पहले इसे बनाएं, आदि सभी मामलों में, आपको यह सुनिश्चित करने के लिए थोड़ा परीक्षण करने की आवश्यकता है कि आपके परिवर्तन कुछ भी नहीं तोड़ते हैं। (हेक, संघर्षों के बिना भी एक मर्ज काम कोड को तोड़ सकता है।)

टिप चार

आगे की योजना; सहकर्मियों के साथ संवाद।

आगे की योजना बनाना और इस बारे में जागरूक होना कि अन्य लोग किस पर काम कर रहे हैं, मर्ज टकराव को रोकने और / या पहले उन्हें हल करने में मदद कर सकते हैं - जबकि विवरण अभी भी दिमाग में ताजा हैं।

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

कोड की एक बड़ी संख्या में कटौती करने वाले प्रमुख रिफैक्टोरिंग्स के लिए, आपको दृढ़ता से काम करने पर विचार करना चाहिए: हर कोई कोड के उस क्षेत्र पर काम करना बंद कर देता है, जबकि एक व्यक्ति पूर्ण रीफैक्टरिंग करता है।

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

टिप पाँच

यदि आप किसी मर्ज के अनिश्चित हैं, तो इसे लागू न करें।

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

लंबे समय में, आगे की योजना बनाना और दूसरों के साथ काम करने के बारे में जागरूक होना मर्ज संघर्षों की आशंका के लिए सबसे अच्छा उपकरण हैं और कम समय में उन्हें सही ढंग से हल करने के लिए खुद को तैयार करें।


6
मर्ज के साथ diff3 विकल्प एक शानदार विशेषता है। एकमात्र जीयूआई जो मुझे पता चला है कि यह पेरफोर्स है p4merge, जिसे पेरफोर्स के अन्य उपकरणों से अलग से स्थापित और उपयोग किया जा सकता है (जिसका मैंने उपयोग नहीं किया है, लेकिन शिकायतों के बारे में सुना है)।
अलक्षेंद्र

3
एक रिबेस के प्रयास के बाद जो मर्ज संघर्ष हुआ: $ git log --merge -p build.xml आउटपुट: घातक: - बिना MERGE_HEAD के?
एड रान्डल

क्या होगा अगर मेरे पास ब्रांच 1 से एक फाइल में बदलाव है और ब्रांच 2 में उस फाइल को डिलीट करना है। मैं उस मर्ज संघर्ष को कैसे हल कर सकता हूं? क्या जीआईटी का उपयोग करने का कोई तरीका है जहां मैं उन्हें एक शाखा के परिवर्तनों को रखकर विलय कर सकता हूं?
हनी

git config merge.conflictstyle diff3- धन्यवाद महोदय। यह आश्चर्यजनक है और मुझे एक अच्छे 3 तरीके से GUI मर्ज करने के लिए (और $ $) खोजने की कोशिश करने से मुक्त कर दिया है। IMO यह बेहतर है क्योंकि यह सामान्य पूर्वजों के साथ-साथ स्थानीय / रिमोट को दिखाता है , और अंतिम प्रतिबद्ध लॉग लाइनों को दिखाता है जो (AFAIK) कोई GUI नहीं करता है। यह निश्चित रूप से यह पहचानने में आपकी मदद करता है कि कोड किस शाखा से संबंधित है।
ffxsam 16

मैंने पाया है कि कभी-कभी diff3 परस्पर विरोधाभासी परिणाम में काफी भिन्नताएं होती हैं, जो कि काफी हद तक समान होती हैं, जबकि डिफ़ॉल्ट छोटे, अधिक प्रबंधनीय, चड्डी का उत्पादन करेगा। दुर्भाग्य से, मेरे पास एक रिप्रोड्यूसर नहीं है जिसे मैं बग रिपोर्ट के लिए उपयोग कर सकता हूं। लेकिन अगर आप इस समस्या का सामना करते हैं तो आप अस्थायी रूप से विकल्प को बंद करने पर विचार कर सकते हैं।
डेव अब्राम्स

348
  1. पहचानें कि कौन सी फाइलें संघर्ष में हैं (गिट आपको यह बताना चाहिए)।

  2. प्रत्येक फ़ाइल खोलें और डिफरेंसेस की जांच करें; गिट उन्हें सीमांकित करता है। उम्मीद है कि यह स्पष्ट होगा कि प्रत्येक ब्लॉक को किस संस्करण को रखना है। आपको इसे उन साथी डेवलपर्स के साथ चर्चा करने की आवश्यकता हो सकती है जिन्होंने कोड को प्रतिबद्ध किया है।

  3. एक बार जब आप एक फ़ाइल में संघर्ष को हल कर लेते हैं git add the_file

  4. एक बार जब आप हल कर लेते हैं सभी संघर्षों को , तो आप git rebase --continueजो कुछ भी करते हैं उसे पूरा करने के लिए Git या जो कुछ भी कहा जाता है।


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

7
सामग्री है, संघर्ष होता है क्योंकि सामग्री के 2 संस्करण हैं। इसलिए "गिट ऐड" सही नहीं लगता है। और यह काम नहीं करता है (git add, git प्रतिबद्ध) यदि आप केवल यही चाहते हैं कि संघर्ष के बाद एक फ़ाइल हल हो जाए ("घातक: मर्ज के दौरान आंशिक कमिट नहीं कर सकता है")
Dainius

1
हां, तकनीकी रूप से, यह उस प्रश्न का उत्तर देता है, जो पूछा गया है, लेकिन मेरे विचार में, खेदजनक जवाब नहीं है। एक शाखा को दूसरे के समान बनाने की बात क्या है ? बेशक एक मर्ज संघर्ष होगा ..
Thufir

5
तूलिका: जिसने एक शाखा को दूसरे के समान बनाने के बारे में कुछ कहा? अलग-अलग परिदृश्य हैं जहां आपको "एक शाखा को दूसरे के समान बनाने" के बिना विलय करने की आवश्यकता है। एक वह है जब आप एक विकास शाखा के साथ काम करते हैं और अपने परिवर्तन को मास्टर शाखा में सम्मिलित करना चाहते हैं; इसके बाद, विकास शाखा को हटाया जा सकता है। एक और है जब आप अपने विकास शाखा को फिर से बनाना चाहते हैं, ताकि मास्टर में अंतिम विलय को आसान बनाया जा सके।
तैमू लीस्ती

4
git addसूचकांक में @JustinGrant चरणों की फाइलें; यह भंडार में कुछ भी नहीं जोड़ता है। git commitभंडार में चीजें जोड़ता है। यह उपयोग मर्ज के लिए समझ में आता है - मर्ज स्वचालित रूप से उन सभी परिवर्तनों को चरणबद्ध करता है जिन्हें स्वचालित रूप से मर्ज किया जा सकता है; यह आपकी ज़िम्मेदारी है कि आप बाकी बदलावों को मर्ज करें और जब आप कर लें तो उन्हें इंडेक्स में जोड़ें।
मार्क ई। हेस

105

स्टैक ओवरफ्लो प्रश्न में उत्तरों की जांच करें , विशेष रूप से चार्ल्स बेली के उत्तर में मर्ज को समाप्त करना , जो दिखाता है कि फ़ाइल के विभिन्न संस्करणों को समस्याओं के साथ कैसे देखा जाए, उदाहरण के लिए,

# Common base version of the file.
git show :1:some_file.cpp

# 'Ours' version of the file.
git show :2:some_file.cpp

# 'Theirs' version of the file.
git show :3:some_file.cpp

"Git checkout -m" के लिए "-m" विकल्प देखें - यह आपको अलग-अलग मक्खियों को वापस अपने कार्यक्षेत्र में निकालने की अनुमति देता है
22

इससे मैं बच गया। प्रत्येक फ़ाइल को अलग से देखने से मुझे यह याद रखने की अनुमति मिलती है कि मैं प्रत्येक शाखा में क्या करने जा रहा था। तब मैं चुनने का निर्णय ले सकता था।
रोहड़ू

99

एक ही समय में किसी फ़ाइल में परिवर्तन किए जाने पर मर्ज विरोध होता है। इसे हल करने का तरीका बताया गया है।

git CLI

जब आप विवादित स्थिति में होते हैं, तो यहां सरल कदम हैं:

  1. के साथ विवादित फ़ाइलों की सूची पर ध्यान दें: git status(नीचे)Unmerged paths खंड के ) ।
  2. प्रत्येक फ़ाइल के लिए अलग-अलग संघर्षों को निम्नलिखित तरीकों से हल करें:

    • संघर्षों को हल करने के लिए GUI का उपयोग करें: git mergetool (सबसे आसान तरीका)।

    • दूरस्थ / अन्य संस्करण स्वीकार करने के लिए, उपयोग करें: git checkout --theirs path/file :। यह आपके द्वारा उस फ़ाइल के लिए किए गए किसी भी स्थानीय परिवर्तन को अस्वीकार कर देगा।

    • स्थानीय / हमारे संस्करण को स्वीकार करने के लिए, उपयोग करें: git checkout --ours path/file

      हालाँकि, आपको सावधान रहना चाहिए, क्योंकि दूरस्थ परिवर्तन जो किसी कारण से टकराव का कारण बने थे।

      Related: "हमारा" और "उनका" git में सटीक अर्थ क्या है?

    • विवादित फ़ाइलों को मैन्युअल रूप से संपादित करें और बीच में कोड ब्लॉक की तलाश करें <<<<</ >>>>>फिर संस्करण को ऊपर या नीचे से चुनें =====। देखें: कैसे टकराव प्रस्तुत किया जाता है

    • पथ और फ़ाइल नाम संघर्ष git add/ द्वारा हल किया जा सकता है git rm

  3. अंत में, उपयोग करने के लिए तैयार फाइलों की समीक्षा करें git status:।

    यदि आपके पास अभी भी कोई फ़ाइल है Unmerged paths, और आपने संघर्ष को मैन्युअल रूप से हल किया है, तो Git को बताएं कि आपने इसे हल किया है git add path/file:।

  4. यदि सभी संघर्षों को सफलतापूर्वक हल किया गया था, तो इन परिवर्तनों को पूरा करें: git commit -aऔर हमेशा की तरह रिमोट पर पुश करें।

यह भी देखें: GitHub में कमांड लाइन से एक मर्ज संघर्ष का समाधान

व्यावहारिक ट्यूटोरियल के लिए, देखें: परिदृश्य 5 - कैटाकोडा द्वारा फिक्सिंग मर्ज संघर्ष

DiffMerge

मैंने सफलतापूर्वक डिफमार्गर का उपयोग किया है जो विंडोज़, मैकओएस और लिनक्स / यूनिक्स पर फाइलों की तुलना और विलय कर सकता है।

यह ग्राफिक रूप से 3 फ़ाइलों के बीच परिवर्तन दिखा सकता है और यह स्वचालित विलय (जब ऐसा करने के लिए सुरक्षित है) और परिणामस्वरूप फ़ाइल को संपादित करने पर पूर्ण नियंत्रण की अनुमति देता है।

DiffMerge

छवि स्रोत: डिफमार्गर (लिनक्स स्क्रीनशॉट)

बस इसे डाउनलोड करें और रेपो में चलाएं:

git mergetool -t diffmerge .

मैक ओ एस

MacOS पर आप के माध्यम से स्थापित कर सकते हैं:

brew install caskroom/cask/brew-cask
brew cask install diffmerge

और शायद (यदि प्रदान नहीं किया गया है) आपको अपने PATH (उदा /usr/bin) में रखे गए अतिरिक्त सरल आवरण की आवश्यकता है :

#!/bin/sh
DIFFMERGE_PATH=/Applications/DiffMerge.app
DIFFMERGE_EXE=${DIFFMERGE_PATH}/Contents/MacOS/DiffMerge
exec ${DIFFMERGE_EXE} --nosplash "$@"

फिर आप निम्नलिखित कीबोर्ड शॉर्टकट का उपयोग कर सकते हैं:

  • - Alt- Up/ Downपिछली / अगली परिवर्तन करने के लिए कूद करने के।
  • - Alt- Left/ Rightबाएँ या दाएँ से परिवर्तन स्वीकार करने के लिए

वैकल्पिक रूप से आप opendiff (Xcode Tools का हिस्सा) का उपयोग कर सकते हैं जो आपको तीसरी फ़ाइल या निर्देशिका बनाने के लिए दो फ़ाइलों या निर्देशिकाओं को एक साथ मर्ज करने देता है।


79

यदि आप बार-बार छोटे-छोटे काम कर रहे हैं, तो कमेंट कमेंट को देखकर शुरू करें git log --merge। फिर git diffआपको संघर्ष दिखाएगा।

कुछ लाइनों से अधिक शामिल होने वाले संघर्षों के लिए, यह देखना आसान है कि बाहरी GUI उपकरण में क्या हो रहा है। मुझे opendiff पसंद है - Git भी vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff का समर्थन करता है, बॉक्स से बाहर निकलता है और आप दूसरों को स्थापित कर सकते हैं: git config merge.tool "your.tool"अपना चुना टूल सेट करेंगे और फिरgit mergetool एक विफल मर्ज के बाद आपको संदर्भ में अंतर दिखाएगा।

हर बार जब आप किसी संघर्ष को हल करने के लिए फ़ाइल को संपादित करते हैं, git add filenameतो सूचकांक को अपडेट करेगा और आपका फ़र्क अब नहीं दिखाएगा। जब सभी संघर्षों को संभाला जाता है और उनकी फ़ाइलों को git add-ed किया जाता है, तो git commitआपका मर्ज पूरा हो जाएगा।


8
"गिट ऐड" का उपयोग करना यहां वास्तविक चाल है। आप शायद कमिट भी नहीं करना चाहते (हो सकता है कि आप स्टैश करना चाहते हों), लेकिन आपको मर्ज को पूरा करने के लिए "git add" करना होगा। मुझे लगता है कि mergetool आपके लिए ऐड करता है (हालांकि यह मैनपेज में नहीं है), लेकिन यदि आप मर्ज मैन्युअल रूप से करते हैं, तो आपको इसे पूरा करने के लिए "git ऐड" का उपयोग करने की आवश्यकता है (भले ही आप कमिट नहीं करना चाहते)।
नोबार

47

देखें कि कैसे टकराव पेश किए जाते हैं या Git में,git merge समझने के लिए कि मर्ज संघर्ष मार्कर क्या हैं।

इसके अलावा, संघर्ष का समाधान कैसे करें अनुभाग बताता है कि संघर्षों को कैसे हल किया जाए:

संघर्ष देखने के बाद, आप दो काम कर सकते हैं:

  • विलय न करने का निर्णय करें। केवल क्लीन-अप्स की आपको आवश्यकता है कि सूचकांक फाइल HEADको रिवर्स 2. के लिए प्रतिबद्ध करें और 2. और 3; git merge --abortइसके लिए इस्तेमाल किया जा सकता है।

  • संघर्षों को हल करें। Git काम के पेड़ में संघर्षों को चिह्नित करेगा। फ़ाइलों को आकृति में और git addउन्हें अनुक्रमणिका में संपादित करें । git commitसौदे को सील करने के लिए उपयोग करें ।

आप कई उपकरणों के साथ संघर्ष के माध्यम से काम कर सकते हैं:

  • एक मेरिजेट का उपयोग करें। git mergetoolएक ग्राफिकल मेरिजेट लॉन्च करना जो आपको मर्ज के माध्यम से काम करेगा।

  • डिफरेंसेस को देखें। git diffदोनों HEADऔर MERGE_HEADसंस्करणों से परिवर्तन को उजागर करते हुए, तीन-तरफा अंतर दिखाएगा ।

  • प्रत्येक शाखा से भिन्न को देखें। git log --merge -p <path>शो पहले HEADसंस्करण और फिर संस्करण के लिए अलग होगा MERGE_HEAD

  • मूल को देखो। git show :1:filenameसामान्य पूर्वज git show :2:filenameदिखाता है, HEADसंस्करण दिखाता है , और संस्करण git show :3:filenameदिखाता है MERGE_HEAD

आप मर्ज संघर्ष मार्करों के बारे में भी पढ़ सकते हैं और प्रो गेट बुक सेक्शन बेसिक मर्ज संघर्ष में उन्हें कैसे हल करें ।


41

मैं या तो अपना या उनका संस्करण पूर्ण रूप से चाहता हूं, या व्यक्तिगत परिवर्तनों की समीक्षा करना चाहता हूं और उनमें से प्रत्येक के लिए निर्णय लेना चाहता हूं।

पूरी तरह से मेरे या उनके संस्करण को स्वीकार करते हैं :

मेरा संस्करण स्वीकार करें (स्थानीय, हमारा):

git checkout --ours -- <filename>
git add <filename>              # Marks conflict as resolved
git commit -m "merged bla bla"  # An "empty" commit

उनके संस्करण को स्वीकार करें (दूरस्थ, उनका):

git checkout --theirs -- <filename>
git add <filename>
git commit -m "merged bla bla"

यदि आप सभी संघर्ष फ़ाइलों को चलाना चाहते हैं:

git merge --strategy-option ours

या

git merge --strategy-option theirs

सभी परिवर्तनों की समीक्षा करें और उन्हें व्यक्तिगत रूप से स्वीकार करें

  1. git mergetool
  2. परिवर्तनों की समीक्षा करें और उनमें से प्रत्येक के लिए या तो संस्करण स्वीकार करें।
  3. git add <filename>
  4. git commit -m "merged bla bla"

डिफ़ॉल्ट कमांड लाइनmergetool में काम करता है । कमांड लाइन मर्जटूल का उपयोग कैसे करें यह एक अलग प्रश्न होना चाहिए।

आप इसके लिए विजुअल टूल भी इंस्टॉल कर सकते हैं , जैसे meldऔर रन

git mergetool -t meld

यह स्थानीय संस्करण (हमारा), "आधार" या "मर्ज" संस्करण (मर्ज का वर्तमान परिणाम) और दूरस्थ संस्करण (उनके) खोल देगा। समाप्त होने पर मर्ज किए गए संस्करण को सहेजें, git mergetool -t meldतब तक फिर से चलाएं जब तक कि आपको "कोई फ़ाइलों को विलय की आवश्यकता न हो", फिर चरण 3 और 4 पर जाएं।


यह कमांड: git checkout --theirs - <filename> ने सभी फाइलों को उनके लिए बदल दिया, न कि केवल <filename>
Donato

दरअसल मैं गलत था। यह केवल निर्दिष्ट फ़ाइल को अद्यतन करता है।
डोनटो

40

के लिए Emacs जो अर्द्ध मैन्युअल मर्ज संघर्ष को सुलझाने के लिए चाहते हैं उपयोगकर्ताओं:

git diff --name-status --diff-filter=U

उन सभी फ़ाइलों को दिखाता है जिनमें संघर्ष समाधान की आवश्यकता होती है।

उन फ़ाइलों में से प्रत्येक को एक-एक करके या एक बार में सभी खोलें:

emacs $(git diff --name-only --diff-filter=U)

Emacs में संपादन की आवश्यकता वाले बफर पर जाते समय, टाइप करें

ALT+x vc-resolve-conflicts

यह तीन बफ़र्स (मेरा, उनका और आउटपुट बफर) खोलेगा। 'N' (अगला क्षेत्र), 'p' (प्रीविज़न क्षेत्र) दबाकर नेविगेट करें। क्रमशः उत्पादन बफर में मेरा या उनका क्षेत्र कॉपी करने के लिए 'a' और 'b' दबाएँ। और / या आउटपुट बफर को सीधे संपादित करें।

जब समाप्त हो जाए: 'q' दबाएं। Emacs आपसे पूछता है कि क्या आप इस बफ़र को बचाना चाहते हैं: हाँ। बफर मार्क खत्म करने के बाद इसे टेरीनल से चलाकर हल किया जाता है:

git add FILENAME

जब सभी प्रकार के बफर के साथ समाप्त हो गया

git commit

मर्ज को समाप्त करने के लिए।


33

बक्शीश:

उपर्युक्त उत्तरों में पुल / भ्रूण / मर्ज की बात करते हुए, मैं एक दिलचस्प और उत्पादक चाल साझा करना चाहूंगा,

git pull --rebase

यह उपर्युक्त कमांड मेरे git जीवन में सबसे उपयोगी कमांड है जिसने बहुत समय बचाया।

अपने नए प्रतिबद्ध परिवर्तन को दूरस्थ सर्वर पर धकेलने से पहले, git pull --rebaseबल्कि git pullऔर मैन्युअल प्रयास करें mergeऔर यह स्वचालित रूप से नवीनतम दूरस्थ सर्वर परिवर्तनों (एक भ्रूण + मर्ज के साथ) को सिंक करेगा और आपकी स्थानीय नवीनतम प्रतिबद्ध को गिट लॉग में शीर्ष पर रखेगा। मैनुअल पुल / मर्ज के बारे में चिंता करने की आवश्यकता नहीं है।

संघर्ष के मामले में, बस का उपयोग करें

git mergetool
git add conflict_file
git rebase --continue

यहाँ विवरण प्राप्त करें: http://gitolite.com/git-pull--rebase


32

बस, यदि आप अच्छी तरह से जानते हैं कि रिपॉजिटरी में से किसी एक में परिवर्तन महत्वपूर्ण नहीं है, और दूसरे के पक्ष में सभी परिवर्तनों को हल करना चाहते हैं, तो उपयोग करें:

git checkout . --ours

अपनी रिपॉजिटरी के पक्ष में परिवर्तनों को हल करने के लिए , या

git checkout . --theirs

दूसरे या मुख्य भंडार के पक्ष में परिवर्तन को हल करने के लिए ।

या फिर आपको एक-एक करके फ़ाइलों के माध्यम से कदम रखने के लिए GUI मर्ज टूल का उपयोग करना होगा, मान लें कि मर्ज टूल है p4merge, या आपके द्वारा पहले से इंस्टॉल किए गए किसी भी नाम को लिखें

git mergetool -t p4merge

और एक फ़ाइल खत्म करने के बाद, आपको सहेजना और बंद करना होगा, इसलिए अगला एक खुल जाएगा।


2
गिट चेकआउट। --theirs का समाधान मेरी समस्या धन्यवाद
रमेश चन्द

यदि आप मैन्युअल रूप से Visual Studio Code में फ़ोल्डर खोलने का प्रयास करने का विरोध करना पसंद करते हैं, तो यह हर एक के अंदर संघर्ष और रंग संघर्ष लाइनों के साथ फाइलों को चिह्नित करता है
मोहम्मद सेलिम

31

Git में मर्ज संघर्ष को ठीक करने के लिए कृपया निम्नलिखित चरणों का पालन करें:

  1. Git स्टेटस जांचें: git स्टेटस

  2. पैचसेट प्राप्त करें: git fetch (अपने Git कमिट से सही पैच चेकआउट करें)

  3. एक स्थानीय शाखा की जाँच करें (यहाँ मेरे उदाहरण में temp1): git checkout -b temp1

  4. मास्टर से हाल की सामग्री खींचो: git खींच --rebase मूल मास्टर

  5. मेरिजेट शुरू करें और संघर्षों की जांच करें और उन्हें ठीक करें ... और अपनी वर्तमान शाखा के साथ दूरस्थ शाखा में बदलावों की जांच करें: मेरिटोल

  6. फिर से स्थिति की जाँच करें: गिट स्थिति

  7. स्थानीय रूप से मेरिजेट द्वारा बनाई गई अवांछित फाइलों को हटा दें, आमतौर पर मेरिजेट * .orig एक्सटेंशन के साथ अतिरिक्त फाइल बनाता है। कृपया उस फ़ाइल को हटा दें क्योंकि यह केवल डुप्लिकेट है और स्थानीय रूप से परिवर्तनों को ठीक करें और अपनी फ़ाइलों का सही संस्करण जोड़ें। git #your_changed_correct_files जोड़ें

  8. फिर से स्थिति की जाँच करें: गिट स्थिति

  9. उसी कमिट आईडी में बदलाव करें (यह एक नया अलग पैच सेट टालता है ): git प्रतिबद्ध --amend

  10. मास्टर शाखा को धक्का दें : गिट पुश (आपके गिट रिपॉजिटरी के लिए)


28

3 चरण हैं:

  1. खोजें कि कौन सी फाइलें कमांड द्वारा टकराव का कारण बनती हैं

    git status
    
  2. उन फाइलों की जाँच करें, जिनमें आपको चिन्हित संघर्ष की तरह मिलेगा

    <<<<<<<<head
    blablabla
    
  3. इसे अपने इच्छित तरीके से बदलें, फिर आज्ञाओं के साथ प्रतिबद्ध रहें

    git add solved_conflicts_files
    git commit -m 'merge msg'
    

मेरे लिए काम किया! धन्यवाद!
नुवान जयवर्धने

यदि आप रिबास के दौरान ऐसा करते हैं तो आपको ध्यान देना चाहिए। आपको git कमिट के बजाय git rebase --continue का उपयोग करना चाहिए
Samuel Dauzon

27

आप कई तरीकों से मर्ज टकराव को ठीक कर सकते हैं जैसे अन्य विस्तृत हैं।

मुझे लगता है कि वास्तविक कुंजी यह जान रही है कि स्थानीय और दूरस्थ रिपॉजिटरी के साथ परिवर्तन कैसे होता है। इसकी कुंजी ट्रैकिंग शाखाओं को समझना है। मैंने पाया है कि मैं ट्रैकिंग शाखा को अपने स्थानीय, वास्तविक फाइलों की निर्देशिका और रिमोट के बीच 'लापता टुकड़ा' के रूप में समझता हूं।

मैं व्यक्तिगत रूप से इससे बचने में मदद करने के लिए 2 चीजों की आदत में शामिल हो गया हूं।

के बजाय:

git add .
git commit -m"some msg"

जिसमें दो कमियां हैं -

क) सभी नई / बदली गई फाइलें जुड़ जाती हैं और इसमें कुछ अवांछित परिवर्तन शामिल हो सकते हैं।
ख) आपको पहले फ़ाइल सूची की समीक्षा करने की आवश्यकता नहीं है।

इसलिए इसके बजाय मैं करता हूं:

git add file,file2,file3...
git commit # Then type the files in the editor and save-quit.

इस तरह से आप अधिक विचार-विमर्श करते हैं कि कौन सी फाइलें जुड़ती हैं और आपको सूची की समीक्षा करने के लिए भी मिलता है और संदेश के लिए संपादक का उपयोग करते समय थोड़ा और सोचें। जब मैं -mविकल्प के बजाय पूर्ण स्क्रीन संपादक का उपयोग करता हूं तो मुझे अपने प्रतिबद्ध संदेशों में सुधार होता है।

[अपडेट - जैसे-जैसे समय बीतता है मैंने और अधिक स्विच किया है:

git status # Make sure I know whats going on
git add .
git commit # Then use the editor

]

इसके अलावा (आपकी स्थिति के लिए अधिक प्रासंगिक), मैं बचने की कोशिश करता हूं:

git pull

या

git pull origin master.

क्योंकि पुल का एक मर्ज होता है और यदि आपके पास स्थानीय रूप से परिवर्तन हैं जो आप मर्ज नहीं करना चाहते हैं तो आप आसानी से मर्ज किए गए कोड के साथ समाप्त हो सकते हैं और / या कोड के लिए मर्ज विरोध हो सकता है जो विलय नहीं होना चाहिए था।

इसके बजाय मैं करने की कोशिश करता हूं

git checkout master
git fetch   
git rebase --hard origin/master # or whatever branch I want.

आपको यह मददगार भी लग सकता है:

गिट शाखा, कांटा, लाने, मर्ज, रिबेस और क्लोन, क्या अंतर हैं?


अरे, मैं थोरा आपका जवाब समझ गया। लेकिन जब से मैं github मर्ज संघर्षों के लिए नया हूँ, मुझे लगता है कि कुछ गायब है। जब आप करते हैं git checkout masterऔर आपके स्थानीय संशोधनों का क्या होता है git fetch और git rebase --hard origin/master
Suhaib

मेरा मानना ​​है कि आपको क्या करना है पर अधिक विवरण जोड़ना चाहिए। एक और उदाहरण जो मुझे भ्रमित कर रहा है, आपने अपने उत्तर में उल्लेख किया है: हम करते हैं git add ., क्या यह हमारे स्थानीय संशोधनों को बचाएगा ताकि हम इसका पालन कर सकें git checkout master? या वे दो अलग-अलग परिदृश्य हैं?
सुहैब

@MichaelDurrant $ git rebase --hard origin/master b5a30cc159ba8dd error: unknown option हार्ड 'यूज़: git rebase [-i] [विकल्प] [--exec <cmd>] [- टोरंटो <newbase>] [<upstream>] [<शाखा>] या: git rebase -i] [ विकल्प] [--exec <cmd>] [- Santiago <newbase>] --root [<शाखा>] या: git rebase --continue | --बोर्ट | --स्किप | --edit-कार्य करने की `
likejudo

24

CoolAJ86 का जवाब बहुत ज्यादा सब कुछ देता है। यदि आपके पास दोनों शाखाओं में समान कोड में परिवर्तन हैं तो आपको एक मैनुअल मर्ज करना होगा। किसी भी पाठ संपादक में संघर्ष में फ़ाइल खोलें और आपको निम्नलिखित संरचना देखनी चाहिए।

(Code not in Conflict)
>>>>>>>>>>>
(first alternative for conflict starts here)
Multiple code lines here
===========
(second alternative for conflict starts here)
Multiple code lines here too    
<<<<<<<<<<<
(Code not in conflict here)

समान संकेतों और कोण कोष्ठक को हटाते हुए एक विकल्प या दोनों के संयोजन को इस तरह से चुनें कि आप नया कोड चाहते हैं।

git commit -a -m "commit message"
git push origin master

17
git log --merge -p [[--] path]

हमेशा मेरे लिए काम करने के लिए नहीं लगता है और आमतौर पर हर शाखा, जो दो शाखाओं के बीच अलग थी, का उपयोग करते हुए प्रदर्शित होता है -- कमांड से पथ को अलग करने के लिए किया जाता है।

मैं इस मुद्दे के आसपास काम करने के लिए दो कमांड लाइन और एक रन में खोल रहा हूं

git log ..$MERGED_IN_BRANCH --pretty=full -p [path]

और दूसरे में

git log $MERGED_IN_BRANCH.. --pretty=full -p [path]

जगह $MERGED_IN_BRANCHशाखा मैं में और विलय कर दिया साथ [path]फ़ाइल है कि परस्पर विरोधी है। यह कमांड ..दो कमिट के बीच, पैच फॉर्म में, सभी कमिट्स को लॉग करेगा । यदि आप एक तरफ को खाली छोड़ देते हैं जैसे कि ऊपर दिए गए कमांड में स्वचालित रूप से उपयोग किया जाएगा HEAD(इस मामले में आप जिस शाखा में विलय कर रहे हैं)।

यह आपको यह देखने की अनुमति देगा कि दो शाखाओं में फ़ाइल के जाने के बाद क्या हुआ। यह आमतौर पर संघर्षों को हल करना बहुत आसान बनाता है।


16

का उपयोग करते हुए patience

मुझे आश्चर्य है कि किसी और ने patienceमर्ज की पुनरावर्ती रणनीति के साथ संघर्ष का समाधान करने के बारे में नहीं कहा । patienceमेरे लिए अच्छे परिणाम प्रदान करते हुए, एक बड़े मर्ज संघर्ष के लिए। विचार यह है कि यह व्यक्तिगत रेखाओं के बजाय ब्लॉक से मेल खाने की कोशिश करेगा।

यदि आप उदाहरण के लिए अपने कार्यक्रम के इंडेंटेशन को बदलते हैं, तो डिफ़ॉल्ट गेट मर्ज की रणनीति कभी-कभी एकल ब्रेसिज़ से मेल खाती है {जो विभिन्न कार्यों से संबंधित है। इससे बचा जाता है patience:

git merge -s recursive -X patience other-branch

प्रलेखन से:

With this option, merge-recursive spends a little extra time to avoid 
mismerges that sometimes occur due to unimportant matching lines 
(e.g., braces from distinct functions). Use this when the branches to 
be merged have diverged wildly.

सामान्य पूर्वज के साथ तुलना

यदि आपके पास एक मर्ज संघर्ष है और यह देखना चाहते हैं कि उनकी शाखा को संशोधित करते समय दूसरों के मन में क्या था, तो कभी-कभी अपनी शाखा की तुलना सीधे सामान्य पूर्वज (हमारी शाखा के बजाय) से करना आसान होता है। उसके लिए आप उपयोग कर सकते हैं merge-base:

git diff $(git merge-base <our-branch> <their-branch>) <their-branch>

आमतौर पर, आप केवल किसी विशेष फ़ाइल के लिए परिवर्तन देखना चाहते हैं:

git diff $(git merge-base <our-branch> <their-branch>) <their-branch> <file>

मेरे मामले में इसने मर्ज संघर्षों को अच्छी तरह से हल नहीं किया, क्योंकि किसी कारण से यह सी # परियोजनाओं में कॉन्फ़िगरेशन की डुप्लिकेट लाइनें रखता था। हालाँकि, यह ENTIRE FILE IS DIFFERENT से अधिक अनुकूल था, जो कि मैंने पहले किया था
Mathijs Segers

15

दिसंबर 12, 2016 तक, आप शाखाओं को मर्ज कर सकते हैं और github.com पर संघर्ष को हल कर सकते हैं

इस प्रकार, यदि आप कमांड-लाइन या किसी तीसरे पक्ष के टूल का उपयोग नहीं करना चाहते हैं जो पुराने उत्तरों से यहां दिए गए हैं , तो GitHub के मूल टूल के साथ जाएं।

यह ब्लॉग पोस्ट विस्तार से बताती है, लेकिन मूल बातें यह हैं कि UI के माध्यम से दो शाखाओं को 'मर्ज' करने पर, अब आपको एक 'सॉल्यूशन टकराव' विकल्प दिखाई देगा, जो आपको एक संपादक के पास ले जाएगा, जिससे आप इन मर्ज संघर्षों से निपटने की अनुमति देंगे।

यहां छवि विवरण दर्ज करें


यह गितुब के बारे में नहीं पूछ रहा है, इस प्रकार मैंने मतदान किया जो मुझे बहुत खराब उत्तर लगता है।
दिसंबर को मिंचू जेट

1
@mschuett सही है, सवाल "कैसे gitub में संघर्ष को हल करने के लिए" है, "कैसे github में संघर्ष को हल करने के लिए नहीं"। एक अंतर है और पहले से ही बहुत सारे लोग हैं जो सोचते हैं कि गिट और जीथब एक ही बात है, इसलिए ऐसा कुछ भी जो इस बात का प्रचार करता है कि भावना गलत है।
पैट्रिक मेव्ज़ेक

15

यदि आप शाखा (परीक्षण) से मास्टर में विलय करना चाहते हैं, तो आप इन चरणों का पालन कर सकते हैं:

चरण 1 : शाखा में जाएं

git checkout test

चरण 2 :

git pull --rebase origin master

चरण 3 : यदि कुछ संघर्ष हैं, तो इसे संशोधित करने के लिए इन फ़ाइलों पर जाएं।

चरण 4 : इन परिवर्तनों को जोड़ें

git add #your_changes_files

चरण 5 :

git rebase --continue

चरण 6 : यदि अभी भी संघर्ष है, तो चरण 3 पर वापस जाएं। यदि कोई संघर्ष नहीं है, तो निम्नलिखित करें:

git push origin +test

चरण 7 : और फिर परीक्षण और मास्टर के बीच कोई संघर्ष नहीं है। आप सीधे मर्ज का उपयोग कर सकते हैं।


13

संघर्षों से बचने के लिए मैं हमेशा नीचे दिए गए चरणों का पालन करता हूं।

  • गिट चेकआउट मास्टर (मास्टर शाखा में आएं)
  • git पुल (नवीनतम कोड प्राप्त करने के लिए अपने मास्टर को अपडेट करें)
  • git checkout -b mybranch (एक नई शाखा चेकआउट करें और उस शाखा पर काम करना शुरू करें ताकि आपका स्वामी हमेशा ट्रंक के ऊपर रहे।)
  • जोड़ देना। और git कमिट और git पुश (अपने परिवर्तनों के बाद अपनी स्थानीय शाखा पर)
  • git चेकआउट मास्टर (अपने स्वामी के पास वापस आएं)

अब आप भी ऐसा ही कर सकते हैं और जितनी चाहें उतनी स्थानीय शाखाएँ रख सकते हैं और जब भी आवश्यक हो, बस अपनी गिट्ट चेकआउट कर रहे हैं।


12

विभिन्न स्थितियों में हो सकता है विलय संघर्ष:

  • जब "git लाने" और फिर "git मर्ज" चलाने के लिए
  • जब "git fetch" चल रहा हो और फिर "git rebase"
  • जब "गिट पुल" चल रहा हो (जो वास्तव में उपर्युक्त स्थितियों में से एक के बराबर है)
  • जब "जीआईटी स्टैश पॉप" चल रहा हो
  • जब आप गिट पैच लागू कर रहे हैं (कमिट जो फ़ाइलों को स्थानांतरित करने के लिए निर्यात किया जाता है, उदाहरण के लिए, ईमेल द्वारा)

आपको एक मर्ज टूल इंस्टॉल करने की आवश्यकता है जो संघर्षों को हल करने के लिए गिट के साथ संगत है। मैं व्यक्तिगत रूप से KDiff3 का उपयोग करता हूं, और मैंने इसे अच्छा और आसान पाया है। आप यहां इसका विंडोज संस्करण डाउनलोड कर सकते हैं:

https://sourceforge.net/projects/kdiff3/files/

BTW यदि आप Git एक्सटेंशन स्थापित करते हैं तो Kdiff3 को स्थापित करने के लिए इसके सेटअप विज़ार्ड में एक विकल्प है।

इसके बाद सेटअप git कॉन्फिड को मेरिजेट के रूप में उपयोग करने के लिए कॉन्फ़िगर करता है:

$ git config --global --add merge.tool kdiff3
$ git config --global --add mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
$ git config --global --add mergetool.kdiff3.trustExitCode false

$ git config --global --add diff.guitool kdiff3
$ git config --global --add difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
$ git config --global --add difftool.kdiff3.trustExitCode false

(Kdiff exe फ़ाइल के वास्तविक पथ के साथ पथ को बदलना याद रखें।)

हर बार जब आप एक मर्ज संघर्ष में आते हैं, तो आपको बस इस कमांड को चलाने की आवश्यकता होती है:

$git mergetool

फिर यह Kdiff3 को खोलता है, और सबसे पहले मर्ज संघर्षों को स्वचालित रूप से हल करने का प्रयास करता है। अधिकांश संघर्षों को अनायास हल किया जाएगा और आपको बाकी को मैन्युअल रूप से ठीक करने की आवश्यकता है।

यहाँ Kdiff3 कैसा दिखता है:

यहां छवि विवरण दर्ज करें

फिर एक बार जब आप काम कर लेते हैं, तो फ़ाइल को सहेजें और यह संघर्ष के साथ अगली फ़ाइल पर जाता है और आप फिर से वही काम करते हैं जब तक कि सभी संघर्ष हल नहीं हो जाते।

यह जांचने के लिए कि क्या सबकुछ सफलतापूर्वक विलय हो गया है, बस फिर से मर्जटूल कमांड चलाएं, आपको यह परिणाम प्राप्त करना चाहिए:

$git mergetool
No files need merging

8

यह उत्तर उन VIM उपयोगकर्ताओं के लिए एक विकल्प जोड़ना है जैसे I जो संपादक के भीतर सब कुछ करने के लिए पसंद करते हैं।


टी एल; डॉ

यहां छवि विवरण दर्ज करें


Tpope VIM के लिए इस महान प्लगइन के साथ आया जिसे भगोड़ा कहा जाता है । एक बार स्थापित होने पर आप उन :Gstatusफ़ाइलों की जांच करने के लिए चला सकते हैं जिनमें संघर्ष है और:Gdiff 3 तरीकों से मर्ज करने के लिए गिट को खोलना होता है।

एक बार 3-तरीके से मर्ज करने के बाद, भगोड़ा आपको निम्नलिखित में से किसी एक शाखा में बदलाव करने देगा जो आप निम्नलिखित फैशन में विलय कर रहे हैं:

  • :diffget //2मूल ( HEAD ) शाखा से परिवर्तन प्राप्त करें :
  • :diffget //3विलय शाखा से परिवर्तन प्राप्त करें:

एक बार जब आप फ़ाइल को मर्ज कर रहे हैं, :Gwriteतो मर्ज किए गए बफ़र में टाइप करें । Vimcasts ने इस कदम के बारे में विस्तार से बताते हुए एक शानदार वीडियो जारी किया ।


6

जीएसलेंस फॉर वीएस कोड

आप वीएस कोड के लिए गिट्लेंस की कोशिश कर सकते हैं , वे प्रमुख विशेषताएं हैं:

3. आसानी से विरोधों का समाधान।

मुझे यह सुविधा पहले से ही पसंद है:

यहां छवि विवरण दर्ज करें

2. वर्तमान लाइन दोष।

यहां छवि विवरण दर्ज करें

3. गटर दोष

यहां छवि विवरण दर्ज करें

4. स्टेटस बार ब्लेम

यहां छवि विवरण दर्ज करें

और कई विशेषताएं हैं जो आप उन्हें यहां देख सकते हैं


5

git fetch
git चेकआउट अपनी शाखा
git रिबेट मास्टर

इस चरण में आप अपनी पसंद के आईडीई का उपयोग करके संघर्ष को ठीक करने का प्रयास करेंगे

आप इस लिंक का अनुसरण कर सकते हैं ताकि फ़ाइल में संघर्ष को ठीक करने के लिए
https://help.github.com/articles/resolve-a-merge-conflict-use-the-command-line/

git add
git rebase --continue
git कमिट --amend
git पुश ओरिजनल HEAD: refs / draft / master (ड्राफ्ट की तरह पुश)

अब हर चीज ठीक है और आप अपनी प्रतिबद्धता को गंभीरता से पाएंगे

मुझे उम्मीद है कि यह इस मुद्दे से संबंधित हर एक की मदद करेगा।


3

यदि आप पहले से ही नहीं हैं, तो संपादन के लिए विज़ुअल स्टूडियो कोड आज़माएँ। आपके द्वारा मर्ज करने का प्रयास करने के बाद (और मर्ज विरोधों में उतरने) की कोशिश करता है। वीएस कोड स्वचालित रूप से मर्ज टकराव का पता लगाता है।

यह दिखावा करने में आपकी बहुत मदद कर सकता है कि मूल एक में क्या बदलाव किए गए हैं और आपको स्वीकार करना चाहिए incomingया

current change(विलय से पहले मूल अर्थ) '?'

इसने मेरे लिए मदद की और यह आपके लिए भी काम कर सकता है!

PS: यह तभी काम करेगा जब आपने अपने कोड और विजुअल स्टूडियो कोड के साथ git कॉन्फ़िगर किया हो।


2

संघर्षों को हल करने का एक सुरक्षित तरीका git-mediate का उपयोग करना है (यहाँ सुझाए गए सामान्य समाधान काफी त्रुटिपूर्ण हैं imho)।

इसका उपयोग कैसे करें, इस पर एक त्वरित परिचय के लिए इस पोस्ट को देखें ।


2

जो लोग विजुअल स्टूडियो (मेरे मामले में 2015) का उपयोग कर रहे हैं

  1. VS में अपना प्रोजेक्ट बंद करें। विशेष रूप से बड़ी परियोजनाओं में वीएस यूआई का उपयोग करते समय विलय करने के लिए निकल जाता है।

  2. कमांड प्रॉम्प्ट में मर्ज करें।

    git चेकआउट target_branch

    git मर्ज source_branch

  3. फिर वीएस में परियोजना खोलें और टीम एक्सप्लोरर -> शाखा पर जाएं। अब एक संदेश है जो कहता है कि मर्ज लंबित है और परस्पर विरोधी फाइलें संदेश के ठीक नीचे सूचीबद्ध हैं।

  4. परस्पर विरोधी फ़ाइल पर क्लिक करें और आपके पास मर्ज, तुलना, लो सोर्स, टेक टारगेट का विकल्प होगा। वीएस में मर्ज टूल का उपयोग करना बहुत आसान है।


मैं एक बहुत बड़ी परियोजना पर VS कोड 2017 का उपयोग कर रहा हूं और परियोजना को बंद करने की आवश्यकता नहीं है। यह इसे काफी अच्छी तरह से संभालता है :)
protoEvangelion

2

यदि आप IDE के रूप में intelliJ का उपयोग कर रहे हैं, तो अपनी शाखा में माता-पिता को मर्ज करने का प्रयास करें

git checkout <localbranch>
git merge origin/<remotebranch>

यह इस तरह सभी संघर्षों को दिखाएगा

A_MBPro: test au $ git मर्ज का मूल / ऑटो-मर्जिंग src / test / java / com /.../ TestClass.java CONFLICT (सामग्री): src / test / jaवा / com /.../ TestClass.java में विलय संघर्ष

अब ध्यान दें कि फ़ाइल TestClass.java को intelliJ में लाल रंग में दिखाया गया है। git स्टेटस भी दिखाएगा

Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified:   src/test/java/com/.../TestClass.java

इंटेलीज में फाइल खोलें, इसमें सेक्शन होंगे

  <<<<<<< HEAD
    public void testMethod() {
    }
    =======
    public void testMethod() { ...
    }
    >>>>>>> origin/<remotebranch>

जहां HEAD आपकी स्थानीय शाखा और परिवर्तन पर है / दूरस्थ शाखा से परिवर्तन है। यहां वह सामान रखें जो आपको चाहिए और जो सामान आपको चाहिए, उसे हटा दें। इसके बाद सामान्य कदम उठाने चाहिए। अर्थात्

   git add TestClass.java
   git commit -m "commit message"
   git push

2

मैं विरोधों को सुलझाने के लिए Microsoft के विज़ुअल कोड का उपयोग कर रहा हूं। इसका उपयोग करने के लिए बहुत सरल है। मैं अपने प्रोजेक्ट को कार्यक्षेत्र में खुला रखता हूं। यह संघर्षों का पता लगाता है और हाइलाइट करता है, इसके अलावा GUI को जो भी बदलाव मैं HEAD या इनकमिंग से रखना चाहता हूं उसका चयन करने के लिए देता हूं। यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.