Git: squash commitów
Ostatnia aktualizacja
Squash łączy kilka commitów w jeden, więc chaotyczna seria commitów w stylu "wip", "fix typo", "actually fix it" staje się jednym czystym commitem. Zwykle używa się do tego interaktywnego rebase, git rebase -i, w którym oznaczasz commity do połączenia. Ponieważ squash przepisuje historię, rób go przed push albo na gałęzi, na której pracujesz tylko ty.
Wypróbuj te polecenia w terminalu online: prawdziwa powłoka w przeglądarce, bez żadnej instalacji.
Składnia
| Polecenie | Co robi |
|---|---|
git rebase -i HEAD~3 | Interaktywny rebase 3 ostatnich commitów |
git rebase -i main | Rebase wszystkich commitów od main |
git merge --squash feature | Łączy commity gałęzi w jeden przy scalaniu |
git reset --soft HEAD~3 && git commit | Squash 3 ostatnich commitów bez rebase |
Polecenia interaktywnego rebase
W otwartym edytorze zamień pick na jedno z tych słów.
| Słowo kluczowe | Co robi |
|---|---|
pick | Zostawia commit bez zmian |
squash (s) | Wtapia w poprzedni commit, łączy wiadomości |
fixup (f) | Wtapia, ale odrzuca wiadomość tego commita |
reword (r) | Zostawia commit, ale edytuje jego wiadomość |
Przykład krok po kroku
Połącz trzy ostatnie commity w jeden przed push.
| Krok | Działanie | Wynik |
|---|---|---|
| 1 | git rebase -i HEAD~3 | Otwiera 3 ostatnie commity w edytorze |
| 2 | Ustaw commity 2 i 3 na squash | Oznacza je do wtopienia w pierwszy |
| 3 | Zapisz i popraw połączoną wiadomość | Trzy commity stają się jednym czystym commitem |
Najczęstsze pytania o squash commitów
Co oznacza squash commitów?
Jak połączyć ostatnie N commitów w Git?
git rebase -i HEAD~N (na przykład HEAD~3 dla trzech ostatnich). W edytorze zostaw pierwszy commit jako pick, a pozostałe zmień na squash (albo fixup, żeby odrzucić ich wiadomości). Zapisz, popraw połączoną wiadomość commita, a commity złożą się w jeden.Czym różni się squash od fixup?
squash zachowuje wiadomość commita i pozwala połączyć ją z pozostałymi w edytorze. fixup całkowicie odrzuca wiadomość commita i zostawia tylko wiadomość wcześniejszego commita. Przydaje się przy commitach typu "ups, drobna poprawka", których nie chcesz w końcowej wiadomości.Jak zrobić squash całej gałęzi przy scalaniu?
git merge --squash feature, a potem git commit. To nakłada wszystkie zmiany z gałęzi jako zmiany w poczekalni i pozwala zapisać je jako jeden commit na gałęzi docelowej, bez przenoszenia pojedynczych commitów gałęzi. Przycisk "Squash and merge" na GitHubie robi to samo.Czy da się zrobić squash bez interaktywnego rebase?
git reset --soft HEAD~N cofa gałąź o N commitów, zostawiając wszystkie ich zmiany w poczekalni, a potem jeden git commit zapisuje je jako jeden commit. To szybki sposób na squash najnowszych commitów bez otwierania edytora rebase.