2011-12-20 9 views
5

मेरी गिट भंडार में 2 शाखाएं हैं: मास्टर और विकसित करें। मुझे एक ऐसी स्क्रिप्ट चाहिए जो विकास से सभी परिवर्तनों को स्वचालित रूप से मास्टर में विलीन कर दे।स्क्रिप्ट स्वचालित रूप से 2 गिट शाखाओं को मर्ज करने के लिए?

मैं जेनकींस प्रयोग किया है: Git क्लोन प्लगइन भंडार और उसके बाद इस स्क्रिप्ट ('संस्करण' चर एक नौकरी पैरामीटर है) चलाया जाता है:

# merge 
git checkout -b develop origin/develop 
git checkout master 
git merge -Xtheirs --squash develop -m "v${version}" 

# commit 
git commit -m "v${version}" 

# tag 
git tag v${version} -m "v${version}" 

# push 
git push origin v${version} 

मैं एक परीक्षण भंडार पर इसे करने की कोशिश है और इसके साथ विफल रहता है :

Git -Xtheirs विकसित
टकराव (हटाना/संशोधित) विलय: test.txt विकसित में नष्ट कर दिया और सिर में संशोधित। Test.txt का संस्करण HEAD पेड़ में छोड़ा गया।
स्वचालित विलय विफल; संघर्ष को ठीक करें और फिर परिणाम दें।

मैं कैसे इस संघर्ष स्वचालित रूप से ठीक करूं? मैं स्क्रिप्ट हमेशा जोड़ने/संशोधित/के बाद से मास्टर वैसे भी कभी नहीं छुआ है, 'विकसित' शाखा के अनुसार फ़ाइल को हटाना चाहते ...

+3

आप कहते हैं कि "मास्टर कभी नहीं छुआ है" लेकिन आप एक मिल वैसे भी संघर्ष? यदि यह वास्तव में कभी स्पर्श नहीं होता था, तो एक साधारण 'गिट मर्ज - केवल-उत्पत्ति/विकास' पर्याप्त होगा। – fge

+1

यदि आप 'मूल/विकास' संस्करण के साथ मास्टर संस्करण _replace_ करना चाहते हैं और विलय प्रतिबद्धता रिकॉर्ड नहीं करना चाहते हैं, तो 'merge --nosquash' से परेशान क्यों करें? क्या यह सिर्फ 'गिट चेकआउट मास्टर' और गिट रीसेट मूल/विकसित और गिट रीसेट - सॉफ्ट हेड @ {1} 'या इसी तरह के क्लीनर नहीं होगा? –

उत्तर

5

-X theirs मर्ज रणनीति केवल एक फ़ाइल के भीतर परस्पर विरोधी जिसे हल करने में काम करता है।

 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. 

इस मामले में, एक शाखा फ़ाइल जबकि अन्य यह संशोधन किया है, जो दो शाखाओं के बीच एक सरल विरोधी हंक कि अलग अलग बना दिया है से एक अलग मामला है नष्ट कर दिया गया है: इन विकल्पों के लिए प्रलेखन the git-merge man page में है संशोधनों।

+0

क्या गिट को स्वचालित रूप से "फ़ाइल हटाएं" चुनने का कोई तरीका है यदि इसे हटा दिया गया है? –

1

5 साल पुराना .... लेकिन अभी भी प्रासंगिक है।

यहाँ मेरी समाधान है: मैं मास्टर शाखा हटा सकते हैं और शाखा से एक नया मास्टर शाखा मैं के लिए 'मर्ज' चाहते हैं बनाने के लिए:

GIT_BRANCH_TO_MERGE_FROM=`git symbolic-ref HEAD | sed 's!refs\/heads\/!!'` 
GIT_BRANCH_TO_MERGE_TO="master" 

git checkout "${GIT_BRANCH_TO_MERGE_TO}" 
git checkout "${GIT_BRANCH_TO_MERGE_FROM}" 

# Delete TO branch 
git branch -D "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to delete ${GIT_BRANCH_TO_MERGE_TO}" 
git push origin :"${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} delete to origin" 

# Create TO branch 
git checkout -b "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to create local branch ${GIT_BRANCH_TO_MERGE_TO}" 
git push origin "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} to origin" 
संबंधित मुद्दे