Obecnie pracuję nad gałęzią i chcę, aby niektóre zmiany zostały połączone w inne gałęzie:
a-b-c-d-e-f-g (branchA)
/
--o-x-x-x-x-x-x-x-x-x-x (master)
\
x-x-x-x-x (branchB)
(Litery oznaczają zatwierdzenia, a „x” to nieistotne zatwierdzenia).
Jednak zauważyłem, że dobrym pomysłem byłoby zebranie kilku zatwierdzeń. Chcę „połączyć” zatwierdzenie a, d, e i g w jednej łatce i zatwierdzić ją jako master. Zatwierdzenia b i f powinny przejść jako jedno zatwierdzenie do gałęziB. Czy jest dobry sposób na osiągnięcie tego celu?
Odpowiedzi:
Polecenie, którego szukasz, jest
git rebase
konkretną-i/--interactive
opcją.Zakładam, że chcesz zostawić zatwierdzenie c w gałęzi A i że naprawdę masz na myśli, że chcesz przenieść pozostałe zatwierdzenia do innych gałęzi, zamiast scalać, ponieważ scalenia są proste. Zacznijmy od manipulowania gałęzią A.
Te
^
środki poprzedni popełnienia, więc to polecenie mówi zmieniają bazę oddział używając popełnić przed „a” jako podstawy. Git przedstawi listę zatwierdzeń z tego zakresu. Zmień ich kolejność i powiedz gitowi, aby zgasił odpowiednie:Teraz historia powinna wyglądać tak:
Teraz weźmy nowo zgniecione zatwierdzenie b + f dla branchB.
I to samo dla a + d + e + g dla mistrza:
Na koniec zaktualizuj gałąźA, aby wskazywała na c:
Powinniśmy teraz mieć:
Zauważ, że jeśli masz wiele zatwierdzeń, które chcesz przenosić między gałęziami, możesz ponownie użyć rebase (nieinteraktywnie):
Na koniec zastrzeżenie: całkiem możliwe jest zmienić kolejność zatwierdzeń w taki sposób, że niektóre nie mają już czystego zastosowania. Może to być spowodowane tym, że wybrałeś złą kolejność (umieszczając łatkę przed zatwierdzeniem wprowadzającą poprawioną funkcję); w takim przypadku będziesz chciał przerwać rebase (
git rebase --abort
). W przeciwnym razie będziesz musiał inteligentnie rozwiązać konflikty (tak jak w przypadku konfliktów scalania), dodać poprawki, a następnie biec,git rebase --continue
aby przejść dalej. Instrukcje te są również zawarte w komunikacie o błędzie wyświetlanym w przypadku wystąpienia konfliktu.źródło
git branch -f branchA branchA^^
złym? Mianowicie, czy gałąźA nie powinna wskazywać c w tym miejscu, tak aby pierwsza linia diagramu była,c (branchA)
a niec - [a+d+e+g] - [b+f] (branchA)
?git branch -f branchA branchA^^
dlaczego nie możesz po prostu zrobićgit reset --hard <sha1 of c>
na gałęzi A?Gdzie
3
jest liczba zatwierdzeń, które wymagają zmiany kolejności ( źródło ).Otworzy się vi , wypisując zmiany od najstarszych (na górze) do najnowszych (na dole).
Teraz zmień kolejność linii, zapisz i wyjdź z edytora.
ddp
przeniesie bieżącą linię w dółddkP
przeniesie bieżącą linię w górę ( źródło )źródło
git rebase --interactive
to polecenie, którego chcesz.Przykład:
Obecny stan jest następujący:
Chcę zmienić kolejność zatwierdzeń
9a24b81
(trzecie zatwierdzenie) i7bdfb68
(drugie zatwierdzenie). Aby to zrobić, najpierw znajduję zatwierdzenie przed pierwszym zatwierdzeniem, które chcemy zmienić . To jest zatwierdzenie186d1e0
(pierwsze zatwierdzenie).Polecenie do wykonania to
git rebase --interactive COMMIT-BEFORE-FIRST-COMMIT-WE-WANT-TO-CHANGE
w tym przypadku:Spowoduje to otwarcie pliku w domyślnym edytorze o następującej zawartości:
Zauważ, że kolejność zatwierdzeń w pliku jest odwrotna do tej używanej w git log. W dzienniku git najnowsze zatwierdzenie znajduje się na górze. W tym pliku najnowsze zatwierdzenie znajduje się na dole.
Jak wyjaśnia komentarz na dole pliku, mogę robić różne rzeczy, na przykład zgniatać, upuszczać i zmieniać kolejność zatwierdzeń. Aby zmienić kolejność zatwierdzeń, edytuję plik tak, aby wyglądał tak (dolne komentarze nie są wyświetlane):
pick
Polecenia na początku każdego „użytkowania (tj obejmuje) to commit” oznacza liniowe i kiedy zapisać plik temp z poleceniami rebase i wyjść z edytora, git wykona polecenia i aktualizacji repozytorium i katalog roboczy:Zwróć uwagę na przepisaną historię zatwierdzeń.
Spinki do mankietów:
źródło
git rebase --interactive
aby osiągnąć cel PO?Jeśli chcesz zmienić kolejność tylko dwóch ostatnich zatwierdzeń , możesz użyć tego
git reorder
aliasu: https://stackoverflow.com/a/33388211/338581źródło
git rebase jest tym, czego chcesz. Sprawdź opcję --interactive.
źródło