2010-11-11 8 views
8

मेरे पास निम्न स्थितियां हैं: मैंने कुछ लोगों को अपने स्थानीय भंडार में किया है, और फिर मास्टर में एक और शाखा (~ 150 काम) का एक बड़ा विलय - इसमें बहुत सारे संघर्ष हुए थे।चीजों को गड़बड़ किए बिना गिट विलय के बाद मैं गिट रीबेस-i का उपयोग कैसे करूं?

अब, मैं धक्का देने से पहले विलय से पहले किए गए प्रतिबद्धता को आगे बढ़ाना चाहता हूं।

आम तौर पर, मैं इसके लिए "rebase -i" का उपयोग करूंगा।

दुर्भाग्य से, डिफ़ॉल्ट व्यवहार एक विलय-प्रतिबद्धता को तोड़ना है जो मैंने वास्तव में 150 से अधिक अलग-अलग कामों में मास्टर करने के लिए प्रतिबद्ध किया है (मुझे लगता है कि ऐसा लगता है जैसे मैं विलय के बजाय शुरू करने के बजाय विलय का उपयोग करूंगा) - जो कई कारणों से मेरे लिए बुरा व्यवहार है।

मैंने विद्रोह के लिए '-p' ध्वज खोजा, जो विलय को बरकरार रखता है, और इसके बारे में बहुत खुश था। दुर्भाग्य से, यह वास्तव में एक ही विलय को फिर से लागू करता है, और संघर्ष को हल करने में मेरे कड़ी मेहनत के बारे में सब भूल गया। फिर से - बुरा व्यवहार!

क्या मैं चाहता हूं कि कोई समाधान हो? मेरे पोस्ट-मर्ज ऑपरेशंस को दोहराने के बिना विशिष्ट प्रतिबद्धताओं को पुन: क्रमबद्ध करने या संपादित करने के बाद विलय के बाद rebase -i का उपयोग करना?

धन्यवाद!

+2

क्या आपने [git rerere] (http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html) पर एक नज़र डाली है? –

+2

'गिट रीरेरे' अब आपकी मदद नहीं कर सकता है, क्योंकि जब आप विलय करते हैं तो यह विवाद समाधान रिकॉर्ड करता है ... सिवाय इसके कि [rerere-train.sh] नामक एक स्क्रिप्ट है (http://git.kernel.org/? पी = गिट/git.git; ए = ब्लॉब; एफ = contrib/rerere-train.sh; एचबी = HEAD) गिट की contrib निर्देशिका में जो "primes" rerere डेटाबेस पुनर्जन्म डेटाबेस से पहले से ही किया है। – Cascabel

उत्तर

13

यहां मेरी टिप्पणी में उल्लिखित rerere-train.sh स्क्रिप्ट का क्या अर्थ है - अनिवार्य रूप से यह विलय को फिर से शुरू करता है, आपके संकल्प का उपयोग करता है, और बस इसे फिर से देखने देता है। तुम बस अपने एकल के लिए मैन्युअल रूप से कर सकता है के लिए प्रतिबद्ध है, तो आप की तरह:

git checkout <parent of merge commit> 
git merge <merged commit>   # if this goes cleanly, we're done 
git rerere      # done automatically if rerere.enabled is true 
git checkout <merge commit> -- . # check out the files from the result of the merge 
git rerere      # done automatically if rerere.enabled is true 
git reset --hard     # wipe away the merge 

# and you'd want to follow with git checkout <branch> to return to where you were 

लेकिन आप भी सिर्फ सच करने के लिए rerere.enabled सेट कर सकते हैं, और उन कदमों शून्य से git rerere के लिए सीधी कॉल करते हैं - और आप में सेट किया जा चाहते हैं जब भी आप संघर्ष हल करते हैं, तो भविष्य में स्वचालित रूप से दौड़ने के साथ। मैं यही करता हूं - यह कमाल है।

यदि आप सीधे स्क्रिप्ट को चलाने के लिए चाहते हैं, तो आप शायद rerere-train.sh ^<commit before the merge> <current branch> जैसे तर्कों के साथ इसे चलाने के लिए चाहते हैं। (^commit अंकन का अर्थ है "इतिहास में यह अतीत चलना नहीं", तो यह सभी मर्ज अपने रेपो में करता है के लिए यह कर परेशान नहीं करेगा।)

लेकिन अगर आप अपनी बात करने के लिए rerere मिलता है, आपको वांछित संकल्प के साथ समाप्त होना चाहिए। इसका मतलब है कि आप आगे बढ़ सकते हैं और अपनी रीबेज -i कर सकते हैं, और जब आप संघर्ष में भाग लेते हैं, तो पुन: आवंटित पुनर्मूल्यांकन पुन: उपयोग करेंगे। बस एक हेड-अप: यह अभी भी इंडेक्स में विवादित फ़ाइलों को छोड़ देता है, ताकि आप उनका निरीक्षण कर सकें, और सुनिश्चित कर लें कि इससे क्या किया गया है। एक बार ऐसा करने के बाद, git add का उपयोग इन्हें जांचने के लिए करें जैसे कि आप स्वयं संघर्षों का समाधान करेंगे, और सामान्य रूप से आगे बढ़ें!

git-rerere manpage में रीयर के सामान्य उपयोग का एक बहुत अच्छा, लंबा वर्णन शामिल है, जिसमें वास्तव में कभी भी कॉलर को कॉल करने में शामिल नहीं होता है - यह सब स्वचालित रूप से किया जाता है। और एक नोट यह जोर नहीं देता है: यह सब संघर्ष शिकारी पर आधारित है, इसलिए यह एक संकल्प का पुन: उपयोग कर सकता है भले ही संघर्ष पूरी तरह से अलग जगह पर समाप्त हो जाए, जब तक कि यह अभी भी वही पाठ संघर्ष है।

+0

वाह, यह गंभीर गिट-फू जैसा दिखता है! – Benjol

+0

@ बेंजोल: संघर्ष समाधान गंभीर व्यवसाय है! (लेकिन यह वास्तव में डरावना नहीं है - बस कॉन्फ़िगरेशन में पुन: प्रयास करें और जादू होने दें।) – Cascabel

+0

गिट-रीरेयर मैनपेज लिंक अब 404 नहीं मिला है। – Jez

1

मैंने यह here करने के लिए एक स्क्रिप्ट बनाई है। ज्ञात सीमाओं के लिए open issues देखें।

आपको पहले अपने पाथ पर rerere-train.sh इंस्टॉल करने की आवश्यकता होगी।फेडोरा पर इस किया जा सकता है के साथ:

install "$(rpm -ql git|grep '/rerere-train.sh$')" ~/bin 
0

मैं उपयोगकर्ता @ Jefromi के जवाब से rerere-train.sh इस्तेमाल किया। 2.3.4 पोर्टेबल - - मैं rerere-train.sh काम करने में कामयाब रहे

Michal Marek

The git-sh-setup helper has apparently never been meant to be used by scripts outside of git. This became apparent with git 2.10:

बाद downloading an older version: इस http://kernel.opensuse.org/cgit/kernel-source/commit/?h=linux-next&id=d52b9f00588bb18d7f7a0e043eea15e6c27ec40c से

$ ../rerere-train.sh HEAD 
C:\Program Files\Git\mingw64/libexec/git-core/git-sh-setup: line 6: .: git-sh-i18n: file not found 

मैं इस देखा: हालांकि मैं इस त्रुटि थी।

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