2010-09-14 19 views
30

Jestem pewien, że jest to prosta rzecz, która została zadana i odebrana, ale nie wiem, jakich terminów szukać. Mam to:Jak przenieść commit pomiędzy gałęziami w Git?

/--master--X--Y 
A--B 
    \--C--D--E 

Gdzie popełnił C, D i E (tylko lokalnie) na gałęzi, ale potem zdałem sobie sprawę, że D i E są naprawdę niezależne od C Chcę przenieść C do własnych gałąź i trzymajcie D i E na później. Oznacza to, że chcę to:

    /--C 
    /--master--X--Y 
A--B 
    \--D--E 

Jak mogę szarpać C spod D i E?

Odpowiedz

42

Można użyć git cherry-pick chwycić C, i umieścić go na Y. Zakładając Y istnieje jako końcówki oddział o nazwie branch-Y:

$ git checkout branch-Y 
$ git cherry-pick C 

Więc teraz C jest na górze Y. Ale także D i E nadal zawierają C (cherry picking nie przesuwa commit, po prostu tworzy jego kopię). Musisz rebase D i E na górze B. Zakładając E jest wierzchołek branch-E i B jest branch-B można:

$ git checkout branch-E 
$ git rebase --interactive branch-B 

Spowoduje to otwarcie interaktywną sesję rebase. Po prostu usuń całkowicie commit C i pozostaw nienaruszone D i E. Wtedy będziesz miał D i E ponownie na górze B bez C.

+4

Zauważ, że 'cherry-pick', od wersji 1.7.1, może wybrać wiele zatwierdzeń, więc możesz użyć tego do" szarpania "więcej niż jedno zatwierdzenie. Możesz to również zrobić, tworząc tymczasową gałąź w E i interaktywnie zmieniając ją na Y, zachowując tylko zatwierdzenia, które chcesz, a następnie łącząc je (to będzie szybkie przewijanie do przodu) do gałęzi Y. (To zawsze działało i może być łatwiejsze, więc nie musisz wklejać tylu SHA1). – Cascabel