समझ और याद रिबेट पैरामीटर


12

अब तक git का सबसे भ्रमित करने वाला हिस्सा दूसरी शाखा पर रीबासिंग कर रहा है। विशेष रूप से, यह कमांड लाइन तर्क है जो भ्रमित कर रहे हैं।

हर बार जब मैं एक शाखा के एक छोटे टुकड़े को दूसरे के सिरे पर फिर से बनाना चाहता हूं, तो मुझे गिट रिबेस डॉक्यूमेंट की समीक्षा करनी होगी और मुझे यह समझने में 5-10 मिनट लगेंगे कि प्रत्येक 3 मुख्य तर्क क्या होने चाहिए।

git rebase <upstream> <branch> --onto <newbase>

मुझे यह याद रखने में मदद करने के लिए अंगूठे का एक अच्छा नियम क्या है कि इन 3 मापदंडों में से प्रत्येक को किसी अन्य शाखा को किसी भी प्रकार का छूट देने के लिए क्या निर्धारित किया जाना चाहिए?

इस बात को ध्यान में रखते हुए कि मैं फिर से और फिर से और फिर से (और फिर से) जीआईटी-रिबेस डॉक्यूमेंट पर चला गया हूं, लेकिन इसे समझना हमेशा मुश्किल होता है (जैसे कि एक उबाऊ वैज्ञानिक श्वेत-पत्र या कुछ और)। इसलिए इस बिंदु पर मुझे लगता है कि मुझे इसे समझने में मदद करने के लिए अन्य लोगों को शामिल करने की आवश्यकता है।

मेरा लक्ष्य है कि मुझे इन बुनियादी मापदंडों के लिए कभी भी दस्तावेज की समीक्षा नहीं करनी चाहिए। मैं अब तक उन्हें याद नहीं कर पाया, और मैंने पहले ही एक टन विद्रोह कर लिया है। इसलिए यह थोड़ा असामान्य है कि मैं अब तक हर दूसरे कमांड और इसके मापदंडों को याद करने में सक्षम हूं, लेकिन इसके साथ रिबेट नहीं --onto


आप या तो अपने सामान्य उपयोग के मामलों के लिए कुछ git उपनामों को परिभाषित कर सकते हैं, या एक विज़ार्ड स्क्रिप्ट को दस्तक दे सकते हैं जो आपको याद दिलाता है कि कमांड को निष्पादित करने से पहले प्रत्येक पैरामीटर का क्या मतलब है।
रोरी हंटर

4
आह, ये माइंडब्लोइंग, गिट कमांड विकल्पों का शुद्ध लालित्य। तो सहज रूप से उपयोग करने के लिए। हमेशा एक वास्तविक आनंद।
जेन्सजी

जवाबों:


10

चलिए --ontoफिलहाल छोड़ते हैं। upstreamऔर branchबहुत बुनियादी, और कर रहे हैं वास्तव में तरह-की नकल checkoutऔर branch- दूसरा तर्क वैकल्पिक है:

git branch <newbranch>
git branch <newbranch> <base>
git checkout -b <newbranch>
git checkout -b <newbranch> <base>
git rebase <upstream>
git rebase <upstream> <branch>

(के अलावा, में इन तर्कों के नाम rebase, "नदी के ऊपर" और "शाखा" बहुत नहीं हैं IMO वर्णनात्मक मैं आम तौर पर peachoftree की तरह उनमें से लगता है। <start>और <end>, जो मैं उन्हें कैसे उपयोग करेंगे: git rebase <start> <end>)

जब दूसरी शाखा को छोड़ दिया जाता है, तो परिणाम लगभग उस शाखा की पहले जाँच करने और फिर ऐसा करने के समान ही होता है, जैसे आपने उस शाखा को निर्दिष्ट नहीं किया था। अपवाद वह है branchजो आपकी वर्तमान शाखा नहीं बदलता है:

git checkout <base> && git branch <newbranch> && git checkout <previous_branch>
git checkout <base> && git checkout -b <newbranch>
git checkout <end>  && git rebase <start>

यह समझने के लिए कि क्या rebaseआह्वान किया जाता है, मैंने पहली बार इसे एक विशेष प्रकार के मर्ज के रूप में सोचकर शुरू किया था। यह वास्तव में नहीं है, लेकिन इससे मदद मिली जब पहली बार रिबास को समझना शुरू किया। आड़ू का उदाहरण उधार लेने के लिए:

A--B--F--G master
    \
     C--D--E feature

git merge masterइस में एक परिणाम:

A--B--F-----G master
    \        \
     C--D--E--H feature

जबकि git rebase master(शाखा पर feature!) परिणाम इस में हैं:

A--B--F--G master
          \
           C'--D'--E' feature

दोनों मामलों में, featureअब दोनों से कोड शामिल हैं masterऔर feature। यदि आप चालू नहीं हैं feature, तो दूसरा तर्क शॉर्टकट के रूप में इसे स्विच करने के लिए इस्तेमाल किया जा सकता है: git rebase master featureऊपर जैसा काम करेंगे।


अब, विशेष के लिए --onto। इसके साथ याद रखने वाला महत्वपूर्ण हिस्सा यह है कि यह <start>निर्दिष्ट नहीं होने पर चूक करता है। इसलिए, यदि मैंने --ontoविशेष रूप से निर्दिष्ट किया है, तो यह उसी के परिणामस्वरूप होगा:

git rebase --onto master master
git rebase --onto master master feature

(मैं केवल --ontoनिर्दिष्ट करने के बिना उपयोग नहीं करता हूं <end>क्योंकि यह मानसिक रूप से पार्स करने के लिए आसान है, यहां तक ​​कि सोचा कि दोनों एक ही हैं यदि पहले से ही हैं feature।)

यह देखना कि --ontoउपयोगी क्यों है, यहाँ एक अलग उदाहरण है। मान लें कि मैं चालू था featureऔर एक बग पर ध्यान दिया गया था , जिसे मैंने तब ठीक करना शुरू किया था - लेकिन गलती से featureबजाए बंद कर दिया था master:

A--B--F--G master
    \
     C--D--E feature
            \
             H--I bugfix

मैं जो चाहता हूं, वह इन तरीकों को "आगे" बढ़ाना है bugfixताकि वे अब निर्भर न रहें feature। जैसा कि यह है, इस उत्तर में ऊपर दिखाए गए किसी भी प्रकार के मर्ज या रिबेस featureको दो bugfixकमिट्स के साथ तीन कमिट्स ले जाएंगे ।

उदाहरण के लिए, git rebase master bugfixगलत है। सभी कमिट्स को शामिल करने के <start>लिए <end>होने वाली सीमा feature, जो कि शीर्ष पर फिर से दोहराई जाती है master:

A--B--F--G master
    \     \
     \     C'--D'--E'--H'--I' bugfix
      \
       C--D--E feature

क्या हम वास्तव में चाहते हैं से प्रतिबद्ध की सीमा है featureकरने के लिए bugfixकी चोटी पर पुनः बजाया जा करने के लिए master। इसके लिए यही --ontoहै - "स्टार्ट" शाखा की तुलना में एक अलग "रीप्ले" लक्ष्य निर्दिष्ट करना:

git rebase --onto master feature bugfix

A--B--F--G master
    \     \
     \     H'--I' bugfix
      \
       C--D--E feature

1

बस एक रिफ्रेशर, रिबासिंग मुख्य रूप से तब होता है जब आप चाहते हैं कि आपका प्रतिबद्ध इतिहास रैखिक दिखाई दे अगर दो शाखाओं ने एक दूसरे से स्वतंत्र रूप से विकसित किया है, तो मूल रूप से यह इतिहास को फिर से लिखता है।

जिस तरह से मुझे यह करना पसंद है git rebase --onto <target branch> <start branch> <end branch>

<target branch>वह शाखा कहां है जिस पर आप रिबासिंग कर रहे हैं, <start branch>आम तौर पर वह शाखा है जिसमें से <end branch>विभाजित है और <end branch>वह शाखा है जिसे आप रिबास कर रहे हैं।

अगर तुम साथ शुरू करो

A--B--F--G master
    \
     C--D--E feature

और करो

git rebase --onto master master feature

तुम्हे मिल जाएगा

A--B--F--G master
          \
           C'--D'--E' feature

एक और अच्छी बात यह है कि आप के <target branch>लिए चूक है कि <start branch>आप के रूप में एक ही पुनरावृत्ति कर सकते हैं

git rebase --onto master feature

यदि आपको अधिक सहायता की आवश्यकता है, तो आँसू गाइड के बिना रिबेस को देखें


आपका परिणाम भ्रामक लगता है। रिबेज को masterशाखा को अपरिवर्तित छोड़ देना चाहिए । आप बस 'सुविधा' प्राप्त करने के लिए बाहर की तरह, G--C'--D'--E'जबकि masterअभी भी बंद हो जाता है G
फ्रैंक

@ फ्रेंक, मैंने पूरी लीनियर हिस्ट्री की बात पर जोर देने के लिए ऐसा किया है, लेकिन अब मुझे लगता है कि आप बेहतर हैं। तय की।
पीचॉफ्ट्री

1
क्या आप एक उदाहरण दिखा सकते हैं कि कहां <target branch>और <start branch>क्या अलग हैं ताकि पाठकों को सबसे सामान्य मामला समझने में मदद मिल सके?
रफ़लविंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.