Próbuję scalić 2 zatwierdzenia w 1, więc podążyłem za „zgniataniem zatwierdzeń z rebase” z git ready .
Pobiegłem
git rebase --interactive HEAD~2
W powstałym edytorze zmieniam pick
na, squash
a następnie zapisz-wyjdź, ale zmiana bazy kończy się niepowodzeniem z błędem
Nie można „zgnieść” bez wcześniejszego zatwierdzenia
Teraz, gdy moje drzewo pracy osiągnęło ten stan, mam problem z odzyskaniem.
Polecenie git rebase --interactive HEAD~2
kończy się niepowodzeniem:
Interaktywny rebase już się rozpoczął
i git rebase --continue
kończy się niepowodzeniem
Nie można „zgnieść” bez wcześniejszego zatwierdzenia
Odpowiedzi:
Podsumowanie
Komunikat o błędzie
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ś
Powiedz, że twoja historia to
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śnijq
klawisz.)Uruchamianie
git rebase --interactive HEAD~2
daje edytor z(Zauważ, że ta lista rzeczy do zrobienia jest w odwrotnej kolejności w porównaniu do wyniku
git log
.)Zmiana b na
pick
nasquash
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ń doi po wyjściu z edytora, otrzymasz innego edytora, którego zawartość jest
Po zapisaniu i zamknięciu zawartość edytowanego pliku staje się komunikatem zatwierdzenia nowego połączonego zatwierdzenia:
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.źródło
git log hashoftheoldcommit
i zadziałało, ale byłem ciekawy, że mogę zobaczyćgit log --graph
wszystkie te nieosiągalne zobowiązaniaJeśli istnieje wiele zatwierdzeń, możesz użyć,
git rebase -i
aby zgnieść dwa zatwierdzenia w jeden.Jeśli są tylko dwa zatwierdzenia, które chcesz scalić, i są one „najnowszymi dwoma”, można użyć następujących poleceń, aby połączyć dwa zatwierdzenia w jeden:
źródło
git reset --soft HEAD~10
, gdzie 10 to liczba zatwierdzeń, które chcesz scalić.HEAD
, używającgit reset --soft 47b5c5...
gdzie47b5c5...
jest identyfikator SHA1 zatwierdzenia.Rebase: Nie potrzebujesz go:
Prostszy sposób na najczęstszy scenariusz.
W większości przypadków:
W rzeczywistości, jeśli wszystko, czego chcesz, to po prostu połącz kilka ostatnich zatwierdzeń w jeden, ale nie potrzebujesz
drop
,reword
i inne operacje bazowania.możesz po prostu zrobić:
~n
jest liczba zobowiązuje się cicho un-commit (czyli~1
,~2
...)Następnie użyj następującego polecenia, aby zmodyfikować komunikat zatwierdzenia.
który jest prawie taki sam jak długi zasięg
squash
i jedenpick
.I działa dla n zatwierdzeń, ale nie tylko dwóch zatwierdzeń, jak wskazano powyżej.
źródło
~n
jest liczba zobowiązuje się cicho un-commit (czyli~1
,~2
, ...)n
ostatnie zatwierdzenia, alen
zatwierdzenia pośrodku? Czy mogę to zrobić łatwo?git rebase -i
jest to, co musisz zrobićsquash
. @chumakoffn
najnowszych zatwierdzeń w jednym, pierwszym użyciugit reset --soft @~m
, w którymm = n - 1
Najpierw sprawdź, ile masz zatwierdzeń:
Istnieją dwa statusy:
Jednym z nich jest to, że istnieją tylko dwa zatwierdzenia:
Na przykład:
(W takim przypadku nie możesz użyć git rebase), musisz wykonać następujące czynności.
Innym jest, że istnieją więcej niż dwa zobowiązania; chcesz scalić zatwierdzenie C i D.
Na przykład:
(pod tym warunkiem możesz użyć git rebase)
I zamiast tego użyj „squash”. Reszta jest bardzo łatwa. Jeśli nadal nie wiesz, przeczytaj http://zerodie.github.io/blog/2012/01/19/git-rebase-i/
źródło
git push -f origin master
może to być konieczne.Zakładając, że jesteś we własnej gałęzi tematycznej. Jeśli chcesz scalić ostatnie 2 zatwierdzenia w jeden i wyglądać jak bohater, rozgałęź zatwierdzenie tuż przed dokonaniem dwóch ostatnich zatwierdzeń.
Następnie squash zatwierdza drugą gałąź w tej nowej gałęzi:
To wprowadzi zmiany, ale ich nie zatwierdzi. Więc po prostu je popełnij i gotowe.
Teraz możesz połączyć tę nową gałąź tematu z powrotem w swoją główną gałąź.
źródło
a
ic
wymaga, aby zostać połączone ze sobą i zachowaćb
jak to jest.git checkout -b combine-last-two-commits "HEAD^2"
) w wersji git 2.17,fatal: 'HEAD^2' is not a commit and a branch 'combine-last-two-commits' cannot be created from it
możesz anulować rebase za pomocą
a kiedy ponownie uruchomisz interaktywne polecenie rebase, squash; zatwierdzenie musi znajdować się poniżej listy wyboru zatwierdzenia na liście
źródło
Często używam git reset --mixed, aby przywrócić wersję podstawową przed wieloma zatwierdzeniami, które chcesz scalić, a następnie dokonuję nowego zatwierdzenia, w ten sposób możesz pozwolić na twoje najnowsze zatwierdzenie, upewniając się, że Twoja wersja jest HEAD po przekazaniu na serwer.
Jeśli chcę scalić dwie główne zmiany w jedną, najpierw używam:
„249cf9392da197573a17c8426c282” była trzecią wersją, jest też wersją podstawową przed scaleniem, a następnie dokonuję nowego zatwierdzenia:
To wszystko, nadzieja jest innym sposobem dla wszystkich.
Do Twojej wiadomości, od
git reset --help
:źródło
$ git rebase --abort
Uruchom ten kod w dowolnym momencie, jeśli chcesz cofnąć bazę git
$ git rebase -i HEAD~2
Aby ponownie zastosować ostatnie dwa zatwierdzenia. Powyższe polecenie otworzy edytor kodu
Po: wq będziesz w aktywnym trybie bazowym
Uwaga : Otrzymasz innego edytora, jeśli nie pojawi się komunikat ostrzegawczy / komunikat o błędzie. Jeśli wystąpi błąd lub ostrzeżenie, że inny edytor się nie wyświetli, możesz przerwać uruchamianie,
$ git rebase --abort
jeśli zobaczysz błąd lub ostrzeżenie, po prostu kontynuuj uruchamianie$ git rebase --continue
Zobaczysz swój 2 komunikat zatwierdzenia. Wybierz jedną lub napisz własną wiadomość zatwierdzenia, zapisz i wyjdź [: wq]
Uwaga 2: Może być konieczne wymuszenie wypchnięcia zmian do zdalnego repozytorium, jeśli uruchomisz polecenie rebase
$ git push -f
$ git push -f origin master
źródło
git push -f origin/master
innych odpowiedzi. +1Ponieważ używam
git cherry-pick
do wszystkiego, dla mnie to naturalne, że robię to nawet tutaj.Biorąc pod uwagę, że
branchX
sprawdziłem i na końcu są dwa zatwierdzenia, z których chcę utworzyć jedno zatwierdzenie łączące ich zawartość, robię to:Jeśli chcę również zaktualizować
branchX
(i przypuszczam, że jest to wada tej metody), muszę również:źródło
Jeśli twoja gałąź główna
git log
wygląda mniej więcej tak:i chcesz scalić dwie najważniejsze zmiany, wykonaj następujące proste czynności:
git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e
. (Rozwiąż konflikty, jeśli wystąpią)git commit --amend
.Otóż to. Możesz wcisnąć tę scaloną wersję w gałęzi „scalone-zatwierdzenia”, jeśli chcesz.
Ponadto możesz teraz odrzucić dwa commity w swoim głównym oddziale. Po prostu zaktualizuj swój główny oddział jako:
źródło
Jeśli chcesz połączyć dwa najnowsze zatwierdzenia i po prostu użyć komunikatu starszego zatwierdzenia, możesz zautomatyzować proces za pomocą
expect
.Zakładam:
Testowałem z
git version 2.14.3 (Apple Git-98)
.źródło
expect
Jest również nieopisany.expect
.