2010-04-06 9 views
6

मेरे पास एक फ़ाइल है जिसमें एक पंक्ति है। मैं एक शाखा बनाता हूं और उसी फ़ाइल में दूसरी पंक्ति जोड़ता हूं। शाखा में सहेजें और प्रतिबद्ध करें। मैं मास्टर पर वापस स्विच करता हूं। और फ़ाइल में एक अलग, दूसरी पंक्ति जोड़ें। मास्टर को बचाओ और प्रतिबद्ध करें। तो कुल मिलाकर अब 3 अद्वितीय लाइनें हैं।गिट एक संशोधित माता-पिता/मास्टर के साथ फ़ाइल परिवर्तन मर्ज क्यों नहीं कर सकता?

यदि अब मैं शाखा को मास्टर को वापस लाने और विलय करने की कोशिश करता हूं, तो यह एक विलय संघर्ष का सामना करता है।

क्यों गिट सरलता से प्रत्येक पंक्ति को विलय नहीं कर सकता, एक दूसरे के बाद?

मर्ज पर मेरे प्रयास कुछ इस तरह बर्ताव करता है:

PS D:\dev\testing\test1> git merge newbranch 
Auto-merging hello.txt 
CONFLICT (content): Merge conflict in hello.txt 
Automatic merge failed; fix conflicts and then commit the result. 
PS D:\dev\testing\test1> git diff 
diff --cc hello.txt 
index 726eeaf,e48d31a..0000000 
--- a/hello.txt 
+++ b/hello.txt 
@@@ -1,2 -1,2 +1,6 @@@ 
    This is the first line. 
- New line added by master. 
-Added a line in newbranch. 
++<<<<<<< HEAD 
++New line added by master. 
++======= 
++Added a line in newbranch. 
++>>>>>>> newbranch 

वहाँ स्वचालित रूप में यह स्लॉट लाइनों, एक के बाद एक बनाने के लिए एक तरीका है?

+2

ऐसा प्रतीत नहीं होता है कि ऑर्डर निर्धारित करने का एक आसान तरीका है जिसमें उन्हें स्लॉट किया जाना चाहिए - आखिरकार, निष्पादन योग्य कोड की बात होने पर ऑर्डर निश्चित रूप से महत्वपूर्ण हो सकता है। – Amber

उत्तर

12

मान लीजिए कि फ़ाइल शाखा एक की तरह लग रहा है:

First line 
Branch A's second line 

और शाखा बी लगता है:

First line 
Branch B's second line 

जब आप मर्ज करते हैं, वहाँ इसे सुलझाने के लिए दो अलग-अलग तरीके हैं।

First line 
Branch A's second line 
Branch B's second line 

यहाँ एक और तरीका है:: यहाँ एक ही रास्ता है

First line 
Branch B's second line 
Branch A's second line 

Git पता नहीं है जो उन लोगों के पास दो विकल्प आप पसंद करते हैं में से एक, या तो भी स्वीकार्य मर्ज के हैं।

1

मैं आपको बता सकता हूं कि यह दोनों को मर्ज क्यों नहीं कर सकता है - गिट के अनुसार, फ़ाइल ए की लाइन 2 "ऐसी और ऐसी" है जबकि फ़ाइलबी की लाइन 2 "कुछ और" है। इसलिए गिट के मुताबिक, यह फाइलए और फाइलबी से फाइल बनाने की कोशिश कर रहा है जिसमें दो संभावित मूल्य हैं। यह तय नहीं कर सकता कि आप कौन सी चाहते हैं, इसलिए यह उन्हें दोनों को डंप करता है और आपको इसे ठीक करने के लिए मिलता है।

2

मान लीजिए कि आप इस लाइन डालते हैं:

if(y>10) 
printf(something); 

आप कैसे मर्ज कर सकते हैं:

while(x < 5) 
printf(something); 
branchB में

, आप इसे बनाने:

printf(something); 
branchA में

, आप इसे बनाने के यह, या बल्कि, क्या आप मर्ज परिणाम पर भरोसा करेंगे कि इसके लिए एक टूल बनाया गया है?

4

union नामक एक गिट मर्ज रणनीति है जिसे .gitattributes कॉन्फ़िगरेशन फ़ाइल से कॉन्फ़िगर किया जा सकता है जो आपके लिए यह करेगा, लेकिन आपके पास विलय वाली फ़ाइल में विरोधाभासी रेखाएं समाप्त होने के क्रम में कोई नियंत्रण नहीं होगा, और यह इंगित करने के लिए कोई संघर्ष मार्कर नहीं है कि यह कहां हुआ।

आप एक कस्टम विलय रणनीति भी परिभाषित कर सकते हैं जो सही क्रम निर्धारित करने के लिए फ़ाइलों की संरचना के बारे में कुछ विशेष ज्ञान का उपयोग कर सकता है।

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