2010-04-28 15 views
15

क्या गिट में इसके सभी उप-शाखाओं के साथ शाखा को पुनर्जीवित करना संभव है?सभी उप-शाखाओं के साथ गिट रिबेस शाखा

मैं अक्सर कुछ काम करने के लिए त्वरित/परिवर्तनीय टैग के रूप में शाखाओं का उपयोग करता हूं।

* master 
* 
* featureA-finished 
* 
* origin/master 

अब मैं origin/master पर rebase -imaster करना चाहते हैं, को बदलने/reword के लिए प्रतिबद्ध featureA-finished^

git rebase -i --onto origin/master origin/master master के बाद, मैं मूल रूप से इतिहास बनना चाहता हूँ:

* master 
* 
* featureA-finished 
* (changed/reworded) 
* origin/master 

लेकिन मैं क्या मिलता है :

इसके चारों ओर एक रास्ता है, या मैं नई rebased प्रतिबद्धताओं पर शाखाओं को पुनर्जीवित करने के साथ अटक गया हूँ?

+0

आप अपनी गतिविधियों को चिह्नित करने के लिए शाखाओं के बजाय 'गिट नोट्स' का उपयोग कर सकते हैं - उनको रीबेज के दौरान स्वचालित रूप से कॉपी किया जाता है, मुझे विश्वास है। (यह एक नई सुविधा है, इसलिए आपको नवीनतम रिलीज की आवश्यकता होगी) http://www.kernel.org/pub/software/scm/git/docs/git-notes.html – Cascabel

+0

यह भी देखें [मैं कैसे रीबेस करूंगा संपूर्ण उपधारा - कई शाखाएं, उनके बीच कुछ लिंक विलय से उत्पन्न होते हैं] (http://stackoverflow.com/a/9706495/94687)। उस समाधान का अप्रिय हिस्सा विषय शाखा को रीसेट करने की ज़रूरत है, बाद में नए पुनर्जीवित कामों को रीफ्रेश करें। –

उत्तर

2

मुझे यकीन है कि कैसे वास्तव में तुम वहाँ मिल गया है, लेकिन नहीं कर रहा हूँ:

git branch -f (same changeset as featureA-finished) 

सही इतिहास के साथ अपने featureA-finished शाखा पुनर्स्थापित करने के लिए पर्याप्त होना चाहिए।

+0

हां, यही मेरा मतलब है »नई पुनर्जीवित प्रतिबद्धताओं पर शाखाओं को पुनर्निर्माण«। मुझे पता है कि यह इस तरह से संभव है, लेकिन यह वास्तव में – knittl

+0

@knittl: दिलचस्प तीन शाखाओं के लिए वास्तव में बोझिल हो जाता है। इससे पहले और बाद में उन शाखाओं का एक और विवरण लॉग आरेख यहां मदद कर सकता है। – VonC

+0

बस 15 कामों के साथ एक ही ग्राफ की कल्पना करें, प्रत्येक दूसरी प्रतिबद्धता विशेषता है, फीचर बी-तैयार, फीचर सी-समाप्त, आदि – knittl

1

मैं सलाह देता हूं कि featureA-finished को origin/master पर पहले रीबेज करना है। फिर rewording कदम करो। इसके बाद, master को featureA-finished पर रीबेस करें। यह आपको अंतिम परिणाम देगा जो आप चाहते हैं।

ध्यान दें कि आपको दोनों rebases पर -i का उपयोग करने की आवश्यकता होगी, और दूसरे रीबेस में मूल featureA-finshed से सभी कामों को हटाना पड़ सकता है। यदि आप चाहते थे, तो आप एक स्क्रिप्ट लिख सकते हैं जो इंटरमीडिएट शाखा को सहेजकर और --onto नए संस्करण के लिए आधार के रूप में इसका उपयोग करके इसे खत्म कर देगी। यदि आपने इसे सही लिखा है तो यह इस तरह के 'सबब्रंच' के अनुक्रम को भी संभाल सकता है। अगर आपको मदद की ज़रूरत है तो मैं एक को धक्का देने का प्रयास कर सकता हूं।

5

गिट के Object Model के अनुसार यदि आप केवल एक प्रतिबद्धता के मेटा-डेटा को बदलते हैं (यानी संदेश भेजें) लेकिन अंतर्निहित डेटा ("पेड़ (ओं)" नहीं है, तो इसमें ट्री हैश अपरिवर्तित रहेगा।

एक प्रतिबद्ध संदेश संपादित करने के अलावा, आप एक रिबेज भी कर रहे हैं, जो आपके इतिहास में प्रत्येक प्रतिबद्धता के वृक्ष हैंश को बदल देगा, क्योंकि origin/master से खींचा गया कोई भी परिवर्तन आपके पुनः लिखित इतिहास में फ़ाइलों को प्रभावित करेगा: जिसका अर्थ है कुछ फाइलें (ब्लब्स) जो आपके प्रतिबद्ध बिंदु बदल गई हैं।

तो आप जो चाहते हैं उसे करने के लिए कोई बुलेट प्रूफ तरीका नहीं है।

उस ने कहा, rebase -i के साथ एक प्रतिबद्धता संपादित करना आम तौर पर प्रतिबद्धता के टाइमस्टैम्प और लेखक को परिवर्तित नहीं करता है, इसलिए आप इसे रीबेज ऑपरेशन से पहले और बाद में अपने कामों की विशिष्ट पहचान करने के लिए उपयोग कर सकते हैं।

आपको एक ऐसी स्क्रिप्ट लिखनी होगी जो रिबेस करने से पहले इन "टाइमस्टैम्प: लेखक" पहचानकर्ता के खिलाफ सभी शाखा प्रारंभ-बिंदुओं को रिकॉर्ड करे, और उसके बाद पुनः लिखने के लिए "टाइमस्टैम्प: लेखक" आईडी के साथ पुनः लिखा जाए और पुनः छूट लें उस पर शाखा।

अफसोस की बात है कि मेरे पास अब इस स्क्रिप्ट को लिखने का प्रयास करने का समय नहीं है, इसलिए मैं केवल आपको शुभकामनाएं देता हूं!

संपादित: आप लेखक ईमेल पता और टाइमस्टैम्प का उपयोग कर प्राप्त कर सकते हैं:

$ git log --graph --all --pretty=format:"%h %ae:%ci" 
* 53ca31a [email protected]gmail.com:2010-06-16 13:50:12 +0100 
* 03dda75 [email protected]:2010-06-16 13:50:11 +0100 
| * a8bb03a [email protected]:2010-06-16 13:49:46 +0100 
| * b93e59d [email protected]:2010-06-16 13:49:44 +0100 
|/ 
* d4214a2 [email protected]:2010-06-16 13:49:41 +0100 

और आप उनके लिए प्रतिबद्ध हैश के आधार पर इनमें से प्रत्येक के लिए शाखाओं की सूची प्राप्त कर सकते हैं:

$ git branch --contains 03dda75 
* testbranch 

प्रति प्रतिबद्धियों के लिए कई शाखाओं के लिए देखें, आम पूर्वज d4214a2 दोनों शाखाओं से संबंधित है!

2

ऐसा लगता है कि यह सुविधा धीरे-धीरे गिट में हो रही है। rebase विकल्प --rebase-refs प्राप्त करेगा जो मेरे मूल उत्तर के ठीक से करेगा। प्रस्तावित पैच श्रृंखला के लिए gmane पर rebase: command "ref" and options --rewrite-{refs,heads,tags} धागा देखें।

+0

यह एक दयालुता है कि ऐसा लगता है कि गिट में नहीं आया है: मैंने ऐसी सुविधा नहीं देखी है गिट-रिबेस के लिए वर्तमान दस्तावेज (मैनपेज)! (Git-1.7.9.3) –

संबंधित मुद्दे