Mam zdalny serwer Git, oto scenariusz, który chcę wykonać:
Dla każdego błędu / funkcji tworzę inną gałąź Git
Nadal zatwierdzam swój kod w tym oddziale Git z nieoficjalnymi wiadomościami Git
W górnym repozytorium musimy wykonać jedno zatwierdzenie dla jednego błędu z oficjalną wiadomością Git
Jak więc połączyć moją gałąź z gałęzią zdalną, aby otrzymali tylko jedno zatwierdzenie dla wszystkich moich meldowań (nawet chcę podać w tym celu komunikat zatwierdzenia)?
git
git-merge
git-squash
SunnyShah
źródło
źródło
git merge --squash
robi to wszystko w wierszu poleceń za jednym strzałem i masz tylko nadzieję, że to zadziała.git rebase -i
wywołuje edytor i pozwala dostroić rebase. Jest wolniejszy, ale możesz zobaczyć, co robisz. Istnieją również różnice między rebase a scalaniem, które są zbyt zaangażowane, aby uwzględnić je w komentarzu.merge --squash
ze starego do nowego, a następnie połącz nową gałąź do opanowania. Stara gałąź staje się przestarzała.Odpowiedzi:
Powiedzmy, że twoja gałąź naprawiania błędów jest wywoływana
bugfix
i chcesz połączyć ją wmaster
:Spowoduje to pobranie wszystkich zatwierdzeń z
bugfix
gałęzi, zgniecenie ich w 1 zatwierdzenie i scalenie go zmaster
gałęzią.Objaśnienie :
Przełączniki do
master
oddziału.Pobiera wszystkie zatwierdzenia z
bugfix
oddziału i łączy je z bieżącym oddziałem.Tworzy pojedyncze zatwierdzenie na podstawie scalonych zmian.
Pominięcie
-m
parametru pozwala zmodyfikować wersję roboczą wiadomości zatwierdzenia zawierającą każdą wiadomość z twoich zgniecionych zatwierdzeń przed sfinalizowaniem twojego zatwierdzenia.źródło
git commit
(bez-m
parametrów), a będziesz mógł zmodyfikować szkicowaną wiadomość zatwierdzenia zawierającą wszystkie zgniecione wiadomości zatwierdzenia.git commit --amend -m '...'
później.git commit
nie będzie już wyświetlać użytecznego komunikatu zatwierdzenia zawierającego wszystkie zgniecione wiadomości zatwierdzenia. W takim przypadku spróbujgit commit --file .git/SQUASH_MSG
(przez stackoverflow.com/a/11230783/923560 ).git commit -a --author="Author" --message="Issue title #id"
git merge --squash
umożliwia utworzenie jednego zatwierdzenia na bieżącej gałęzi, którego efekt jest taki sam jak scalenie innej gałęzi. Ale nie wygeneruje rekordu scalania, co oznacza, że Twoje żądanie ściągnięcia nie spowoduje żadnych zmian, ale nie zostanie oznaczone jako scalone! Aby to zrobić, wystarczy usunąć tę gałąź.To, co ostatecznie mnie wyjaśniło, to komentarz pokazujący, że:
jest odpowiednikiem robienia:
Kiedy chcę scalić gałąź funkcji ze 105 zatwierdzeniami (!!) i zmiażdżyć je wszystkie w jednym, nie chcę,
git rebase -i origin/master
ponieważ muszę osobno rozwiązywać konflikty scalania dla każdego z pośrednich zatwierdzeń (lub przynajmniej tych, które git nie może się zorientować). Użyciegit merge --squash
daje mi wynik, jaki chcę, z jednego zatwierdzenia do scalenia całej gałęzi funkcji. Potrzebuję tylko jednego ręcznego rozwiązania konfliktu.źródło
git merge master
, a dopiero potemgit merge --squash feature
w gałęzi głównej.git merge --squash feature
z gałęzi master?Chcesz połączyć z opcją squash. Dzieje się tak, jeśli chcesz to zrobić pojedynczo.
Jeśli chcesz scalić wszystkie gałęzie w tym samym czasie, co pojedyncze zatwierdzenia, najpierw najpierw wykonaj interaktywny podział i wyciśnij każdą funkcję, a następnie scal ośmiornicę:
Squash w jednym zatwierdzeniu, a następnie powtórz dla pozostałych funkcji.
To ostatnie scalenie jest „scaleniem ośmiornicy”, ponieważ łączy wiele gałęzi jednocześnie.
Mam nadzieję że to pomoże
źródło
Jeśli masz już
git merge bugfix
włączonymain
, możesz zmiksować zatwierdzenie scalania w jeden z:źródło
git reset --soft HEAD^1
wydaje się cofać ostatnie zatwierdzenie wykonane przed scaleniem, przynajmniej w przypadku, gdy scalenie jest przewijaniem do przodu.git reset --soft HEAD^<number-of-commits-to-squash>
.Scal
newFeature
gałąźmaster
z niestandardowym zatwierdzeniem:Jeśli zamiast tego zrobisz
git merge --squash newFeature && git commit
otrzymasz komunikat zatwierdzenia, który będzie zawierał wszystkie zatwierdzenia
newFeature
oddziału, które możesz dostosować.Dokładnie to wyjaśniam tutaj: https://youtu.be/FQNAIacelT4
źródło
Wiem, że to pytanie nie dotyczy konkretnie Github, ale ponieważ Github jest tak szeroko stosowane i to jest odpowiedź, której szukałem, podzielę się nią tutaj.
Github ma możliwość wykonywania połączeń squash, w zależności od opcji scalania włączonych dla repozytorium.
Jeśli scalenia squasha są włączone, opcja „Squash and merge” powinna pojawić się w menu pod przyciskiem „Scal”.
źródło
Załóżmy, że pracowałeś w funkcji / zadaniu 1 z wieloma zatwierdzeniami.
Przejdź do gałęzi projektu (project / my_project)
Utwórz nowy oddział (feature / task1_bugfix)
Połącz z
--squash
opcjąUtwórz pojedynczy zatwierdzenie
Pchnij swój oddział
źródło
Dla Gita
Utwórz nową funkcję
przez Terminal / Shell:
Nie zatwierdza go, pozwala najpierw go przejrzeć.
Następnie zatwierdź i zakończ funkcję z tej nowej gałęzi, a następnie usuń / zignoruj starą (tę, którą stworzyłeś).
źródło
jeśli pojawi się błąd: zatwierdzenie nie jest możliwe, ponieważ masz nie scalone pliki.
naprawiono wszystkie pliki konfliktu
możesz również użyć
źródło
Aby zgnieść lokalny oddział przed wypchnięciem go:
sprawdź gałąź, o której mowa, aby pracować, jeśli nie jest jeszcze wyewidencjonowana.
Znajdź sha najstarszego zatwierdzenia, które chcesz zachować.
Utwórz / sprawdź nową gałąź (tmp1) z tego zatwierdzenia.
git checkout -b tmp1 <sha1-of-commit>
Scal oryginalną gałąź w nową zgniatanie.
git merge --squash <original branch>
Zatwierdź zmiany, które zostały utworzone przez scalenie, z komunikatem o zatwierdzeniu podsumowania.
git commit -m <msg>
Do kasy oryginalnej gałęzi, którą chcesz zgnieść.
git checkout <branch>
Zresetuj do pierwotnego zatwierdzenia, które chcesz zachować.
git reset --soft <sha1>
Ponownie uruchom tę gałąź w oparciu o nową gałąź tmp1.
git rebase tmp1
To wszystko - teraz usuń tymczasową gałąź tmp1, gdy masz pewność, że wszystko jest w porządku.
źródło
Możesz użyć narzędzia, które stworzyłem, aby ułatwić ten proces: git-squash . Na przykład, aby zgnieść wszystkie zatwierdzenia w gałęzi funkcji, która została rozgałęziona z gałęzi głównej, napisz:
źródło