चलिए --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