2012-02-23 9 views
10

मेरा दिन के लिए दिन के Git कार्यप्रवाह में, मैं की तरह इतने सारे विषय शाखाएं हैं,:Git: बार-चलती आधार पर कई विषय शाखाओं को बनाए रखने

 
       o--o--o (t2) 
      /
     o--o (t1) 
     /
o--o--o (master) 
     \ 
     o--o--o (t3) 

जब मैं नदी के ऊपर से खींच,

 
       o--o--o (t2) 
      /
     o--o (t1) 
     /
o--o--o--n--n--n (master) 
     \ 
     o--o--o (t3) 

मैं करना चाहते हैं नए मास्टर के शीर्ष पर मेरे सभी विषय शाखाओं rebase:

 
         o'--o'--o' (t2) 
        /
        o'--o' (t1) 
       /
o--o--o--n--n--n (master) 
       \ 
        o'--o'--o' (t3) 

वर्तमान में मैं इसे git rebase --onto का उपयोग करके हाथ से करता हूं। इस परिदृश्य में, पूरे अद्यतन प्रक्रिया होगा:

$ git checkout master 
$ git pull 
$ git rebase master t1 
$ git rebase --onto t1 t2~3 t2 
$ git rebase master t3 

यह भी hairier जब विभिन्न विषय शाखाओं और जोड़ने प्रतिबद्ध के बीच कूद हो जाता है। मेरे मामले में विषय शाखाओं के बीच

निर्भरता विशुद्ध रूप से पेड़ की तरह हैं: कोई शाखा एक भी अन्य शाखा की तुलना में अधिक पर निर्भर करता है। (मैं कुछ विशेष क्रम में अंततः नदी के ऊपर निर्भर पैच करने के लिए है, तो मैं चयन के लिए एक प्रायोरी कि।)

वहाँ किसी भी उपकरण मुझे इस कार्यप्रवाह का प्रबंधन में मदद कर सकते हैं? मैं TopGit देखा है, लेकिन यह tg patch ईमेल आधारित कार्यप्रवाह, जो मेरे लिए प्रासंगिक नहीं है करने के लिए काफी भारी बंधे जा रहा है।

+0

क्यों आप 'पर t2' रिबेसिंग कर रहे हैं' बजाय सिर्फ 't1' पर इसे रिबेसिंग की master', जैसा कि आप अपने ग्राफ़ के दिखाने:

कि सभी ने कहा है, यहाँ एक वैकल्पिक नुस्खा है? इसी तरह, 't3' के साथ,' --onto' ध्वज उचित नहीं है। –

+0

यह प्रश्न भी देखें [सभी उप-शाखाओं के साथ गिट रिबेस शाखा] (http://stackoverflow.com/q/2730866/112968) – knittl

+0

केविन: व्हाउप्स, हाँ - टाइपो :) – nornagon

उत्तर

4

सुंदर ज्यादा एक ही प्रश्न Git मेलिंग सूची पर कहा गया था: Rebasing Multiple branches at once... जुड़ा हुआ प्रतिक्रिया एक पर्ल स्क्रिप्ट संलग्न किया है कि आदेशों आप की आवश्यकता होगी उत्पन्न करता है ।

यदि आप चाहते हैं कि यह स्क्रिप्ट तेज़ हो और अपने पैर की उंगलियों पर चलने से बचें, तो स्वचालित रीबिंग के लिए केवल एक कार्य प्रतिलिपि स्थापित करने के लिए git-new-workdir का उपयोग करने पर विचार करें।

आप पाते हैं अपने आप को पर एक ही संघर्ष को हल करने हैं, तो git rerere को सक्षम करने पर विचार करें।

# Construct a placeholder commit that has all topics as parent. 
HEADS="$(git for-each-ref refs/heads/\*)" && 
MAGIC_COMMIT=$(echo "Magic Octopus"$'\n\n'"$HEADS" | 
    git commit-tree \ 
    $(git merge-base $(echo "$HEADS" | sed 's/ .*//'))^{tree} \ 
    $(echo "$HEADS" | sed 's/ .*//;s/^/-p /')) && 
git update-ref refs/hidden/all $MAGIC_COMMIT 

# Rebase the whole lot at once. 
git rebase --preserve-merges master refs/hidden/all 

# Resolve conflicts and all that jazz. 

# Update topic refs from the rebased placeholder. 
PARENT= 
echo "$HEADS" | 
while read HASH TYPE REF 
do 
    let ++PARENT 
    git update-ref -m 'Mass rebase' "$REF" refs/hidden/all^$PARENT "$HASH" 
done 
+1

बहुत बढ़िया, धन्यवाद! : डी मैंने इस तकनीक के एक छोटे से संशोधित संस्करण का उपयोग एक स्क्रिप्ट बनाने के लिए किया है जो केवल एक सबट्री को रीबेस करता है: https://github.com/nornagon/git-rebase-all – nornagon

+0

वोट वोट के कारण? –

-2

rebase न करें। एक सामान्य बिंदु से अपनी विशेषताओं को शुरू करें। विलय अंत में रास्ता कम काम कर रहे हैं।

यह हमें क्या करना है:

http://dymitruk.com/blog/2012/02/05/branch-per-feature/

+0

यह अच्छा है, लेकिन मैं क्रोमियम वर्कफ़्लो के साथ एकीकृत कर रहा हूं, जो रैखिक है। ये विषय शाखाएं केवल स्थानीय हैं, छोटी (आमतौर पर 1-5 प्रत्येक को प्रतिबद्ध करती है) और अल्पकालिक रहते हैं। – nornagon

+0

वाह, यह पढ़ने के लिए एक अच्छा लेख था। +1 रीबेजिंग के बारे में भी समझदार सलाह, हालांकि विशिष्ट परिस्थितियों में ऐसा करने के कारण होंगे। कार्यप्रवाह मैं रेखांकित किया है में – jupp0r

+0

@nornagon, यह छोटे सुविधाओं के लिए लागू होता है। इसमें कोई फर्क नही है।विलय सामान्य रूप से बेहतर होता है क्योंकि आप कोड परिवर्तनों को ध्यान में रखेंगे और जहां वे चलती फ़ाइलों को शामिल करेंगे। –

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