Mam osiem zatwierdzeń w gałęzi, które chciałbym wysłać e-mailem do osób, które nie są jeszcze oświecone. Do tej pory wszystko, co robię, daje mi 8 plików łatek lub zaczyna dostarczać mi pliki łat dla każdego zatwierdzenia w historii gałęzi, od początku czasu. Użyłem git rebase --interactive, aby zmiażdżyć zatwierdzenia, ale teraz wszystko, czego próbuję, daje mi zyliony poprawek od początku czasu. Co ja robię źle?
git format-patch master HEAD # yields zillions of patches, even though there's
# only one commit since master
git
patch
squash
git-squash
skiphoppy
źródło
źródło
Odpowiedzi:
Polecam zrobić to na jednorazowej gałęzi w następujący sposób. Jeśli twoje zatwierdzenia znajdują się w gałęzi "nowe linie" i już przełączyłeś się z powrotem na gałąź "master", to powinno załatwić sprawę:
Mam nadzieję że to pomoże!
źródło
git comit -m "My squashed commits"
przeciwnym razie dodałoby inne nieśledzone plikigit checkout 775ec2a && git checkout -b patch && git merge --squash branchname
Wystarczy dodać jeszcze jedno rozwiązanie do puli: Jeśli zamiast tego użyjesz tego:
Wtedy nadal będzie to 8 łatek ... ale wszystkie będą w jednym pliku łatek i zostaną zastosowane jako jeden z:
źródło
git rebase -i ...
i zgniatać je wszystkie do jednego.Zawsze używam git diff, więc w twoim przykładzie coś takiego
źródło
git log
, zobacz moją odpowiedź na przykładTo jest adaptacja odpowiedzi Adama Aleksandra, na wypadek gdybyś zmiany dotyczyły gałęzi głównej. Wykonaj następujące czynności:
źródło
Jak już wiesz,
git format-patch -8 HEAD
otrzymasz osiem poprawek.Jeśli chcesz, aby 8 zatwierdzeń pojawiło się jako jedno i nie masz nic przeciwko przepisywaniu historii swojej gałęzi (
o-o-X-A-B-C-D-E-F-G-H
), możesz:lub, co byłoby lepszym rozwiązaniem, powtórz wszystkie 8 zatwierdzeń z
X
(zatwierdzenie przed 8 zatwierdzeniami) na nowej gałęziW ten sposób masz tylko jedno zatwierdzenie w gałęzi "dostawa", które reprezentuje wszystkie twoje ostatnie 8 zatwierdzeń
źródło
git merge master
po prostu przewija do przodu i nie miażdży zatwierdzeń w jednym. Zmień na,git merge --squash master
aby wszystkie zatwierdzenia zostały zgniecione i widoczne w obszarze scenicznym. Twój przepływ będzie działał z tą zmianą. (Używam git w wersji 2.1.0.)Łata formatu między dwoma tagami:
źródło
Najłatwiejszym sposobem jest użycie
git diff
i dodanie,git log
jeśli chcesz połączyć komunikat o zatwierdzeniu, który wyprowadzi metoda squash. Na przykład, aby utworzyć łatkę między zatwierdzeniemabcd
a1234
:Następnie podczas nakładania plastra:
Nie zapomnij o
--binary
argumentachgit diff
dotyczących plików nietekstowych, np. Obrazów lub filmów.źródło
Na podstawie odpowiedzi Adama Alexandra:
źródło