To pytanie dotyczy nie tylko tego, jak wykonać to zadanie, ale także tego, czy jest to dobra, czy zła praktyka w Git.
Weź pod uwagę, że lokalnie wykonuję większość prac na gałęzi głównej, ale utworzyłem gałąź tematyczną, którą nazwę „topical_xFeature”. W trakcie pracy nad "topical_xFeature" i przełączania się tam iz powrotem w celu wykonania innej pracy na gałęzi master, okazuje się, że wykonałem więcej niż jedno zatwierdzenie w gałęzi "topical_xFeature", ale między każdym zatwierdzeniem nie zrobiłem Pchać.
Po pierwsze , czy uważasz tę złą praktykę? Czy nie byłoby rozsądniej trzymać się jednego zatwierdzenia na gałąź na push? W jakich przypadkach byłoby dobrze mieć wiele zatwierdzeń na gałęzi przed wykonaniem push?
Po drugie , jak najlepiej wykonać przeniesienie wielu zatwierdzeń z gałęzi topical_xFeature do gałęzi głównej w celu wypchnięcia? Czy jest to uciążliwe, aby się tym nie martwić i po prostu wykonać push, gdy wiele zatwierdzeń zostanie wypchniętych, czy może mniej irytujące jest jakoś scalenie zatwierdzeń w jedno, a następnie wciśnięcie? Ponownie, jak to zrobić?
źródło
git branch -d topic
. Dlaczego git nie jest w stanie zidentyfikować, że wszystkie zmiany zostały scalone?git branch -D topic
aby wymusić jej usunięcie.Jest to sposób, w jaki zwykle podążam, łącząc wiele zatwierdzeń w jeden zatwierdzony kod, zanim wypchnę kod.
Aby to osiągnąć, sugeruję użycie koncepcji „ squasha ” dostarczonej przez GIT.
Wykonaj poniższe kroki.
1) git rebase -i master (zamiast mastera możesz też użyć konkretnego zatwierdzenia)
otwórz interaktywny edytor rebase, w którym pokaże wszystkie Twoje zatwierdzenia. Zasadniczo tam, gdzie musisz zidentyfikować zatwierdzenia, które chcesz połączyć w jedno zatwierdzenie.
Wyobraź sobie, że są to Twoje zmiany i pokazane w edytorze coś takiego.
Ważne jest, aby pamiętać, że te zatwierdzenia są wymienione w odwrotnej kolejności niż normalnie widzisz je przy użyciu polecenia log. Oznacza, że starszy commit zostanie wyświetlony jako pierwszy.
2) Zmień „pick” na „squash” dla ostatnio zatwierdzonych zmian. coś jak pokazano poniżej. Robiąc to, twoje ostatnie 2 zatwierdzenia zostaną połączone z pierwszym.
Możesz także użyć krótkiej formy, jeśli masz dużo zatwierdzeń do połączenia:
do edycji użyj „i”, umożliwi to edytorowi wstawianie. Pamiętaj, że większość (najstarszych) zatwierdzeń nie może zostać zgnieciona, ponieważ nie ma poprzedniego zatwierdzenia do połączenia. Więc trzeba to wybrać lub „p”. Użyj klawisza „Esc”, aby wyjść z trybu wstawiania.
3) Teraz zapisz edytor za pomocą następującego polecenia. : wq
Kiedy to zapiszesz, masz jedno zatwierdzenie, które wprowadza zmiany we wszystkich trzech poprzednich zatwierdzeniach.
Mam nadzieję, że to ci pomoże.
źródło
git rebase -i HEAD~2
było dla mnie pomocnym miejscem na początek. Wtedy ta odpowiedź była pomocna. Następniegit status
pokazałem , że "Twoja gałąź i 'pochodzenie / cecha / xyz' rozeszły się i mają odpowiednio 1 i 1 różne zatwierdzenia." Musiałem więcgit push origin feature/xyz --force-with-lease
zobaczyć stackoverflow.com/a/59309553/470749 i freecodecamp.org/forum/t/...Po pierwsze : nic nie mówi ci, że masz tylko jedno zatwierdzenie na gałąź na wypychanie: wypychanie jest mechanizmem publikacji umożliwiającym publikowanie lokalnej historii (tj. Kolekcji zatwierdzeń) w zdalnym repozytorium.
Po drugie :
git merge --no-ff topical_xFeature
nagrałby na master jako pojedyncze zatwierdzenie twojej pracy tematycznej, przed naciśnięciemmaster
.(W ten sposób będziesz w
topical_xFeature
pobliżu dla dalszych ewolucji, które możesz nagrywaćmaster
jako pojedyncze nowe zatwierdzenie przy następnym scalaniu - no-ff.Jeśli
topical_xFeature
celem jest pozbycie się tego,git merge --squash
jest to właściwa opcja, jak opisano szczegółowo w Brian Campbell „s odpowiedź .)źródło
--squash
nie--no-ff
jest to, czego chcesz.--no-ff
stworzyłoby zatwierdzenie scalające, ale także pozostawiłoby wszystkie zatwierdzenia ztopical_xFeature
.topical_feature
gałąź i po prostu nagrać pojedyncze zatwierdzenie namaster
gałęzi.Przełącz się na gałąź główną i upewnij się, że jesteś na bieżąco.
git fetch
może to być konieczne (w zależności od konfiguracji git), aby otrzymywać aktualizacje na stronie origin / masterPołącz gałąź funkcji z gałęzią główną.
Zresetuj gałąź główną do stanu pochodzenia.
Git traktuje teraz wszystkie zmiany jako zmiany niestacjonarne. Możemy dodać te zmiany jako jedno zatwierdzenie. Dodawanie. doda również nieśledzone pliki.
Odniesienie: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit
źródło
Najpierw wybierz zobowiązanie, po którym chcesz, aby wszystko miało nastąpić.
Zresetuj do wybranej głowy (wybrałem
HEAD@{2}
)git status
(tak dla pewności)Dodaj nowe zatwierdzenie
Uwaga:
HEAD@{0}
&HEAD@{1}
Są teraz scalane w 1 zatwierdzenie, można to zrobić również dla wielu zatwierdzeń.git reflog
powinien ponownie wyświetlić:źródło
Narzędzie do automatyzacji wielu zatwierdzeń w jedno
jak mówi Kondal Kolipaka . Korzystanie z „git rebase -i”
Logika „git rebase”
Używając "git rebase -i", git generuje plik git-rebase-todo w bieżącym katalogu .git / rebase-merge, a następnie wywołuje edytor git, aby umożliwić użytkownikom edycję pliku git-rebase-todo w celu przetworzenia. Narzędzie musi więc spełniać:
Zmodyfikuj domyślny edytor git
Dlatego narzędzie musi zmienić edytor git i przetworzyć plik git-rebase-todo. Narzędzie korzystające z Pythona poniżej:
Ref: https://liwugang.github.io/2019/12/30/git_commits_en.html
źródło