2016-01-21 27 views
15

Mam dwie gałęzie (i master). Oddział 2 opiera się na Oddziale 1 na podstawie wzorca. Zgłosiłem Branch 1 do przeglądu, wprowadzono pewne zmiany, przerzuciłem niektóre z tych zmian do historii i połączyłem wynik w master.Rebase tylko część gałęzi

Teraz muszę przetasować gałąź 2 na master, aby przygotować ją do przeglądu/scalenia.

Problem polega na tym, że Oddział 2 wciąż zawiera oryginalne zatwierdzenia oddziału 1, które już nie istnieją, więc git zostaje zdezorientowany. Próbowałem rebase -i, aby opuścić oryginalne zatwierdzenia oddziału 1, ale zatwierdzenia oddziału 2 nie opierają się na master-before-branch-1.

Co muszę zrobić, to wziąć gałąź 2, upuścić kilka zatwierdzeń i ponownie ustawić tylko pozostałe zatwierdzenia na szczycie wzorca w jednej operacji. Ale wiem tylko, jak wykonać te dwie operacje w dwóch różnych krokach.

Jak mogę zmienić część mojej gałęzi na inną gałąź, usuwając wszystkie zatwierdzenia, które nie mają wspólnych przodków, z wyjątkiem tych, które określam (na przykład z HEAD ~ 2)?

Oto aktualny stan:

master      new branch 1 
- - - - - - - - - - - | - - - - - - - - - 
    \ 
    \ branch 1 
     \ _ _ _ _ _ _ _ 
        \ 
         \  branch 2 
         \ _ _ _ _ _ _ _ 

Co chcę skończyć z:

master   new branch 1  
- - - - - - - | - - - - - - - - - - 
            \ 
            \ 
            \ 
             \ branch 2 
             - - - - - - - - - 
+4

Pomocny byłby wykres ASCII przedstawiający stan repozytorium. Na pierwszy rzut oka powiedziałbym, że szukasz ['git rebase --onto'] (https://git-scm.com/docs/git-rebase). Sprawdź, czy to pomaga: http://stackoverflow.com/questions/28715619/how-can-i-rebase-part-of-a-branch-to-the-master-branch/28715930#28715930 – Jubobs

+0

Lepiej! Zobacz także http://stackoverflow.com/questions/25488138/move-initial-commits-off-master-to-another-branch-in-git/25490288#25490288 – Jubobs

+0

git rebase - prawie dla mnie pracował . Zrobiłem 'git rebase --onto master --root HEAD ~ 1', ale z jakiegoś powodu wybrało trzy commity, które przyniosą ze mną zamiast tylko' HEAD ~ 1' i wyżej. Co więcej, zamiast przekierowywać moją gałąź, jestem teraz w oddzielnym stanie HEAD. – Puppy

Odpowiedz

11

Rozwiązaniem jest znacznie prostsze niż się spodziewałem. Okazuje się, że możesz dostarczyć -i do znacznie większej różnorodności poleceń rebase (myślałem, że to tylko zmiana nazwy gałęzi na zmianę historii). Więc po prostu uruchomiłem git rebase -i master i zrzuciłem te dodatkowe zatwierdzenia.

+0

Aby wyjaśnić, co zrobiła aplikacja @Puppy, wykonaj interaktywny rebase z oddziału 2 na nowy oddział 1 ('git rebase -i new_branch_1' podczas korzystania z oddziału 2) i usuń wszystkie gałęzie 1 popełnia się przy użyciu konsoli interaktywnej, tak że zostały rozgrywane tylko zatwierdzenia oddziału 2 . – theannouncer

19

Rzeczywista komenda będzie:

git rebase --onto newbranch1 branch1 branch2 

To będzie odtworzyć na szczycie new_branch1 wszystkich zobowiązuje pobranch1 do branch2 głową.

+0

Na pewno (miał zamiar opublikować to samo). Nawiasem mówiąc, "git help rebase" obejmuje tę sprawę. –

+0

@TomFenech nawet lepiej niż 'git help rebase': http://stackoverflow.com/a/2369516/6309 (moja stara odpowiedź z 2010);) – VonC

Powiązane problemy