Jestem nowy w Git i próbuję zrozumieć różnicę między squash a rebase. Jak rozumiem, wykonujesz squash podczas wykonywania bazy.
Oba git merge --squash
i git rebase --interactive
mogą powodować zatwierdzenie „zgniecione”.
Ale służą one innym celom.
spowoduje zgniecenie zatwierdzenia w gałęzi docelowej, bez zaznaczania relacji scalania.
(Uwaga: od razu nie powoduje zatwierdzenia: potrzebujesz dodatkowego git commit -m "squash branch"
)
Jest to przydatne, jeśli chcesz całkowicie wyrzucić gałąź źródłową, przechodząc od (schemat wzięty z pytania SO ):
git checkout stable
X stable
/
a---b---c---d---e---f---g tmp
do:
git merge --squash tmp
git commit -m "squash tmp"
X-------------------G stable
/
a---b---c---d---e---f---g tmp
a następnie usunięcie tmp
oddziału.
Uwaga: git merge
ma --commit
opcję , ale nie można jej używać z --squash
. To nigdy nie było możliwe do użycia --commit
i --squash
razem.
Od wersji Git 2.22.1 (III kwartał 2019 r.) Wyraźnie zaznaczono tę niezgodność:
Zobacz zatwierdzenie 1d14d0c (24 maja 2019 r.) Autor: Vishal Verma ( reloadbrain
) .
(Połączone przez Junio C Hamano - gitster
- w commit 33f2790 , 25 lipca 2019)
merge
: odmówić--commit
z--squash
Wcześniej, kiedy
--squash
został dostarczony, 'option_commit
' został po cichu upuszczony. Mogło to być zaskakujące dla użytkownika, który próbował--commit
jawnie zastąpić zachowanie squash bez zatwierdzania .
git/git
builtin/merge.c#cmd_merge()
teraz obejmuje:
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
odtwarza niektóre lub wszystkie twoje zmiany na nowej bazie, co pozwala ci zgnieść (lub ostatnio „naprawić”, zobacz to pytanie SO ), przechodząc bezpośrednio do:
git checkout tmp
git rebase -i stable
stable
X-------------------G tmp
/
a---b
Jeśli zdecydujesz się zmiażdżyć wszystkie zatwierdzenia tmp
(ale w przeciwieństwie do merge --squash
niektórych możesz je odtworzyć, a innych zmiażdżyć).
Różnice są następujące:
squash
nie dotyka gałęzi źródłowej ( tmp
tutaj) i tworzy pojedyncze zatwierdzenie tam, gdzie chcesz.rebase
pozwala przejść do tej samej gałęzi źródłowej (nadal tmp
) z:
G
jestc--d--e--f--g
zgnieciony razem?tmp
zgniecione razem.G
nie będzie reprezentował tej samej zawartości niż zg
powodu zmian wprowadzonych przezX
.git merge --no-ff temp
zamiastgit merge --squash temp
, to masz bardziej chaotyczną historię, ale możesz też robić rzeczy ogit revert e
wiele łatwiej. To brudna, ale szczera i pragmatyczna historia, a główna gałąź wciąż pozostaje dość czysta.git bisect
lubgit blame
gdy jest używane zbyt często (jak wgit pull --no-ff
: stackoverflow.com/questions/12798767/... ). W każdym razie nie ma jednego podejścia, dlatego w tym artykule opisano trzy ( stackoverflow.com/questions/9107861/... )Scal zatwierdzenia: zachowuje wszystkie zatwierdzenia w gałęzi i przeplata je z zatwierdzeniami w gałęzi bazowej
Scal squash: zachowuje zmiany, ale pomija poszczególne zatwierdzenia z historii
Rebase: Przenosi całą gałąź funkcji na początek gałęzi master, skutecznie włączając wszystkie nowe commity w master
Więcej tutaj
źródło
Scal squash scala drzewo (sekwencję zatwierdzeń) w jeden zatwierdzenie. Oznacza to, że zgniata wszystkie zmiany dokonane w n zatwierdzeniach w jednym zatwierdzeniu.
Rebasing polega na ponownym bazowaniu, to znaczy na wybraniu nowej bazy (zatwierdzenie nadrzędne) dla drzewa. Może termin rtęciowy na to jest bardziej wyraźny: nazywają to przeszczepem, ponieważ jest to po prostu: wybranie nowego gruntu (zatwierdzenie przez rodziców, root) dla drzewa.
Podczas wykonywania interaktywnego bazowania masz opcję zgniatania, wybierania, edytowania lub pomijania zatwierdzeń, które zamierzasz bazować.
Mam nadzieję, że to było jasne!
źródło
Zacznijmy od następującego przykładu:
Teraz mamy 3 opcje scalić zmiany funkcji oddziału język gałęzi master :
Scal zatwierdzenia
Zachowa całą historię zatwierdzeń gałęzi funkcji i przeniesie je do gałęzi głównej
.
Rebase i scalanie Dołączą
całą historię zatwierdzeń gałęzi funkcji z przodu gałęzi głównej
NIE dodadzą dodatkowego zatwierdzenia.
Squash and merge
Zgrupuje wszystkie zatwierdzenia gałęzi funkcji w jednym zatwierdzeniu, a następnie doda je przed gałęzią główną.
Dodanie dodatkowego fałszywego zatwierdzenia.
Poniżej możesz zobaczyć, jak gałąź główna będzie się opiekować każdym z nich.
We wszystkich przypadkach:
Możemy bezpiecznie USUNĄĆ gałąź funkcji .
źródło