Zmień gałąź funkcji na inną gałąź funkcji


304

Mam dwie (prywatne) gałęzie funkcji, nad którymi pracuję.

a -- b -- c                  <-- Master
     \     \
      \     d -- e           <-- Branch1
       \
        f -- g               <-- Branch2

Po krótkiej pracy nad tymi gałęziami odkryłem, że potrzebuję zmian z Branch2 w Branch1. Chciałbym wprowadzić zmiany w gałęzi 2 do gałęzi 1. Chciałbym skończyć z następującymi:

a -- b -- c                  <-- Master
           \
            d -- e -- f -- g <-- Branch1

Jestem prawie pewien, że muszę przestawić drugą gałąź na pierwszą, ale nie jestem całkowicie pewien poprawnej składni i której gałęzi powinienem był sprawdzić.

Czy to polecenie da pożądany wynik?

(Branch1)$ git rebase --onto Branch1 Branch2

11
Aby odpowiedzieć na twoje pytanie, utworzyłbym repozytorium testowe, stworzyłem pokazaną strukturę zatwierdzeń i wypróbowałem pokazane polecenie. Ale myślę, że możesz to zrobić sam, więc nie zamierzam tego robić :)
Daniel Hilgarth,

3
Dzięki. Tak bardzo chciałem to zrobić za pierwszym razem, że nie przyszło mi do głowy, że sam mogłem to łatwo przetestować :-)
Arjen

4
Tak myślałem, dlatego opublikowałem ten komentarz :) Za każdym razem, gdy coś robię, nie jestem pewien, czy zrobi to, co myślę, że robię, tworzę repozytorium testów i tam przeprowadzam testy. Lub tworzę kopię mojego prawdziwego repozytorium i przeprowadzam testy na kopii.
Daniel Hilgarth

Uwaga: Git 2.0 wprowadzi skrót dla tego rodzaju rebase: git rebase -. patrz moja odpowiedź poniżej
VonC

5
Drobna uwaga: w odpowiedzi tutaj podano gałąź2 jako wynik. PO chciał gałąź 1. A może coś przeoczyłem?
Josef.B

Odpowiedzi:


352
  1. Przełącz na Oddział 2

    git checkout Branch2
    
  2. Zastosuj bieżące zmiany (Oddział 2) nad zmianami Oddział 1, pozostając w Oddział 2:

    git rebase Branch1
    

Co dałoby Ci pożądany wynik w Branch2:

a -- b -- c                      <-- Master
           \
            d -- e               <-- Branch1
           \
            d -- e -- f' -- g'   <-- Branch2

Możesz usunąć Oddział 1.


Dzięki! Podczas usuwania gałęzi po ponownym uruchomieniu otrzymuję komunikat, że gałąź nie jest w pełni scalona. Zakładam, że mogę bezpiecznie zignorować tę wiadomość i wymusić usunięcie?
Arjen

10
czy nie chciał mieć wszystkich zmian w Oddziale 1?
tomasz_kusmierczyk

6
To wydaje się przeciwieństwem tego, czego chciał, nie?
1252748,

1
Rzeczywiście, @tomasz_kusmierczyk i @ 1252748, i ja też się zdezorientowałem. Ale potem zdałem sobie sprawę, że występowanie git rebasepodczas pozostawania w Oddziale 1 spowoduje przepisanie historii Oddziału 1, aby zmiany w Oddziale 1 zostały zastąpione zmianami skopiowanymi z Oddziału 2. Który spowoduje w dalszej popełnić zamówienie a - b - f - g - c' - d' - e'.
węgorz ghEEz

1
@tomasz_kusmierczyk i 1252748, to nie jest przeciwieństwo tego, czego chce, to jest dokładnie to, czego chciał. Nazwy oddziałów nie mają znaczenia, zawsze możesz je zmienić.
a3y3

56

Uwaga: jeśli byłeś włączony Branch1, w Git 2.0 (Q2 2014) będziesz mógł pisać:

git checkout Branch2
git rebase -

Zobacz zatwierdzenie 4f40740 przez Briana Gesiakamodocache :

rebase: -„short short hand” dla poprzedniej gałęzi

Naucz rebase tak samo jak checkouti mergenazwij gałąź do rebasebieżącej gałęzi; oznacza to, że „ -” oznacza „gałąź, w której byliśmy poprzednio”.


26
miło, ale też trochę niebezpiecznie. czasami wygrywa gadatliwość. ale z drugiej strony lubię też Javę ... (-:
sthzg

3

Wiem, że poprosiłeś o Rebase, ale wybrałbym zobowiązania, które chciałem przenieść z gałęzi 2 do gałęzi 1. W ten sposób nie musiałbym się martwić, kiedy gałąź została utworzona z master, i miałbym większą kontrolę nad łączeniem.

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.