2009-08-31 13 views
5

Zwykle pracuję w gałęzi głównej, robię pewne poprawki i pcham.Jak połączyć główne zatwierdzenia z innego oddziału?

Następnie muszę również przekazać te zatwierdzenia do innego oddziału.

Więc zwykle, zrobię:

$ git checkout another-branch 
$ git cherry-pick commit1 
$ git cherry-pick commit2 
... 
$ git cherry-pick commitn 
$ git push 

Jakiś głupi, to mimo to mogę połączyć kilka zobowiązuje od szefa oddziału głównego więc nie muszą niepokoić cherry-pick jeden po jeden.

Odpowiedz

9

Brzmi to może chcesz, aby te rewizje na gałęzi innego niż kapitan, a następnie scalić tę gałąź zarówno pana i swoją drugą Branża:

git checkout working-branch 
<do some work> 
git commit 
git checkout master 
git merge working-branch 
git checkout second-branch 
git merge working-branch 

To jest dużo, dużo lepiej niż cherry- wybieranie, ponieważ nie wiąże się z powielaniem commitów w historii, pozbywa się problemów związanych z dwukrotnym wybieraniem commitów (których obecnie należy ręcznie unikać) ... i jest po prostu sposobem działania git. Nie wiem, co to jest twoja druga gałąź, ale to, co opisuję, jest zasadniczo powszechnym przepływem pracy polegającym na okresowym łączeniu oddziałów konserwacji i tematów z powrotem do systemu głównego, jak również wszelkich innych odpowiednich zmodyfikowanych wersji lub gałęzi obsługi.

Zdecydowanie zalecam przyjęcie przepływu pracy, gdzie odbywa się to przez scalenie, jak opisano powyżej, ale aby odpowiedzieć na zadane pytanie, jeśli absolutnie musisz pracować nad wzorcem i wyborem typu "wiśnia", możesz napisać mały scenariusz, coś w stylu:

#!/bin/bash 
# take two arguments: 
# 1. other branch to put commits on 
# 2. number of commits to cherry-pick from master  

if ! git checkout $1; then 
    exit 
fi 
git rev-list --reverse -n $2 master | 
while read commit; do 
    if ! git cherry-pick $commit; then 
     exit 
    fi 
done 

Oczywiście istnieją sposoby na zwiększenie odporności skryptu, np. dodawanie zdolności do wznawiania po wiśniowych wyborach, których łatki nie mają zastosowania poprawnie, ale to jest początek.

Oczywiście możesz sobie poradzić z tym, jak używasz git-rev-list do wyboru zatwierdzeń. Możesz nawet przekazać wszystkie oprócz pierwszego argumentu na listę git-rev, abyś mógł wykonać cherries-pick <branch> -n 5 master lub cherries-pick <branch> release_tag..master lub cokolwiek chcesz. Spójrz na jego man page!

Można również użyć git-rebase jak sugerowano w innym miejscu, ale dlatego, że w rzeczywistości nie chce się przenieść pana, będziesz w końcu robi coś takiego:

git branch master-copy master 
git rebase --onto <branch> master~5 master 
git checkout <branch> 
git merge master-copy 
git branch -d master-copy 
+0

Bardzo imponujące, dziękuję! –

0

Jeśli chcesz po prostu zaktualizować swój oddział z pana, zrobić:

git checkout branch; git merge master 
git rebase origin 

Jeśli nie chcesz ciągnąć wszystko od pana, można selektywnie diff rewizje (boo) lub wykorzystać gałęzie do indywidualnych cech - wtedy możesz po prostu scalić gałąź funkcji w master i twoją drugą gałąź.

+0

po prostu chcesz n zatwierdza się od head in master, aby się połączyć, a nie inne zatwierdzenia, które różnią się między gałęzią a wzorcem. –

+1

git rebase -i origin; otwiera edytor tekstu z jednym commitem w jednym wierszu, musisz usunąć linie z zatwierdzeniami, których nie chcesz –

1

git cherry-pick commit1..commitn

Powiązane problemy