git एचजी: गिट के रिबेस जैसे रिबेस कैसे करें




mercurial dvcs (4)

गिट में मैं यह कर सकता हूं:

1. Start working on new feature:
$ git co -b newfeature-123  # (a local feature development branch)
do a few commits (M, N, O)

master A---B---C
                \
newfeature-123   M---N---O

2. Pull new changes from upstream master:
$ git pull
(master updated with ff-commits)

master A---B---C---D---E---F
                \
newfeature-123   M---N---O

3. Rebase off master so that my new feature 
can be developed against the latest upstream changes:
(from newfeature-123)
$ git rebase master

master A---B---C---D---E---F
                            \
newfeature-123               M---N---O


मैं जानना चाहता हूं कि मर्कुरियल में एक ही चीज़ कैसे करें, और मैंने वेब को उत्तर के लिए खराब कर दिया है, लेकिन मुझे सबसे अच्छा मिल सकता था: गिट रिबेस - क्या वह कर सकता है

वह लिंक 2 उदाहरण प्रदान करता है:
1. मैं यह स्वीकार करूंगा कि: (उदाहरण से संशोधन को अपने उदाहरण से उन लोगों के साथ बदलना)

hg up -C F  
hg branch -f newfeature-123  
hg transplant -a -b newfeature-123 

यह बहुत बुरा नहीं है, सिवाय इसके कि यह पूर्व-रिबेस एमएनओ के पीछे एक अनमोल सिर के रूप में छोड़ देता है और 3 नए काम करता है एम ', एन', ओ 'जो उन्हें अद्यतन मुख्य लाइन को बंद करने का प्रतिनिधित्व करता है।

असल में समस्या यह है कि मैं इसके साथ समाप्त होता हूं:

master A---B---C---D---E---F
                \           \
newfeature-123   \           M'---N'---O'
                  \
newfeature-123     M---N---O

यह अच्छा नहीं है क्योंकि यह स्थानीय, अवांछित कामों के पीछे छोड़ देता है जिसे छोड़ दिया जाना चाहिए।

  1. एक ही लिंक से दूसरा विकल्प है
hg qimport -r M:O
hg qpop -a
hg up F
hg branch newfeature-123
hg qpush -a
hg qdel -r qbase:qtip

और इसका परिणाम वांछित ग्राफ में होता है:

master A---B---C---D---E---F
                            \
newfeature-123               M---N---O

लेकिन इन आदेशों (उनमें से सभी 6!) की तुलना में बहुत अधिक जटिल लगते हैं

$ git rebase master

मैं जानना चाहता हूं कि यह एचजी में एकमात्र समकक्ष है या यदि कोई अन्य तरीका उपलब्ध है जो कि गिट की तरह सरल है।


मान लें कि आपके पास आधुनिक एचजी इंस्टॉलेशन है, आप बस जोड़ सकते हैं:

[extensions]
rebase = 

~ / .hgrc करने के लिए।

फिर आप hg rebase , hg pull --rebase , या hg help rebase hg pull --rebase उपयोग कर सकते हैं।


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

यह तब अच्छा काम करता है जब सबमिट किए गए परिवर्तनों की समीक्षा उन लोगों द्वारा की जाती है जो उन्हें लिखने से पहले नहीं लिखते हैं, इसलिए मेनलाइन में जाने वाले परिवर्तन आम तौर पर डीबग और काम कर रहे होते हैं। फिर जब आप किसी रेखा की उत्पत्ति पर बैकट्रैक करते हैं, तो आप इसके साथ आने वाले सभी परिवर्तनों को देखते हैं, बदलाव के विकास के बीच में कुछ बिंदु नहीं है।

X265 योगदानकर्ता पृष्ठ बताता है कि x265 प्रोजेक्ट को सबमिट करने के लिए उन्हें तैयार करने के लिए आप जिस बदलाव पर काम कर रहे हैं, उसे फिर से प्रतिबद्ध करने के लिए कैसे करें । (कुछ को प्रतिबद्ध करने के लिए TortoiseHG का उपयोग करने सहित, लेकिन व्यक्तिगत फ़ाइल में सभी परिवर्तन नहीं, जैसे गिट गुई के चरण / प्रतिबद्धता के लिए अस्थिर diff हंक)।

प्रक्रिया एचजी को अपस्ट्रीम टिप में अपडेट करने के लिए है, और फिर कार्यशील निर्देशिका में आपके सभी परिवर्तनों को असामान्य करें। किसी भी शेल्व को जो आप सबमिट करना चाहते हैं उसका हिस्सा नहीं हैं, फिर बाकी को प्रतिबद्ध प्रतिबद्ध संदेशों के साथ बाकी अलग-अलग कामों को तोड़ दें।

मुझे लगता है कि आप कॉपी / पेस्ट करेंगे और फिर पैचसेट के पिछले पुनरावृत्तियों से प्रतिबद्ध संदेश संपादित करें जिन्हें आप संशोधित कर रहे हैं। या हो सकता है कि आप अपने पुराने प्रतिबद्ध संदेशों को संपादित करने के लिए प्रारंभ बिंदु के रूप में प्राप्त करने के लिए, अपने पुरानी प्रतिबद्धताओं (गिट भाषा में चेरी-पिक) तैयार कर सकें, और फिर उन्हें एक-एक करके संशोधित कर सकें।


आप रीबेस एक्सटेंशन की तलाश में हो सकते हैं। ( समरऑफकोड 2008 के हिस्से के रूप में लागू)

उन मामलों में स्थानीय परिवर्तनों को "अलग" करने के लिए उपयोगी हो सकता है, मुख्यधारा के साथ भंडार को सिंक्रनाइज़ कर सकते हैं और फिर नए रिमोट परिवर्तनों के शीर्ष पर निजी परिवर्तन जोड़ सकते हैं। इस ऑपरेशन को रीबेस कहा जाता है।

से प्राप्त करना :

सेवा मेरे:


मुझे नहीं लगता कि उपर्युक्त उत्तर ओपी के लक्ष्य को प्राप्त करते हैं, जो कि अपनी कार्य शाखा को बनाए रखना था, केवल मूल शाखा के बाद के बिंदु के खिलाफ पुनर्विचार किया गया था।

मान लीजिए कि मैं इस ग्राफ से शुरू करता हूं (ग्राफ़्लॉग एक्सटेंशन का उपयोग करके जेनरेट किया गया है। ग्राफ़लॉग के लिए गंभीर गीक प्यार)।

@  9a4c0eb66429 Feature 3 commit 2 tip feature3
|
| o  af630ccb4a80 default againagainagain  
| |
o |  98bdde5d2185 Feature 3 branch commit 1  feature3
|/
o  e9f850ac41da foo   

अगर मैं फीचर 3 शाखा पर हूं और इसे फिर से हासिल करने के लिए पुनः प्रयास करना चाहता हूं, तो मैं समझता हूं कि मैं hg rebase -d default चलाऊंगा। इसका निम्नलिखित परिणाम है:

@  89dada24591e Feature 3 commit 2 tip 
|
o  77dcce88786d Feature 3 branch commit 1  
|
o  af630ccb4a80 default againagainagain  
|
o  e9f850ac41da foo  

मिशन पूरा हुआ? मुझे ऐसा नहीं लगता। समस्या यह है कि जब फीचर 3 शाखा पर काम करता है, तो फिर से पुन: प्राप्त किया गया था , सुविधा 3 शाखा हटा दी गई थी । मेरी प्रतिबद्धता को डिफ़ॉल्ट शाखा में स्थानांतरित कर दिया गया है, जो कि मैं पहले स्थान से बचने की कोशिश कर रहा था।

गिट में, परिणाम इस तरह दिखेगा:

@  9a4c0eb66429 Feature 3 commit 2 tip
|
o  98bdde5d2185 Feature 3 branch commit 1 **feature3**
|
o  af630ccb4a80 default againagainagain
|
o  e9f850ac41da foo

ध्यान दें कि सुविधा 3 शाखा अभी भी मौजूद है, दोनों काम अभी भी सुविधा 3 शाखा पर हैं, और डिफ़ॉल्ट रूप से दिखाई नहीं दे रहे हैं। कार्य शाखा को संरक्षित किए बिना, मैं नहीं देखता कि यह विलय से कैसे काम करता है।

अद्यतन : मैंने एचजी --keepbranches द्वारा समर्थित - --keepbranches ध्वज की खोज की, और मुझे सब कुछ रिपोर्ट करने में खुशी हुई है ओकी-डोकी। hg rebase -d default --keepbranches का उपयोग करके, मैं वास्तव में गिट व्यवहार को दोहराता हूं जिसे मैं चाहता था। बाद में कुछ उपनाम और मैं किसी के व्यवसाय की तरह पुन: प्रयास कर रहा हूं।





rebase