Menu
Coddy logo textTech

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.

Squash łączy serię małych commitów w jeden czysty commit za pomocą interaktywnego rebase.

Składnia

PolecenieCo robi
git rebase -i HEAD~3Interaktywny rebase 3 ostatnich commitów
git rebase -i mainRebase wszystkich commitów od main
git merge --squash featureŁączy commity gałęzi w jeden przy scalaniu
git reset --soft HEAD~3 && git commitSquash 3 ostatnich commitów bez rebase

Polecenia interaktywnego rebase

W otwartym edytorze zamień pick na jedno z tych słów.

Słowo kluczoweCo robi
pickZostawia 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.

KrokDziałanieWynik
1git rebase -i HEAD~3Otwiera 3 ostatnie commity w edytorze
2Ustaw commity 2 i 3 na squashOznacza je do wtopienia w pierwszy
3Zapisz i popraw połączoną wiadomośćTrzy commity stają się jednym czystym commitem

Najczęstsze pytania o squash commitów

Co oznacza squash commitów?
Squash zamienia kilka commitów w jeden commit, który zawiera wszystkie ich zmiany. Pliki na końcu są dokładnie takie same; zmienia się tylko historia, więc recenzenci widzą jeden commit z jedną wiadomością zamiast ciągu drobnych poprawek.
Jak połączyć ostatnie N commitów w Git?
Uruchom 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?
Oba wtapiają commit w poprzedni. 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?
Użyj 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?
Tak. 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.
Czy robić squash commitów przed scaleniem?
Wiele zespołów tak robi, żeby każda funkcja trafiała jako jeden commit, łatwy do przeczytania i łatwy do cofnięcia przez revert. Kosztem jest utrata historii krok po kroku. Na gałęzi, której używasz tylko ty, rób squash bez obaw; na wspólnej gałęzi najpierw się umówcie, bo przepisane commity zmuszają wszystkich innych do resetowania swoich kopii.
Czy mogę to przećwiczyć online?
Tak. Otwórz terminal online i uruchom interaktywny rebase w prawdziwej powłoce w przeglądarce, bez żadnej instalacji. Darmowy interaktywny kurs Git w Coddy też krok po kroku omawia rebase i porządkowanie historii.
Ilustracja języków programowania w Coddy

Ucz się Gita z Coddy

ZACZNIJ