Jeśli szczegółowo omówimy Twój problem, musisz:
- Podziel 4 (E, F, G, H) z Foo na 2 gałęzie, Foo będzie miał tylko: E, G, ale Bar będzie miał wszystkie 4, E -> G -> F -> H.
- Usuń niektóre zatwierdzenia: np. w Foo usuń zatwierdzenia F i H.
- Nie jestem pewien, czy chcesz „zmienić kolejność” zatwierdzeń na pasku gałęzi, tj. mieć E, G, F, H -> Zakładam, że to nie rozwiązuje żadnego celu, więc pominę to w mojej odpowiedzi.
Można to zrobić na wiele sposobów, ale ograniczę się do najprostszego schematu, jaki przychodzi mi na myśl, ponieważ nie masz doświadczenia z gitem. spójrzmy więc na podział gałęzi:
Z twojego obecnego Foo (head = H) wykonaj git checkout -b Bar
To utworzy pasek gałęzi z zatwierdzeniami E, F, G, H
Istnieją dwa sposoby resetowania gałęzi Foo:
#1 Odrzuć Foo i utwórz ją ponownie git branch -D Foo
(aby usunąć z lokalnego) git push origin :Foo
(aby usunąć ze zdalnego, jeśli już to zrobiłeś) pchnął to)
Następnie musisz utworzyć nowe Foo z zatwierdzenia „C” swojego mistrza:
git checkout -b Foo <CommitIdShaForC>
Następnie możesz wybierać zatwierdzenia E i G albo z git gui, wykonując gitk Bar
, a następnie klikając prawym przyciskiem myszy zatwierdzenie i wybierając opcję wiśniowego wyboru, albo z konsoli:
git cherry-pick <Commit Id for E> <Commit Id for G>
W przypadku problemów z łączeniem spójrz na tę odpowiedź
#2 Cofnij zatwierdzenia z Foo Jeśli nie masz nic przeciwko posiadaniu historii F i H w swoim foo, możesz po prostu przywrócić je w git, zasadniczo git tworzy odwrotną łatkę twoich zatwierdzeń F i H oraz stosuje je jako nowe zatwierdzenia:
- Jesteś na oddziale
Foo
i ma on E -> F -> G -> H
git revert F
- Twoja gałąź powinna teraz pokazywać
E -> F -> G -> H -> F'
, gdzie F' cofa to, co dodał zatwierdzenie F
git revert H
doprowadziłoby do: E -> F -> G -> H -> F' -> H'
którego końcowy wynik w kodzie źródłowym byłby taki sam jak w przypadku zatwierdzenia tylko E i G.
Alternatywnie możesz użyć flagi --no-commit na git revert, aby przywrócić zarówno F, jak i H w 1 zatwierdzeniu:
git revert --no-commit F
git revert --no-commit H
git commit -a -m "reverting commits F and H"
Prowadziłoby to do:
E -> F -> G -> H -> I
gdzie I jest zatwierdzeniem, które cofa F i H
#Aktualizacja 1 Po napisaniu długiej odpowiedzi widzę, że OP chce mieć „część zatwierdzeń” w kilku gałęziach. W tym przypadku gorąco polecam interaktywną bazę danych, aby można było dzielić zatwierdzenia. Proszę zapoznać się z oficjalną dokumentacją na temat git rebase, w szczególności z sekcją dotyczącą „ Dzielenie zatwierdzeń”. Myślę też, że to pytanie będzie dla Ciebie szczególnie pomocne
person
dubes
schedule
23.05.2016
Foo
, a GH przeniósł się doBar
? - person choroba   schedule 23.05.2016git --cherry-pick
- person Vishwanath   schedule 23.05.2016git checkout Foo;git reset E --hard;git cherry-pick G;git checkout -b Bar Foo;git cherry-pick F;git cherry pick H
Foo to ABCEG', Bar to ABCEG'F'H'. - person ElpieKay   schedule 23.05.2016