2009-09-17 14 views
34

Mam więc oddział konserwacyjny i oddział główny w moim projekcie. Jeśli robię popełnić w branży konserwacji i scalić ją do przodu do gałęzi głównej, który jest łatwy:Jak mogę dokonać backportowania commit w git?

git checkout master; git merge maintenance 

Ale jeśli chcesz iść w drugą stronę, czyli zastosowanie commit się opanować z powrotem do moja gałąź utrzymania ruchu, jak to zrobić? Czy to jest uważane za zbiórkę wiśni? Czy spowoduje to problemy lub konflikty, jeśli ponownie połączę dział utrzymania?

Odpowiedz

30

To jest właśnie przypadek użycia dla git-cherry-pick

git checkout maintenance 
git cherry-pick <commit from master> 
+0

Uszkodzony link. Czy masz nowe referencje? Dziękujemy – glarrain

+1

Pomyślnie wyszukałem ten link 16 czerwca 2012. – mwalling

+0

Świetnie, wróciłem. Może to było tylko tymczasowe. Dzięki @mwalling – glarrain

0

Tak, to jest uważany wiśnia komisjonowania i nie, ogólnie nie powinna wprowadzać problemy. Jeśli zatwierdzenie nie zostanie zastosowane bezbłędnie, gdy zostanie przeniesiony, możesz napotkać dokładnie ten sam konflikt, gdy wybierzesz go z powrotem.

0

Zgodnie z ogólną zasadą używam scalania, aby przenosić zmiany "w górę" drzewa (z konserwacji do mistrza) i rebase, aby przenieść je "w dół" drzewa (od wzorca do konserwacji). Jest tak, że utrzymywana jest kolejność zatwierdzeń w gałęzi głównej.

Rebase zasadniczo wycofuje wszystkie zmiany w bieżącej gałęzi do widelca (lub ostatniego rebase), kopiuje na nowsze zmiany, a następnie ponownie stosuje zmiany.

Jeśli nie chcesz uzyskać wszystkich zmian od mistrza, prawdopodobnie będziesz musiał wybrać te, które chcesz.

+2

Zastanawiam się również nad * rebase *.Ale domniemanie, że gałąź_przedsiębiorstwa_ istnieje specjalnie po to, aby _nie mieć wszystkich obecnych zmian, to nie jest to, czego chcesz. Najlepiej mi jest ponownie utworzyć gałąź rozwojową, ale wybierz poprawkę usuniętą z master (lub dowolnej gałęzi rozwojowej) z powrotem do konserwacji. –

11

rozwiązanie alternatywne do stosowania „git cherry-pick” (zgodnie z zaleceniami zawartymi w innych wskazań) byłoby utworzyć oddzielną [temat] oddziału do poprawki wyłączania gałęzi utrzymywania i łączenia tego z pierwszym ramieniem w branży konserwacji, a następnie do master branch (trunk).

Ten przepływ pracy jest (nieco) opisany w Resolving conflicts/dependencies between topic branches early blogu autorstwa Junio ​​C Hamano, git maintainer.

Zbiór wiórów skutkuje zduplikowanym zatwierdzeniem, co może być przyczyną problemów podczas łączenia lub ponownego tworzenia. Topologia przepływu w oddziale działa tylko z jedną kopią poprawki.

+0

Podoba mi się sposób, w jaki połączony post wyjaśnia dodanie wielu potwierdzeń, które mogą być w konflikcie. Połącz funkcję A z naprawionym błędem B, przed połączeniem któregokolwiek z nich w gałąź Master lub Maintenance. W ten sposób możesz upewnić się, że konflikty między A i B zostaną rozwiązane, tak więc jeśli najpierw pobierzesz A lub B, możesz później łatwo połączyć A + B i wiedzieć, że jest ono wstępnie połączone. Zobacz [diagram 3 w połączonym dokumencie] (http://gitster.livejournal.com/27297.html). –

0

Tak jak inni już stwierdzili, wybór wiśni jest prawdopodobnie najlepszą opcją. Chciałem tylko dodać, że konflikty podczas wybierania można często rozwiązać przez zbadanie "zależności" zatwierdzenia, które wybrałeś, i że zbudowałem a tool called git-deps w celu wykrycia i wizualizacji tych zależności. Jeśli wejdziesz na stronę główną, zobaczysz dwa filmy z YouTube: pierwszy przedstawia ogólne wprowadzenie do narzędzia, a drugi pokazuje, jak można go użyć, aby uniknąć konfliktów podczas wybierania wiśni.