पिछले git मर्ज के बाद git रिबेस


79

मेरी निम्न स्थिति है:

  • मैंने cloneमुख्य रिपॉजिटरी (X) से एक (Y) बनाया , क्योंकि Y पर काम करने वाले बहुत से लोग थे rebaseलेकिन हमने कोई काम नहीं किया merge। जब हम डिलीवर करना चाहते हैं ( push) Y से X हम rebaseचीजों को अच्छा और साफ रखना चाहते हैं

समस्या यह है कि करते समय rebaseहमें उन सभी मर्जों को करने के लिए कहा जाता है जो हमने पहले से ही पिछले mergeचरणों में किए थे। क्या इसका कोई हल है, जिसका अर्थ है कि वास्तव में मर्ज करना फिर से करना?

मुझे उम्मीद थी कि यह बहुत सीधा होगा क्योंकि हम पहले ही परस्पर विरोधी विलय को हल कर चुके हैं।


At: "क्योंकि Y पर काम करने वाले बहुत से लोग थे, हमने कोई रिबास नहीं किया, लेकिन केवल मर्ज किया", आपका मतलब है कि अपस्ट्रीम के साथ मर्ज होता है?
सिरो सेंटिल्ली 郝海东 冠状 iro 事件 ''

जवाबों:


80

"स्वच्छ" इतिहास प्राप्त करने के लिए रिबासिंग को खत्म कर दिया गया है। यदि आप इतिहास को संरक्षित करना चाहते हैं तो सबसे अच्छा तरीका यह है कि आप रिबेस के बजाय मर्ज करें। इस तरह अगर आपको कभी किसी संशोधन पर वापस जाने की आवश्यकता है, तो यह ठीक है उसी तरह है जैसे आपने विकास के दौरान परीक्षण किया था। यह भी पहले से हल किए गए मर्ज संघर्ष के बारे में आपके मुद्दे को हल करता है।

यदि आप इतिहास के संरक्षण के बारे में परवाह नहीं करते हैं, तो आप मास्टर की एक नई शाखा बना सकते हैं, इसकी जांच कर सकते हैं, फिर शाखा git read-tree -u -m devसे मिलान करने के लिए अपने काम के पेड़ को अपडेट करने के लिए एक करें dev। फिर आप सब कुछ एक बड़ी प्रतिबद्धता में कर सकते हैं और इसे सामान्य रूप में मास्टर में विलय कर सकते हैं।


1
आपने यहां जो प्रभावी ढंग से किया है वह एक मर्ज है। नई शाखा अनावश्यक है।
इसक गिल्बर्ट

1
@isakgilbert यह केवल एक ही है यदि आप साथ विलय करते हैं --squash। यदि शाखा पर एन कमिट थे, तो एक नियमित मर्ज एन या एन + 1 को जोड़ देगा । ऊपर दिए गए सुझाव, या , हमेशा केवल एक ही प्रतिबद्ध को मास्टर में जोड़ देंगे। merge --squash
पेट्रिग्नन

3
@ytpete, हाँ बिल्कुल। मुझे लगता है कि उपर्युक्त सिर्फ देवता से लेकर स्वामी तक मर्ज करने का एक गोल चक्कर है। "नई शाखा बनाना" केवल उसी स्थान पर इंगित कर रहा है जैसे कि मास्टर है। "सब कुछ एक बड़ी प्रतिबद्धता में" बस स्क्वैश कर रहा है।
isak गिल्बर्ट

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

2
मैं "स्वच्छ" इतिहास के साथ अधिक असहमत नहीं हो सकता। यह ओवररेटेड नहीं है यह समय बचाता है और चीजों को कम भ्रमित करता है।
बेसिकल

121

git merge --squashअब बड़ी मात्रा में काम और कई मर्ज के बाद रिबासिंग का मेरा पसंदीदा तरीका है ( इस उत्तर को देखें )। यदि आप जिस शाखा पर काम कर रहे हैं उसे कॉल किया जाता है my-branchऔर आप masterतब से रिबेस करना चाहते हैं तो बस निम्नलिखित करें:

git checkout my-branch
git branch -m my-branch-old
git checkout master
git checkout -b my-branch
git merge --squash my-branch-old
git commit

13

दो टिप्पणी:

  • आप अपने खुद के (गैर अभी तक धकेल दिए गए) काम को कई बार रिबेट कर सकते हैं, जैसा कि आप चाहते हैं कि नए भ्रूण के शीर्ष पर।
  • यदि आप सक्रिय हो गए थेgit rerere , तो आप मर्ज टकराव (रिबेस के दौरान) से बच सकते हैं , जो इस तरह की स्थिति के लिए किया जाता है।
    http://git-scm.com/images/rerere2.png पर अधिक देखें git rerere

@ लुलियन: उस स्थिति में, यदि आपको अपने काम को फिर से करना पड़े, तो मुझे लगता है कि आपको उन मर्ज संघर्ष प्रस्तावों को फिर से करना होगा।
VonC

@krlmlr धन्यवाद। मैंने लिंक को पुनर्स्थापित किया है, एक चित्रण और उस कमांड के मैन पेज पर एक संदर्भ जोड़ा है।
VonC

9

आप अपनी शाखा में सभी परिवर्तनों को ले सकते हैं और उन्हें masterनिम्नलिखित के साथ एक नई प्रतिबद्धता में डाल सकते हैं :

git diff master > my_branch.patch
git checkout master
patch -p1 < my_branch.patch

फिर अपनी फ़ाइलों को चरणबद्ध करें और प्रतिबद्ध करें।


1

मर्ज टकरावों की पुनरावृत्ति के बारे में, आप मर्ज संघर्षों के डेटाबेस को बनाए रखने के लिए गिट रेयर का उपयोग कर सकते हैं कि पहले से ही कैसे हल किया गया है, ताकि रिबास का प्रदर्शन करने से समान संघर्षों का परिणाम आपके द्वारा किए गए श्रमसाध्य भागों का स्वचालित रूप से होगा।

https://hackernoon.com/fix-conflicts-only-once-with-git-rerere-7d116b2cec67

git config --global rerere.enabled true

एक बात यह देखने की है कि यदि आपने कुछ गलत हल किया है तो यह अगली बार भी आपके लिए स्वतः ही बोर हो जाएगा, और आपको वास्तव में इसका एहसास नहीं होगा।

यहाँ और अधिक औपचारिक प्रलेखन: https://git-scm.com/docs/git-rerere

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.