2012-01-26 18 views
5

पर संघर्ष समाधान मर्ज करें मान लें कि मेरे पास आदेश दिया गया कुछ कोड है, लेकिन ऑर्डरिंग तकनीकी आवश्यकता नहीं है।नए कोड

apple 
kiwi 
strawberry 

और फिर मैं दो विषयों है कि मैं में मर्ज करना चाहते है, जिसका diffs की तरह लग रहे:

TOPIC BRANCH: orange 
    kiwi 
+ orange 
    strawberry 

और यह भी

TOPIC BRANCH: pear 
    kiwi 
+ pear 
    strawberry 

वहाँ करने के लिए इन दो पैच के लिए एक रास्ता है स्वचालित रूप से हल हो जाओ? ऐसा लगता है कि यह एक विलय संघर्ष है क्योंकि वे एक ही नई लाइन के लिए प्रतिस्पर्धा करते हैं। एक समाधान जिसके साथ मैं आया हूं, परिवर्तनों में से एक को पुन: व्यवस्थित करना है क्योंकि सॉर्ट ऑर्डर केवल एक नरम आवश्यकता है (जहां फल वास्तव में परिभाषाओं को परिभाषित करते हैं)।

TOPIC BRANCH: pear' 
    apple 
+ pear 
    kiwi 

तो अब हम एक साथ orange और pear' विलय कर सकते हैं फार्म के लिए:

_ apple 
p pear 
_ kiwi 
o orange 
_ strawberry 

इस तरह के हल करने के लिए है कि आदेश रखा जा सकता है अन्य तरीके हैं? मैंने pear को भी orange से डाउनस्ट्रीम करने के बारे में सोचा था कि orange हमेशा प्राथमिकता प्राप्त करता है और अब विलय संघर्ष नहीं होगा। लेकिन यह orange और pear दो अलग-अलग फीचर शाखाओं के बाद से एक झूठी निर्भरता है।

किसी को दूसरे के सामने ट्रंक में मुख्य रूप से रेखांकित किया जा सकता है लेकिन यह एकीकरण शाखाओं को संबोधित नहीं करता है।

संपादित करें: यह सिर्फ दो शिकारी के लिए मेरे सामने आया था (जो केवल मुझे लगता है?) वहां दो मर्ज रणनीतियां हो सकती हैं जिन्हें "मुझे पहले" और "आप पहले" कहा जाता है जैसे कि एक संदिग्ध आदेश को हल किया जा सकता है - दो शाखाओं के बीच धीरे-धीरे।

+0

आप Git को देखा रणनीतियों मर्ज है? मनुष्य गिट-मर्ज करें और विभिन्न रणनीतियों की खोज करें, जिनमें धैर्य नामक रिकर्सिव शामिल है। – idlethread

उत्तर

7

मूलभूत दृष्टिकोण कस्टम मर्ज टूल को परिभाषित करना है और फिर उन फ़ाइलों के लिए कस्टम मर्ज टूल का उपयोग करने के लिए गिट को बताने के लिए गिट विशेषताएँ सुविधा का उपयोग करना है।

उदाहरण:

$ git init t 
$ cd t 
  • mymerge नामक कस्टम मर्ज उपकरण को परिभाषित:

    1. एक परीक्षण भंडार बनाने के ऊपर मर्ज उपकरण फ़ाइलों concatenates

      $ git config merge.mymerge.name "my custom merge tool" 
      $ git config merge.mymerge.driver "cat '%A' '%B'|sort -u >'%A'.tmp && mv '%A'.tmp '%A'" 
      

      , प्रकार परिणामी रेखाएं, और फिर डुप्लिकेट लाइनों को हटा देती है। यदि आप ऑर्डर को बदलना नहीं चाहते हैं, तो ऊपर दिए गए कमांड को एक कस्टम स्क्रिप्ट के साथ बदलें जो आप चाहते हैं। अधिक जानकारी के लिए git help attributes देखें।

    2. बताई Git कि आप mymerge उपयोग करने के लिए जब भंडार में foo.txt नामित किसी भी फाइल विलय हैं:

      $ printf 'apple\nkiwi\nstrawberry\n' >foo.txt 
      $ git add foo.txt 
      $ git commit -m "common ancestor version of foo.txt" 
      $ git checkout -b orange 
      $ printf 'apple\nkiwi\norange\nstrawberry\n' >foo.txt 
      $ git commit -a -m "add orange" 
      $ git checkout -b pear master 
      $ printf 'apple\nkiwi\npear\nstrawberry\n' >foo.txt 
      $ git commit -a -m "add pear" 
      
    3. शाखाओं विलय:

      $ echo "foo.txt merge=mymerge" >.gitattributes 
      $ git add .gitattributes 
      $ git commit -m "tell git to use the mymerge merge tool for foo.txt" 
      
    4. तीन शाखाओं पर कुछ परीक्षण डाटा बनाने (कोई विरोध नहीं है!):

      $ git checkout master 
      $ git merge orange 
      $ git merge pear 
      
    5. लाभ!

      $ cat foo.txt 
      apple 
      kiwi 
      orange 
      pear 
      strawberry 
      
  • 0

    यदि कोड को ऑर्डर करने की आवश्यकता है तो एक अलग फ़ाइल में है, तो आप कस्टम मर्ज टूल का उपयोग कर सकते हैं जो दो इनपुट फाइलें लेता है, उन्हें पढ़ता है और आपकी सामग्री को आउटपुट करता है, जो आपकी परिणाम फ़ाइल में सॉर्ट किया जाता है। फिर आप इस फ़ाइल के लिए कस्टम मर्ज टूल का उपयोग करने के लिए गिट बताएंगे। मुझे यह जानने के लिए गिट के बारे में पर्याप्त जानकारी नहीं है कि क्या आप फ़ाइल प्रकार या किसी प्रकार के रेगेक्स के आधार पर कस्टम मर्ज टूल सेट कर सकते हैं, लेकिन यह एक ऐसा विचार है जो आपको वह चाहिए जो आपको चाहिए।

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