Podsumowanie
Komunikat o błędzie
Nie można „zgnieść” bez wcześniejszego zatwierdzenia
oznacza, że prawdopodobnie próbowałeś „zgnieść się w dół”. Git zawsze zgniata nowsze zatwierdzenie do starszego zatwierdzenia lub „w górę”, jak pokazano na interaktywnej liście zadań bazy danych, czyli do zatwierdzenia w poprzedniej linii. Zmiana polecenia w pierwszym wierszu listy zadań do wykonania squash
spowoduje zawsze wystąpienie tego błędu, ponieważ nie ma nic, w co mógłby się zgnieść pierwszy zatwierdzenie.
Poprawka
Najpierw wróć do miejsca, w którym zacząłeś
$ git rebase --abort
Powiedz, że twoja historia to
$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a
To znaczy, a był pierwszym zatwierdzeniem, następnie b, a na końcu c. Po popełnieniu c decydujemy się zgnieść razem bic:
(Uwaga: Uruchomienie git log
potokuje wyjście do pagera, less
domyślnie na większości platform. Aby wyjść z pagera i powrócić do wiersza poleceń, naciśnij q
klawisz.)
Uruchamianie git rebase --interactive HEAD~2
daje edytor z
pick b76d157 b
pick a931ac7 c
# Rebase df23917..a931ac7 onto df23917
#
# 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
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
(Zauważ, że ta lista rzeczy do zrobienia jest w odwrotnej kolejności w porównaniu do wyniku git log
.)
Zmiana b na pick
na squash
spowoduje błąd, który zobaczyłeś, ale jeśli zamiast tego zgniatasz c do b (nowsze zatwierdzają do starszego lub „squashing up”), zmieniając listę zadań do
pick b76d157 b
squash a931ac7 c
i po wyjściu z edytora, otrzymasz innego edytora, którego zawartość jest
# This is a combination of 2 commits.
# The first commit's message is:
b
# This is the 2nd commit message:
c
Po zapisaniu i zamknięciu zawartość edytowanego pliku staje się komunikatem zatwierdzenia nowego połączonego zatwierdzenia:
$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a
Uwaga na temat przepisywania historii
Interaktywny rebase przepisuje historię. Próba przekazania do pilota zawierającego starą historię nie powiedzie się, ponieważ nie jest to przewijanie do przodu.
Jeśli gałąź, którą zmieniłeś, to temat lub gałąź funkcji, w której pracujesz sam , nic wielkiego. Przekazywanie do innego repozytorium będzie wymagało --force
opcji, lub alternatywnie możesz, w zależności od uprawnień zdalnego repozytorium, najpierw usunąć starą gałąź, a następnie wypchnąć wersję ponownie. Przykłady tych poleceń, które potencjalnie zniszczą pracę, są poza zakresem tej odpowiedzi.
Przepisywanie już opublikowanej historii w oddziale, w którym pracujesz z innymi ludźmi bez bardzo dobrych powodów, takich jak wyciekanie hasła lub innych poufnych szczegółów, wymusza pracę na twoich współpracownikach i jest aspołeczne i będzie drażnić innych programistów. Sekcja „Odzyskiwanie z wcześniejszego uruchomienia” w git rebase
dokumentacji wyjaśnia, z dodatkowym naciskiem.
Odbudowywanie (lub jakiejkolwiek innej formy przepisywania) gałęzi, na której inni pracują, jest złym pomysłem: każdy, kto jest za nią zmuszony, musi ręcznie naprawić swoją historię. W tej sekcji wyjaśniono, jak wykonać poprawkę z punktu widzenia dalszego użytkownika. Prawdziwym rozwiązaniem byłoby jednak przede wszystkim uniknięcie ponownego upstreamu. …