Możesz biegać git rebase --interactive
i zmieniać kolejność D przed B i wciskać D w A.
Git otworzy edytor i zobaczysz taki plik, np .: git rebase --interactive HEAD~4
pick aaaaaaa Commit A
pick bbbbbbb Commit B
pick ccccccc Commit C
pick ddddddd Commit D
# Rebase aaaaaaa..ddddddd onto 1234567 (4 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
Teraz zmienisz plik, który wygląda następująco:
pick aaaaaaa Commit A
squash ddddddd Commit D
pick bbbbbbb Commit B
pick ccccccc Commit C
A git będzie teraz łączyć zmiany A i D razem w jeden zatwierdzenie, a następnie wstawi B i C. Gdy nie chcesz zachować komunikatu zatwierdzenia D, zamiast tego squash
użyjesz fixup
słowa kluczowego. Aby uzyskać więcej informacji fixup
, możesz zapoznać się z git rebase
dokumentami lub sprawdzić to pytanie, które ma kilka dobrych odpowiedzi.
There is no tracking information for the current branch
podczas ponownego naliczania pojawi się błąd. W tym przypadku trzeba określić liczbę zatwierdzeń chcesz pracować, tak:git rebase -i HEAD~4
. Zobacz tę odpowiedź .Uwaga: Nie powinieneś w żaden sposób zmieniać zatwierdzeń, które zostały przekazane do innego repo, chyba że znasz konsekwencje .
git log --oneline -4
git rebase --interactive
Wpisz
i
(Przełącz VIM w tryb wstawiania)Zmień listę, aby wyglądała następująco (nie musisz usuwać ani dołączać komunikatu zatwierdzenia). Nie literuj źle
squash
! :EscNastępnie wpisz
ZZ
(Zapisz i zamknij VIM)Rodzaj
i
Zmień tekst na wygląd nowej wiadomości zatwierdzenia. Polecam, aby był to opis zmian w zatwierdzeniu
A
iD
:Wpisz Escwięc
ZZ
git log --oneline -4
git show E
Utworzyłeś nowy zatwierdzenie
E
. ZobowiązaniaA
iD
nie są już w twojej historii, ale ich nie ma. Nadal możesz je odzyskać w tym momencie i przez chwilęgit rebase --hard D
(git rebase --hard
zniszczy wszelkie lokalne zmiany! ).źródło
Dla osób korzystających z SourceTree :
Upewnij się, że nie przeforsowałeś jeszcze zatwierdzeń.
Squash with previous
źródło
Interaktywny rebase działa dobrze, dopóki nie będziesz mieć dużego oddziału funkcji z 20-30 zatwierdzeniami i / lub kilkoma połączeniami z master lub / i naprawiającymi konflikty podczas zatwierdzania w oddziale. Nawet ze znalezieniem moje zobowiązuje przez historię i zastąpienie
pick
zesquash
nie działało tutaj. Więc szukałem innego sposobu i znalazłem ten artykuł . Wprowadziłem zmiany, aby pracować z tym w osobnym oddziale:Wcześniej otrzymałem moją prośbę o ściągnięcie z około ~ 30 zatwierdzeniami z 2-3 połączeniami z master + konflikty naprawcze. A potem uzyskałem wyraźny PR z jednym zatwierdzeniem.
PS tutaj jest skrypt bash do wykonywania tych kroków w trybie automatycznym.
źródło
$ git Checkout master
$ git log --oneline
$ git rebase --onto HEAD ^^^ HEAD ^
$ git log --oneline
źródło
--oneline
? I wygląda na to, że upuściłeśC
iB
, czego nie zamierzał OP.git show A
), a D, C i B zostały utracone w moim dzienniku ref. Musiałemgit rebase D
wrócić.