2012-02-23 9 views
10

W mojej dnia na dzień git workflow, mam wiele gałęzi tematycznych, tak:Git: utrzymanie wielu dziedzin tematycznych na często poruszającego bazy

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

Kiedy wyciągnąć od góry,

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

Chcę rebase wszystkie moje gałęzie Wstaw na szczycie nowej Master:

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

Obecnie zrobić to ręcznie, za pomocą git rebase --onto. W tym scenariuszu, cały proces aktualizacji będzie:

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

ten staje się jeszcze hairier gdy skacze pomiędzy różnymi gałęziami tematu i dodanie zobowiązuje.

Zależności między oddziałami temat w moim przypadku są czysto drzewa jak: brak oddział zależy od więcej niż jednego innego oddziału. (Mam ostatecznie upstream łaty zależne w pewnym określonym porządku, więc wybiorę że porządek a priori.)

Czy istnieją jakieś narzędzia, które może mi pomóc zarządzać tym obieg? Widziałem TopGit, ale wydaje się być związany dość mocno do tg patch email na bazie workflow, która nie ma znaczenia dla mnie.

+0

Czemu przebazowania 't2' na' master' zamiast tylko przebazowania go na 't1', jak pokazać na wykresie? Podobnie w przypadku 't3' flaga' --onto' nie jest odpowiednia. –

+0

Zobacz także pytanie [git rebase branch z wszystkimi podgałęziami] (http://stackoverflow.com/q/2730866/112968) – knittl

+0

Kevin: whoops, yes - literówka :) – nornagon

Odpowiedz

4

niemal tak samo pytanie zadano na liście git korespondencji: Rebasing Multiple branches at once... prowadzi link odpowiedź jest skrypt perla dołączony który generuje polecenia będą potrzebne .

Jeśli chcesz, aby ten skrypt był szybki i unikniesz jego śladów na palcach, rozważ także użycie git-new-workdir, aby skonfigurować kopię roboczą tylko do automatycznego ponownego zapisywania.

Jeśli napotykasz na ciągłe rozwiązywanie tych samych konfliktów, rozważ włączenie git rerere.

Powiedziawszy to wszystko, tu jest alternatywny przepis:

# 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

Niesamowite, dzięki! : D Użyłem nieco zmodyfikowanej wersji tej techniki do stworzenia skryptu, który zmienia tylko podtekst: https://github.com/nornagon/git-rebase-all – nornagon

+0

Powód głosowania w dół? –

-2

Nie zmieniają bazę. Uruchom swoje funkcje ze wspólnego punktu. Scalanie to ostatecznie mniej pracy.

To, co robimy:

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

+0

to miłe, ale ja integracji z workflow chromu, który jest liniowy. Te gałęzie tematyczne są tylko lokalne, małe (zazwyczaj 1-5 zatwierdzeń) i są krótkotrwałe. – nornagon

+0

Wow, to był dobry artykuł do przeczytania. +1 Rozsądna porada dotycząca również zmiany miejsca pobytu, chociaż w pewnych okolicznościach będą powody, by to zrobić. – jupp0r

+0

@Nornagon w przepływie pracy, który opisałem, dotyczy małych funkcji. Nie ma różnicy.Łączenie jest ogólnie lepsze, ponieważ bierze się pod uwagę zmiany kodu i ich pochodzenie, w tym przenoszenie plików. –

Powiązane problemy