Szukaj…
Uwagi
Co to jest squash?
Squashing jest procesem polegającym na przyjmowaniu wielu zatwierdzeń i łączeniu ich w jeden zatwierdzenie, obejmujący wszystkie zmiany od początkowych zatwierdzeń.
Squashing i odległe gałęzie
Zwróć szczególną uwagę podczas zgniatania zatwierdzeń na gałęzi śledzącej gałąź zdalną; jeśli zgaszisz zatwierdzenie, które zostało już wypchnięte do zdalnej gałęzi, dwie gałęzie zostaną rozbieżne i będziesz musiał użyć git push -f
aby wymusić te zmiany na zdalnej gałęzi. Należy pamiętać, że może to powodować problemy dla innych osób śledzących tę zdalną gałąź , dlatego należy zachować ostrożność podczas wymuszania wypychania zgniecionych zatwierdzeń w publicznych lub wspólnych repozytoriach.
Jeśli projekt jest hostowany na GitHub, możesz włączyć „wymuszanie ochrony wypychania” w niektórych gałęziach, takich jak master
, dodając go do Settings
- Branches
- Protected Branches
.
Squash Ostatnie zobowiązania bez zmiany
Jeśli chcesz zmiażdżyć poprzednie x
zatwierdzeń w jednym, możesz użyć następujących poleceń:
git reset --soft HEAD~x
git commit
Zastąpienie x
liczbą poprzednich zatwierdzeń, które chcesz uwzględnić w zgniecionym zatwierdzeniu.
Pamiętaj, że spowoduje to utworzenie nowego zatwierdzenia, zasadniczo zapominając o poprzednich x
zatwierdzeniach, w tym o ich autorze, wiadomości i dacie. Prawdopodobnie chcesz najpierw skopiować i wkleić istniejącą wiadomość zatwierdzenia.
Zgniatanie popełnia podczas zmiany
Zatwierdzenia mogą zostać zmiażdżone podczas git rebase
. Zaleca się, aby zrozumieć zmianę zasad przed próbą zgniecenia zmian w ten sposób.
Określ, z którego zatwierdzenia chcesz się opierać, i zanotuj jego wartość skrótu.
Uruchom
git rebase -i [commit hash]
.Alternatywnie możesz wpisać
HEAD~4
zamiast skrótu zatwierdzenia, aby wyświetlić ostatnie zatwierdzenie i 4 kolejne zatwierdzenia przed ostatnim.W edytorze, który otwiera się po uruchomieniu tego polecenia, określ, które zatwierdzenia chcesz zgnieść. Zamień
pick
na początku tych liniisquash
aby zgnieść je do poprzedniego zatwierdzenia.Po wybraniu zatwierdzeń, które chcesz zgnieść, zostaniesz poproszony o napisanie komunikatu zatwierdzenia.
Rejestrowanie Zobowiązuje się do ustalenia, gdzie dokonać zmiany bazy
> git log --oneline
612f2f7 This commit should not be squashed
d84b05d This commit should be squashed
ac60234 Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit
> git rebase -i 36d15de
W tym momencie pojawia się wybrany edytor, w którym możesz opisać, co chcesz zrobić z zatwierdzeniami. Git zapewnia pomoc w komentarzach. Jeśli pozostawisz to bez zmian, nic się nie wydarzy, ponieważ każde zatwierdzenie zostanie zachowane, a ich kolejność będzie taka sama, jak przed wprowadzeniem bazy. W tym przykładzie stosujemy następujące polecenia:
pick ac60234 Yet another commit
squash d84b05d This commit should be squashed
pick 612f2f7 This commit should not be squashed
# Rebase 36d15de..612f2f7 onto 36d15de (3 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
Dziennik Git po napisaniu komunikatu zatwierdzenia
> git log --oneline
77393eb This commit should not be squashed
e090a8c Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit
Autosquash: zatwierdzanie kodu, który chcesz zgnieść podczas rebase
Biorąc pod uwagę następującą historię, wyobraź sobie, że dokonujesz zmiany, którą chcesz zgnieść w bbb2222 A second commit
:
$ git log --oneline --decorate
ccc3333 (HEAD -> master) A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit
Po wprowadzeniu zmian możesz dodać je do indeksu w zwykły sposób, a następnie zatwierdzić je za pomocą argumentu --fixup
z odniesieniem do zatwierdzenia, w które chcesz zgnieść:
$ git add .
$ git commit --fixup bbb2222
[my-feature-branch ddd4444] fixup! A second commit
Spowoduje to utworzenie nowego zatwierdzenia z komunikatem zatwierdzenia, który Git może rozpoznać podczas interaktywnej bazy danych:
$ git log --oneline --decorate
ddd4444 (HEAD -> master) fixup! A second commit
ccc3333 A third commit
bbb2222 A second commit
aaa1111 A first commit
9999999 Initial commit
Następnie wykonaj interaktywną --autosquash
argumentem --autosquash
:
$ git rebase --autosquash --interactive HEAD~4
Git zaproponuje ci commit --fixup
dokonanego za pomocą commit --fixup
we właściwej pozycji:
pick aaa1111 A first commit
pick bbb2222 A second commit
fixup ddd4444 fixup! A second commit
pick ccc3333 A third commit
Aby uniknąć konieczności wpisywania --autosquash
przy każdej --autosquash
, możesz domyślnie włączyć tę opcję:
$ git config --global rebase.autosquash true
Zgniecenie zatwierdzenia podczas scalania
Możesz użyć git merge --squash
aby git merge --squash
zmiany wprowadzone przez gałąź w jednym zatwierdzeniu. Żadne zatwierdzenie nie zostanie utworzone.
git merge --squash <branch>
git commit
Jest to mniej więcej równoważne z użyciem git reset
, ale jest wygodniejsze, gdy wprowadzane zmiany mają symboliczną nazwę. Porównać:
git checkout <branch>
git reset --soft $(git merge-base master <branch>)
git commit
Autosquashing i naprawy
Podczas zatwierdzania zmian można określić, że zatwierdzenie zostanie w przyszłości zmiażdżone na inne zatwierdzenie i można to zrobić w ten sposób,
git commit --squash=[commit hash of commit to which this commit will be squashed to]
Można również użyć opcji --fixup=[commit hash]
alternatywnie do naprawy.
Możliwe jest również użycie słów z komunikatu zatwierdzenia zamiast skrótu zatwierdzenia, tak jak
git commit --squash :/things
gdzie użyto by ostatniego zatwierdzenia ze słowem „rzeczy”.
Wiadomość z tymi zatwierdzeniami zaczyna się od 'fixup!'
lub 'squash!'
po którym następuje reszta komunikatu zatwierdzenia, do którego te zatwierdzenia zostaną zmiażdżone.
Podczas zmiany --autosquash
należy --autosquash
flagi --autosquash
aby użyć funkcji autosquash / fixup.