Co oznacza Squashing Commits in git. Jak zmiażdżyć zatwierdzenia na Githubie?
Jestem nowy w Git i poprosiłem o przypisanie mnie do nowego błędu w analizatorze coala. Naprawiłem błąd, a teraz zostałem poproszony o zmiażdżenie moich zatwierdzeń. Jak mam to zrobić?
Odpowiedzi:
Możesz myśleć o Gicie jako o zaawansowanej bazie danych zawierającej migawki katalogów roboczych.
Bardzo fajną cechą Gita jest możliwość przepisania historii zatwierdzeń.
Głównym powodem takiego działania jest to, że wiele takich historii jest istotnych tylko dla programisty, który je wygenerował, dlatego należy je uprościć lub upiększyć przed przesłaniem do współdzielonego repozytorium.
Zgniatanie zatwierdzenia oznacza, z idiomatycznego punktu widzenia, przeniesienie zmian wprowadzonych we wspomnianym zatwierdzeniu do jego rodzica, tak aby w rezultacie otrzymano jedno zatwierdzenie zamiast dwóch (lub więcej).
Jeśli powtórzysz ten proces wiele razy, możesz zredukować n zatwierdzenia do jednego.
Wizualnie, jeśli rozpocząłeś pracę od zatwierdzenia oznaczonego jako Start , chcesz tego
Możesz zauważyć, że nowe zatwierdzenie ma nieco ciemniejszy odcień niebieskiego. To jest zamierzone.
W Git squash osiąga się za pomocą Rebase , w specjalnej formie zwanej Interactive Rebase .
Upraszczając, kiedy przebudowujesz zestaw zatwierdzeń na gałąź B , zastosujesz wszystkie zmiany wprowadzone przez te zatwierdzenia tak, jak zostały wykonane, zaczynając od B zamiast ich pierwotnego przodka.
Wizualna wskazówka
Zwróć uwagę ponownie na różne odcienie niebieskiego.
Interaktywna rebase pozwala wybrać sposób zmiany bazy zatwierdzeń. Jeśli uruchomisz to polecenie:
Skończyłbyś z plikiem, który zawiera listę zmian, które zostaną zmienione
Nie nazwać zobowiązuje, ale te cztery z nich mają być commity od start do szefa
Zaletą tej listy jest to, że można ją edytować .
Możesz pominąć zmiany lub je zmiażdżyć .
Wszystko, co musisz zrobić, to zmienić pierwsze słowo na squash .
Jeśli zamkniesz edytor i nie zostaną znalezione żadne konflikty podczas scalania, otrzymasz taką historię:
W twoim przypadku nie chcesz przechodzić do innej gałęzi, ale raczej do poprzedniego zatwierdzenia.
Aby przekształcić historię, jak pokazano w pierwszym przykładzie, musisz uruchomić coś takiego
zmień "polecenia" na squash dla wszystkich zatwierdzeń oprócz pierwszego, a następnie zamknij edytor.
Uwaga dotycząca zmieniania historii
W Gicie zatwierdzenia nigdy nie są edytowane. Mogą być przycinane, niedostępne, klonowane, ale nie zmieniane.
Kiedy zmieniasz bazę, w rzeczywistości tworzysz nowe zatwierdzenia.
Do starych nie ma już dostępu żaden sędzia, więc nie są pokazywane w historii, ale wciąż tam są!
Oto, co faktycznie otrzymujesz za rebase:
Jeśli już je gdzieś popchnąłeś, przepisanie historii faktycznie stworzy gałąź!
źródło
man git rebase
: Sugerowany komunikat o zatwierdzeniu dla zwiniętego zatwierdzenia to konkatenacja komunikatów o zmianach z pierwszego zatwierdzenia i tych z poleceniem "squash"git diff
może pomóc ci pokazać, co się stało.Polecenie rebase ma kilka niesamowitych opcji dostępnych w swoim
--interactive
(lub-i
) trybie, a jedną z najczęściej używanych jest możliwość zgniatania zatwierdzeń. Robi to mniejsze commity i łączy je w większe, co może być przydatne, jeśli kończysz dzień pracy lub po prostu chcesz inaczej spakować zmiany. Omówimy, jak możesz to łatwo zrobić.Jedna uwaga: rób to tylko w przypadku zatwierdzeń, które nie zostały wypchnięte do zewnętrznego repozytorium. Jeśli inni oparli pracę na zatwierdzeniach, które zamierzasz usunąć, może wystąpić wiele konfliktów. Po prostu nie przepisuj swojej historii, jeśli została udostępniona innym.
Powiedzmy, że właśnie wykonałeś kilka małych zatwierdzeń i chcesz zrobić z nich jedno większe zatwierdzenie. Obecnie historia naszego repozytorium wygląda następująco:
Ostatnie 4 zatwierdzenia byłyby dużo szczęśliwsze, gdyby zostały połączone razem, więc zróbmy to poprzez interaktywne ponowne bazowanie:
Tak więc wydarzyło się tutaj kilka rzeczy. Po pierwsze, powiedziałem Gitowi, że chcę zmienić bazę przy użyciu ostatnich czterech zatwierdzeń, z których HEAD jest z HEAD ~ 4. Git umieścił mnie teraz w edytorze z powyższym tekstem i małym wyjaśnieniem, co można zrobić. Na tym ekranie dostępnych jest wiele opcji, ale teraz zamierzamy zgnieść wszystko do jednego zatwierdzenia. Tak więc zmiana pierwszych czterech wierszy pliku na to załatwi sprawę:
Zasadniczo mówi to Gitowi, aby połączył wszystkie cztery zatwierdzenia w pierwszym zatwierdzeniu na liście. Po wykonaniu tej czynności i zapisaniu pojawi się inny edytor z następującymi elementami:
Ponieważ łączymy tak wiele zatwierdzeń, Git pozwala modyfikować komunikat nowego zatwierdzenia w oparciu o resztę zatwierdzeń zaangażowanych w proces. Edytuj wiadomość według własnego uznania, a następnie zapisz i zakończ. Gdy to zrobisz, twoje zatwierdzenia zostały pomyślnie zmiażdżone!
A jeśli ponownie spojrzymy na historię…
Jak dotąd było to stosunkowo bezbolesne. Jeśli napotkasz konflikty podczas rebase, zwykle są one dość łatwe do rozwiązania, a Git prowadzi cię przez jak najwięcej. Podstawą tego jest naprawienie konfliktu,
git add
pliku, a następniegit rebase --continue
wznowienie procesu. Oczywiście,git rebase --abort
jeśli chcesz, powrócisz do poprzedniego stanu. Jeśli z jakiegoś powodu straciłeś zatwierdzenie w rebase, możesz użyć reflog, aby je odzyskać.Szczegóły można znaleźć pod tym linkiem .
źródło
Oznacza to połączenie kilku zatwierdzeń w jedno. Spójrz na :
https://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/
Zgniataj moje ostatnie zatwierdzenia X razem za pomocą Gita
źródło