Git 1.9 / 2.0 Q1 2014 के साथ शुरू, आपको अपनी पिछली शाखा की उत्पत्ति को फिर से लिखना होगा इससे पहले कि इसे पुनर्लेखन अपस्ट्रीम शाखा पर लिखा जाए, जैसा कि अरस्तू पगलतज़िस के उत्तर में वर्णित है : प्रतिबद्ध 07d406b
देखें और d96855f प्रतिबद्ध करें :
topicके साथ बनाई गई शाखा पर काम करने के बाद git checkout -b topic origin/master, रिमोट-ट्रैकिंग शाखा का इतिहास origin/masterफिर से निर्मित और पुनर्निर्मित हो सकता है, जिससे इस आकार का इतिहास बन जाएगा:
o---B1
/
---o---o---B2--o---o---o---B (origin/master)
\
B3
\
Derived (topic)
जहां origin/masterप्रतिबद्ध पर बात करने के लिए इस्तेमाल किया B3, B2, B1और अब यह पर बताते हैं B, और अपने topicसे यह वापस जब शाखा शीर्ष पर शुरू किया गया था origin/masterपर था B3।
यह मोड कांटे के बिंदु के रूप में origin/masterखोजने के लिए रिफ्लॉग का उपयोग करता है B3, ताकि topicअपडेट के शीर्ष पर इसे रीबेड किया जा सकेorigin/master :
$ fork_point=$(git merge-base --fork-point origin/master topic)
$ git rebase --onto origin/master $fork_point topic
इसीलिए git merge-baseकमांड में एक नया विकल्प है:
--fork-point::
वह बिंदु ज्ञात करें जिस पर एक शाखा (या कोई इतिहास जो आगे बढ़ता है <commit>) दूसरी शाखा (या किसी संदर्भ) से कांटा गया <ref>।
यह केवल दो कॉमन के सामान्य पूर्वजों के लिए नहीं दिखता है, बल्कि यह<ref><commit><ref> देखने के लिए भी ध्यान में रखता है कि क्या इतिहास शाखा के पहले के अवतार से आगे निकल रहा है ।
" git pull --rebase" कमांड शाखा के कांटे के बिंदु को गणना करता है जिसे " base" शाखा (आमतौर पर एक रिमोट-ट्रैकिंग शाखा) की रिफ्लॉग प्रविष्टियों का उपयोग करके रीबेड किया जा रहा है , शाखा का काम उस स्थिति से निपटने के लिए था जिसमें "आधार" था। शाखा का पुनर्निर्माण और पुनर्निर्माण किया गया है।
उदाहरण के लिए, यदि इतिहास ऐसा दिखता है, जहां:
- की वर्तमान टिप "
base" शाखा में है B, लेकिन पहले मनाया लाना है कि इसकी टिप हुआ करता था B3और फिर B2और फिर B1
, वर्तमान के लिए हो रही करने से पहले और
- नवीनतम "आधार" के शीर्ष पर पुनरीक्षित होने वाली शाखा प्रतिबद्ध है
B3,
यह खोजने की कोशिश करता B3की "उत्पादन के माध्यम से जा द्वारा git rev-list --reflog base" (यानी B, B1, B2, B3) जब तक यह पाता है एक प्रतिबद्ध है कि मौजूदा टिप के एक पूर्वज है " Derived (topic)"।
आंतरिक रूप से, हमारे पास get_merge_bases_many()यह है कि इस की गणना एक बार में की जा सकती है।
हम चाहते हैं कि एक मर्ज-बेस के बीच Derivedऔर एक काल्पनिक मर्ज कमिट हो, जिसके परिणामस्वरूप " base (origin/master)" के सभी ऐतिहासिक सुझावों को मर्ज किया जाएगा ।
जब इस तरह की प्रतिबद्धता मौजूद होती है, तो हमें एक एकल परिणाम प्राप्त करना चाहिए, जो " base" "की रिफ्लॉग प्रविष्टियों में से एक से मेल खाता है ।
Git 2.1 (Q3 2014) इस सुविधा को और अधिक मजबूत बना देगा: जॉन कीपिंग द्वारा प्रतिबद्ध 1e0dacd देखें )johnkeeping
उस परिदृश्य को सही ढंग से हैंडल करें जहां हमारे पास निम्नलिखित टोपोलॉजी है:
C --- D --- E <- dev
/
B <- master@{1}
/
o --- B' --- C* --- D* <- master
कहाँ पे:
B'का एक निश्चित-अप संस्करण है, Bजिसके साथ पैच-समान नहीं है B;
C*और D*पैच-समान के लिए कर रहे Cहैं और Dक्रमश: और संघर्ष से टेक्स्ट रूप यदि गलत क्रम में लागू किया;
Eपर निर्भर करता है D।
का सही परिणाम git rebase master devयह है Bकी कांटा बिंदु के रूप में पहचान की है devऔर master, कि इतने C, D, Eप्रतिबद्ध है कि पर पुनः बजाया कर लिया जाना चाहिए master; लेकिन Cऔर Dपैच-समान के साथ कर रहे हैं C*और D*और इतने छोड़ा जा सकता है, ताकि अंतिम परिणाम है:
o --- B' --- C* --- D* --- E <- dev
यदि कांटा-बिंदु की पहचान नहीं की जाती है, तो Bएक शाखा में B'परिणाम होता है जिसमें एक संघर्ष होता है और यदि पैच-समान समरूपता की सही पहचान नहीं होती है, तो Cएक शाखा से युक्त D(या समतुल्य D*) एक संघर्ष में परिणाम होता है।
"" का --fork-point"मोड git rebase" वापस आ गया जब कमान को वापस 2.20 युग में सी लिखा गया था, जिसे गिट 2.27 (Q2 2020) के साथ ठीक किया गया है।
देखें f08132f प्रतिबद्ध द्वारा (09 दिसंबर 2019) Junio सी Hamano ( gitster) ।
(द्वारा विलय Junio सी Hamano - gitster- में fb4175b प्रतिबद्ध , 27 मार्च 2020)
rebase: --fork-pointरिग्रेशन फिक्स
साइन-ऑफ-बाय: एलेक्स टोरोक
[jc: ने सुधार को ठीक किया और एलेक्स के परीक्षणों का उपयोग किया]
हस्ताक्षरित-ऑफ-बाय: जूनियो सी हमानो
" git rebase --fork-point master" मैं ठीक काम करता था, जैसा कि आंतरिक रूप से कहा जाता है " git merge-base --fork-point" यह जानता था कि शॉर्ट रिफनाम को कैसे संभालना है और अंतर्निहित get_fork_point()फ़ंक्शन को कॉल करने से पहले इसे पूर्ण रीनेम पर डाइव करें ।
सी में फिर से लिखे जाने के बाद यह सच नहीं है, क्योंकि इसके इंटरनल कॉल को सीधे तौर पर get_fork_point()छोटा रेफरी नहीं कहा जाता है।
"Git मर्ज-बेस" में उपयोग किए जाने वाले तर्क को "पूर्ण रीफाइन तर्क को dwim डिबेट" में ले जाएं, जो कि अंतर्निहित get_fork_point()फ़ंक्शन के लिए "git मर्ज-बेस" में उपयोग किया जाता है , ताकि "git rebase" के कार्यान्वयन में फ़ंक्शन का अन्य कॉलर ठीक करने के लिए उसी तरह का व्यवहार करता है यह प्रतिगमन।