2008-11-16 12 views
11

इसे किसी अन्य डेवलपर को भेजने के लिए प्रतिबद्धता से पैच कैसे प्राप्त करें? और बाद में किसी तारीख को हमारे पेड़ों को विलय करते समय मैं इस पैच के साथ विलय संघर्ष से कैसे बचूं?मैं किसी अन्य डेवलपर को पैच कैसे भेजूं और संघर्ष विलय से बचूं?

आप जानते हैं कि कैसे कैसे ऐसी तोड़फोड़, Git, मर्क्युरियल, BzR या आदि

उत्तर

18

git में आप पाइप git-diff दोनों के बीच इस तरह प्रतिबद्ध के उत्पादन कर सकते हैं:

git diff fa1afe1 deadbeef > patch.diff 

डेवलपर के लिए patch.diff भेजें और उसे git-apply जाने इसे इस तरह अपने कार्यक्षेत्र के लिए:

git apply patch.diff 

यदि अन्य डेवलपर के पास पहले से ही अपने भंडार में उपलब्ध है, तो वह हमेशा इस तरह विलय किए बिना इसे अपने आप में पाइप कर सकता है:

git apply < git diff fa1afe1 deadbeef 

फिर आप add और commit diff the usual way में परिवर्तन कर सकते हैं।


अब जब आप पैच को मास्टर शाखा (जो सार्वजनिक है) में विलय करना है तो दिलचस्प हिस्सा आता है। निम्नलिखित संशोधन पेड़ पर विचार करें जहां C*C से लागू पैच मास्टर शाखा में है:

A---B---C---D   master, public/master 
    \ 
     E---C*---F  feature_foo 

आप git-rebase उपयोग कर सकते हैं विषय शाखा अद्यतन करने के लिए (इस उदाहरण feature_foo नामित में) के साथ यह नदी के ऊपर सिर है।

git rebase master feature_foo 

Git इस तरह संशोधन पेड़ को पुनर्व्यवस्थित और भी पैच ही लागू होंगे::

A---B---C---D   master, public/master 
      \ 
       E*---F* feature_foo 

नदी के ऊपर शाखा में विलय अब एक हो जाएगा क्या इसका मतलब है कि जब आप में निम्न लिखें है आसान फास्ट फॉरवर्ड विलय। यह भी जांचें कि नया E* और F* क्रमशः पिछले E और F के रूप में काम करता है।

आप एक ही कदम का उपयोग करके किसी अन्य डेवलपर की शाखा के खिलाफ एक ही काम कर सकते हैं लेकिन इसे सार्वजनिक रिपो पर करने के बजाय, आप डेवलपर के भंडार से fetching संशोधन होंगे। इस तरह आपको अन्य डेवलपर को पैच के लिए नहीं पूछना पड़ेगा यदि वह पहले से ही अपने रेपो में प्रकाशित होने से उपलब्ध है।

लिए कृपया ध्यान दें एक सार्वजनिक शाखा rebase कभी नहीं क्योंकि आदेश Git इतिहास को फिर से लिखने होगा जो कुछ आप शाखाओं है कि लोगों पर निर्भर करती है पर करने के लिए नहीं करना चाहती है और जब दूरदराज के खजाने को विलय एक मेस का निर्माण करेगा। integrate often को कभी भी न भूलें ताकि आपकी टीम में अन्य लोग आपके परिवर्तनों का हिस्सा ले सकें।

+0

बाद में पता चला कि आप पैच को लागू करने और पैच को लागू करने के लिए पैच और गिट प्रारूपित करने के लिए गिट प्रारूप-पैच के साथ एक ही काम कर सकते हैं। उदाहरण: गिट प्रारूप-पैच -के - स्टडआउट आर 1 ... आर 2 | गिट एम -3-के – Spoike

2

SVN में आप बस करने से पहले फिर अपने परिवर्तन कर सकते हैं, पाइप आउटपुट के रूप में अपनी पसंद के VCS में ऐसा करने का तरीका करें के रूप में ऐसी

svn diff > mypatch.diff 

एक फाइल करने के लिए SVN diff आप तो अपने परिवर्तनों को वापस और एक बाद की तारीख में पैच लागू कर सकते हैं

patch -p0 -i mypatch.diff 

का उपयोग कर हमेशा की तरह आँख बंद करके पी लागू नहीं है की अपने कोड के लिए इंच और हमेशा पहले उनका निरीक्षण करें।

आप यह भी पा सकते हैं कि पैच आपके स्रोत कोड को तोड़ देगा यदि स्रोत फ़ाइलों को पैच के बाद काफी महत्वपूर्ण रूप से बदल दिया गया है।

आप यह भी गारंटी नहीं दे सकते कि कोड में चेक करने का प्रयास करते समय संघर्ष विलय नहीं होगा।

2

BzR, एक "विलय के निर्देश" भेजने संभालती है, जिसका अर्थ है कि यह आपके लिए पैच भेजता है ताकि अन्य पार्टी बस मर्ज को क्लिक कर सकते हैं "ठीक है" और वहाँ कम पैच साथ आसपास futzing है/लागू आदि

बस: $ bzr send -o mycode.patch

+0

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

2

सबवर्सन में ऐसा करने का कोई अच्छा तरीका नहीं है। हां, आप svn diff + पैच का उपयोग कर सकते हैं, लेकिन यह तब तक आपकी समस्याओं को स्थगित कर देगा जब तक कि आप विलय नहीं कर लेते हैं और तब तक संभावना है कि आप इसके बारे में भूल गए हैं।

सबवर्सन में आप इसे करने के तरीके को शाखा बनाना चाहते हैं, शाखा पर प्रतिबद्धता करें और पैच के प्राप्तकर्ता से शाखा में स्विच करने के लिए कहें। फिर आप शाखा को वापस सामान्य तरीके से ट्रंक में विलय कर सकते हैं।

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