Tworzę nowy oddział master
z:
git checkout -b testbranch
Dokonuję w nim 20 zobowiązań.
Teraz chcę zmiażdżyć te 20 zobowiązań. Robię to z:
git rebase -i HEAD~20
A jeśli nie wiem, ile zatwierdzeń? Czy jest jakiś sposób na zrobienie czegoś takiego:
git rebase -i all on this branch
git
version-control
użytkownik3803850
źródło
źródło
git rebase -i 58333012713fc168bd70ad00d191b3bdc601fa2d
wich zrobi interaktywną rebase gdzie commitnumber jest ostatni popełnić który pozostaje niezmienionyOdpowiedzi:
Innym sposobem na zmiażdżenie wszystkich zatwierdzeń jest zresetowanie indeksu do wzorcowania:
Nie jest to idealne, ponieważ sugeruje, że wiesz, z której gałęzi pochodzi „twoja gałąź”.
Uwaga: odnalezienie gałęzi pochodzenia nie jest łatwe / możliwe w Git ( sposób wizualny jest często najłatwiejszy , jak widać tutaj ).
EDYCJA: będziesz musiał użyć
git push --force
Karlotcha Hoa dodaje w komentarzach :
źródło
YourBranch
jest obecnie. To pozostanieYourBranch
nienaruszone, kiedy to zrobiszreset
git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))
aby automatycznie użyć gałęzi, w której aktualnie się znajdujesz. Jeśli go użyjesz, możesz także użyć aliasu, ponieważ polecenie nie zależy od nazwy oddziału.git push --force
(i ostrzeż swoich współpracowników, jeśli jest kilka osób pracujących w tym oddziale)Sprawdź gałąź, dla której chcesz zgnieść wszystkie zatwierdzenia w jednym zatwierdzeniu. Powiedzmy, jego nazwie,
feature_branch
.git checkout feature_branch
Krok 1:
Wykonaj miękki reset
origin/feature_branch
swojego lokalnegomaster
oddziału (w zależności od potrzeb możesz zresetować również za pomocą Origin / Master). Spowoduje to zresetowanie wszystkich dodatkowych zatwierdzeń wfeature_branch
pliku, ale bez zmiany lokalnych zmian plików.git reset --soft master
Krok 2:
Dodaj wszystkie zmiany w katalogu git repo do nowego zatwierdzenia, które ma zostać utworzone. I to samo z komunikatem.
git add -A && git commit -m "commit message goes here"
źródło
-f
flagi.To, co robisz, jest podatne na błędy. Po prostu zrób:
co automatycznie spowoduje bazowanie tylko zatwierdzeń oddziału na bieżącym najnowszym systemie głównym.
źródło
commit -am "the whole thing!"
reset origin/master
metoda jest naprawdę zła, ponieważ jest to tak samo jak wykonywanie zatwierdzeń bezpośrednio na masterie - nie ma historii „scalania gałęzi”, nie ma opcji żądania ściągania. Odpowiedź @WaZaA jest bardziej zgodna z normalnym procesem pracy z gitem, myślęKolejny prosty sposób: przejdź do gałęzi początkowej i zrób
merge --squash
. To polecenie nie wykonuje zatwierdzenia „zgniecionego”. kiedy to zrobisz, wszystkie wiadomości zatwierdzenia Twojej Oddziału zostaną zebrane.źródło
Zakładając, że rozgałęziasz się od mastera, nie musisz
yourBranch
cały czas wchodzić w krok resetowania:Objaśnienie :
git rev-list --count HEAD ^master
zlicza zatwierdzenia, ponieważ utworzono gałąź funkcji od wzorca, np. 20git reset --soft HEAD~20
wykona miękki reset ostatnich 20 zatwierdzeń. To pozostawia zmiany w plikach, ale usuwa zatwierdzenia.Zastosowanie :
W moim profilu .bash dodałem alias, aby
gisquash
to zrobić za pomocą jednego polecenia:Po zresetowaniu i zatwierdzeniu musisz zrobić
git push --force
.Wskazówka :
Jeśli używasz Gitlab> = 11.0, nie musisz już tego robić, ponieważ ma opcję zgniatania podczas łączenia gałęzi.
źródło
Opierając się na przeczytaniu kilku pytań Stackoverflow i odpowiedzi na temat squashingu, myślę, że jest to dobry jeden wiersz do zgniatania wszystkich zatwierdzeń w gałęzi:
Zakłada się, że master jest gałęzią podstawową.
źródło
Rozwiązanie dla osób, które wolą klikać:
Zainstaluj sourcetree (jest bezpłatny)
Sprawdź, jak wyglądają twoje zobowiązania. Najprawdopodobniej masz coś podobnego do tego
Kliknij prawym przyciskiem myszy na zatwierdzenie nadrzędne . W naszym przypadku jest to gałąź master.
Możesz zgnieść zatwierdzenie z poprzednim, klikając przycisk. W naszym przypadku musimy kliknąć 2 razy. Możesz także zmienić komunikat zatwierdzenia
Rezultaty są niesamowite i jesteśmy gotowi do działania!
Uwaga dodatkowa: Jeśli przepychałeś swoje częściowe zatwierdzenia do pilota, musisz użyć siły push po squashu
źródło
Innym rozwiązaniem byłoby zapisanie wszystkich dzienników zatwierdzeń w pliku
git log> branch.log
Teraz branch.log będzie miał wszystkie identyfikatory zatwierdzeń od początku. Przewiń w dół i weź pierwszy zatwierdzenie (będzie to trudne w terminalu) za pomocą pierwszego zatwierdzenia
git reset --soft
wszystkie zobowiązania zostaną zmiażdżone
źródło
Reset Git, jak wspomniano wcześniej w wielu odpowiedziach, jest zdecydowanie najlepszym i najprostszym sposobem na osiągnięcie tego, co chcesz. Używam go w następującym przepływie pracy:
(w dziale rozwoju)
źródło
Cały ten reset gita, twardy, miękki i wszystko inne wspomniane tutaj prawdopodobnie działa (nie dla mnie), jeśli wykonasz kroki poprawnie i jakiś dżin.
Jeśli jesteś przeciętnym Joe smo, spróbuj tego:
Jak używać git merge - quash?
Uratowałem sobie życie, i pójdę do squasha, używam tego 4 razy, odkąd się o tym dowiedziałem. Prosty, czysty i w zasadzie 1 comamnd. W skrócie:
jeśli jesteś na gałęzi, nazwijmy to „moja_nowa_funkcja” wyłącz rozwijanie, a twoje żądanie ściągnięcia ma 35 zatwierdzeń (lub jak wiele) i chcesz, aby było 1.
A. Upewnij się, że twój oddział jest aktualny, kontynuuj rozwijaj, pobieraj najnowsze oraz łącz i rozwiązuj wszelkie konflikty z „my_new_feature”
(ten krok naprawdę powinieneś zrobić tak szybko, jak to możliwe przez cały czas)
B. B. Bądź na bieżąco z rozwijaniem i rozgałęzianiem się do nowego oddziału, nazywając go „my_new_feature_squashed”
C. magia jest tutaj.
Chcesz przenieść swoją pracę z „my_new_feature” do „my_new_feature_squashed”
Więc po prostu zrób to (podczas tworzenia nowego oddziału, rozwijamy się):
git merge --squash my_new_feature
Wszystkie twoje zmiany będą teraz w twoim nowym oddziale, nie krępuj się przetestować, a następnie po prostu wykonaj 1 zatwierdzenie, wypchnij, nowy PR tego oddziału - i poczekaj na powtórzenie następnego dnia.
Nie lubisz kodować? :)
źródło
Możesz użyć narzędzia, które stworzyłem specjalnie do tego zadania:
https://github.com/sheerun/git-squash
Zasadniczo musisz zadzwonić
git squash master
i gotoweźródło