Czy w Git istnieje sposób na połączenie wszystkich zmian z jednej gałęzi do drugiej, ale jednocześnie zmiażdżyć do jednego zatwierdzenia w tym samym czasie?
Często pracuję nad nową funkcją w osobnym oddziale i regularnie zatwierdzam / wypycham - głównie w celu tworzenia kopii zapasowych lub przeniesienia tego, nad czym pracuję, na inną maszynę. Najczęściej te zatwierdzenia mówią „Feature xxx WIP” lub coś zbędnego.
Gdy ta praca zostanie zakończona i chcę połączyć gałąź WIP z powrotem w master, chciałbym odrzucić wszystkie pośrednie zatwierdzenia i mieć tylko jedno czyste zatwierdzenie.
Czy jest na to łatwy sposób?
Alternatywnie, co powiesz na polecenie, które zgniata wszystkie zatwierdzenia na gałęzi od momentu jej rozgałęzienia?
rebase --squash
Znaleziono to! Polecenie scalania ma
--squash
opcjęw tym momencie wszystko jest scalone, możliwe, że jest w konflikcie, ale nie zostaje popełnione. Więc mogę teraz:
źródło
git add .
zrobić?git add .
dodaje wszystkie niezignorowane pliki w bieżącym katalogu, byłbym ostrożny przy pobieraniu niezamierzonych plików w ten sposób.git add .
możesz użyćgit add -u
tylko do dodawania plików, które zostały już dodane do drzewa.Wypróbuj
git rebase -i master
w swoim dziale funkcji. Następnie możesz zmienić wszystkie oprócz jednego „pick” na „squash”, aby połączyć zatwierdzenia. Widzieć zatwierdzanie squashingu za pomocą rebaseNa koniec możesz wykonać scalenie z gałęzi master.
źródło
Użycie
git merge --squash <feature branch>
jako odpowiedzi zaakceptowanej sugeruje załatwienie sprawy, ale nie pokaże scalonej gałęzi jako faktycznie scalonej.Dlatego jeszcze lepszym rozwiązaniem jest:
<feature branch>
się z powyższym za pomocągit merge --squash
Ta wiki szczegółowo wyjaśnia procedurę.
źródło
Stworzyłem własny alias git, aby zrobić dokładnie to. Nazywam to
git freebase
! Zabierze twoją istniejącą niechlujną, niemożliwą do odblokowania gałąź funkcji i odtworzy ją, aby stała się nową gałęzią o tej samej nazwie z zatwierdzeniami zgniecionymi w jednym zatwierdzeniu i ponownie opartym na gałęzi, którą określisz (domyślnie master). Na samym końcu pozwoli ci użyć dowolnej wiadomości zatwierdzenia, którą chcesz dla swojej nowej gałęzi „freebased”.Zainstaluj go, umieszczając następujący alias w .gitconfig:
Użyj go z gałęzi funkcji, uruchamiając:
git freebase <new-base>
Testowałem to tylko kilka razy, więc przeczytaj go najpierw i upewnij się, że chcesz go uruchomić. Jako mały środek bezpieczeństwa drukuje początkowy sha1, więc powinieneś być w stanie przywrócić starą gałąź, jeśli coś pójdzie nie tak.
Będę go utrzymywał w moim repozytorium dotfiles na github: https://github.com/stevecrozz/dotfiles/blob/master/.gitconfig
źródło
git merge --squash <feature branch>
jest dobrą opcją. „git commit” informuje o wszystkich komunikatach zatwierdzania gałęzi funkcji z wyborem, aby go zachować.Dla mniejszego scalania zatwierdzeń.
git merge do x razy --git reset HEAD ^ --soft następnie git commit.
Ryzyko usunięte pliki mogą wrócić.
źródło
Możesz to zrobić za pomocą polecenia „rebase”. Nazwijmy gałęzie „główne” i „funkcja”:
Polecenie rebase odtworzy wszystkie zatwierdzenia na „feature” jako jedno zatwierdzenie z rodzicem równym „main”.
Możesz chcieć biec
git merge main
wcześniejgit rebase main
jeśli „main” zmieniło się od czasu utworzenia „feature” (lub od ostatniego scalenia). W ten sposób nadal masz pełną historię na wypadek konfliktu scalenia.Po zmianie bazy możesz połączyć swoją gałąź z główną, co powinno doprowadzić do szybkiego połączenia:
Zobacz stronę rebase Understanding Git Conceptually, aby uzyskać dobry przegląd
źródło