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.

  1. Określ, z którego zatwierdzenia chcesz się opierać, i zanotuj jego wartość skrótu.

  2. 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.

  3. W edytorze, który otwiera się po uruchomieniu tego polecenia, określ, które zatwierdzenia chcesz zgnieść. Zamień pick na początku tych linii squash aby zgnieść je do poprzedniego zatwierdzenia.

  4. 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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow