2013-06-18 12 views
6

Przypadkowo rozpocząłem pracę nad nową funkcją w środku innej. Moje repozytorium po prostu wygląda tak:Przenieś stare zatwierdzenie do nowego oddziału

A - B - C - D - E master 

Ale mam nadzieję, aby wyglądać tak:

A - B - D - E  master 
     \ 
     C   new-feature 

Wygląda na to proste pytanie, ale jeszcze nie znalazłem odpowiedzi na to przez wyszukiwanie. Wygląda na to, że wybieranie wiśni jest bliskie temu, co chcę, a także może jakieś odrodzenie, ale jestem nowy w Git i pomoc jest doceniana.

Odpowiedz

4

pierwsze, aby nowy oddział:

git branch new-feature C 

Dalej, aby naprawić Mistrza

git checkout master 
git rebase -i B 

Kiedy redaktor podchodzi, usuwania C z listy. Zapisz i wyjdź.

+0

Dziękuję bardzo! Szukałem takiego wyjaśnienia. – bbill

+0

Po przebiciu, 'git push' odmówi przekazania masterów z powodu konfliktów z pilotem. Użyłem 'git push origin + master', aby to uzyskać, ale nie jestem pewien, czy jest to właściwy wybór. – Guss

2

Będę tu używał dość niebezpiecznych operacji, więc po prostu zapamiętaj.

Ta odpowiedź sprawia, że ​​kilka założeń:

  1. Twój ostateczny master gałąź powinna wyglądać następująco: A - B - D - E

  2. Twój ostateczny new-feature gałąź powinna wyglądać następująco: A - B - C

  3. Nieobecność zatwierdzenia C nie wpłynie na stosowanie zatwierdzeń D i E na górze zobowiązania B.

Jeśli tak nie jest, należy zaktualizować tutaj.

Najpierw, w gałęzi master, tworzymy nową gałąź jako kopię zapasową. Nazwijmy to po prostu "kopią zapasową".

git branch backup 

Ma to na celu umożliwienie nam łatwego przywrócenia głównej gałęzi, na wypadek gdyby coś poszło nie tak później. Oczywiście możemy użyć git reflog, ale jest to o wiele wygodniejsze.

Następnie na gałęzi master zrobić:

git rebase -i HEAD~3 

ten powinien odpalić edytor tekstu dla git rebase (tryb interaktywny). Znajdź linię zatwierdzenia C i usuń ją.

Teraz twój mistrz gałąź powinna wyglądać następująco:

A - B - D' - E'

nie martw się o mnie pisanie A - B - D' - E' zamiast A - B - D - E. D i D' są zasadniczo równoważne pod względem zestawów zmian.To samo dotyczy E i E'.

Docieramy tam. Zakładam, że commit C na gałęzi new-feature ma być rozgałęziony od zatwierdzenia B. Znajdź popełnienia SHA1 do popełnienia B, następnie (pominąć kątowniki poniżej):

git checkout -b new-feature <SHA1 of commit B>

To utworzy oddział zwany new-feature że rozpoczyna się popełnić B i sprawdza go dla Ciebie. Teraz jesteśmy na new-feature gałęzi i wygląda to tak:

A - B

Ostatnim krokiem jest, aby dowiedzieć się SHA1 commit popełnić C. Mamy go w gałęzi backup. Przy użyciu metody git log backup (lub innej metody) znajdź zatwierdzenie SHA1 zatwierdzenia C w gałęzi kopii zapasowej. Po tym, na new-feature gałęzi, zrobić:

git cherry-pick <SHA1 of commit C>

Oczywiście, proszę pominąć kątowników.

Teraz new-feature gałąź powinna wyglądać następująco:

A - B - C'

+0

Element macierzysty 'C' jest już' B'. Jeśli tworzysz tę gałąź przed zmianą, nie musisz wykonywać żadnych ćwiczeń gimnastycznych. –

+0

Tak, masz rację, twoja odpowiedź jest znacznie lepsza – yanhan

+0

Wow, doceń kod dogłębny. Myślę, że to pomaga zrozumieć, jeśli nie w praktyce. – bbill

1

Załóżmy, że obecnie na oddziale master

  1. git branch new-feature master~2 Teraz oddział new-feature jest tworzony i wskazuje na C popełnić. (Ty nadal pracuje na oddziale master po jego zakończeniu)
  2. git rebase --onto master~3 master~2 Ten przeszczepów wszystkie rewizje z master~2 szefa master na popełnić B (tj master~3).

OK, gotowe!

Aby uzyskać szczegółowe informacje, należy zawsze używać git help <cmd>.

+0

Dzięki, Frank. Ja też chciałem się pozbyć zatwierdzenia. – bbill

+1

Oczywiście C jest _deleted_ z oddziału 'master' (C jest teraz dostępne tylko z oddziału' new-feature'). 'Git rebase --onto' to najlepszy sposób na twój problem, do mojego zrozumienia. –

+0

Ok. Dzięki, nie zdawałem sobie z tego sprawy. – bbill

Powiązane problemy