Moja historia Gita wygląda tak:
Chciałbym zmiażdżyć fioletowe commity w jedną. Nie chcę ich już nigdy widzieć w moim dzienniku zmian.
Próbowałem zrobić git rebase -i 1
, ale mimo że 1
znajduje się na niebieskiej gałęzi (por. Zdjęcie), nadal widzę każde zatwierdzenie na mojej fioletowej gałęzi.
Jak mogę całkowicie usunąć fioletową gałąź (z dziennika zatwierdzeń)?
git
git-merge
git-rebase
Benjamin Toueg
źródło
źródło
Odpowiedzi:
Zrób
git rebase -i <sha before the branches diverged>
to, aby usunąć zatwierdzenie merge, a dziennik będzie jednym wierszem, tak jak chciałeś. Możesz także usunąć wszystkie zmiany, których już nie chcesz. Powodem, dla którego twoja rebase nie działał, był fakt, że nie cofałeś się wystarczająco daleko.OSTRZEŻENIE: w ten sposób przepisujesz historię. Robienie tego ze zmianami, które zostały przeniesione do zdalnego repozytorium, spowoduje problemy. Zalecam robić to tylko z lokalnymi zatwierdzeniami.
źródło
git rebase
a zostaną one usunięte.Rozpoczynając od repozytorium w stanie pierwotnym
Aby usunąć merge, zatwierdzić i zgnieść gałąź do pojedynczego zatwierdzenia w głównej linii
Użyj tych poleceń (zastępując 5 i 1 wartościami SHA odpowiednich zatwierdzeń):
Aby zachować zatwierdzenie scalające, ale zgnieść zmiany gałęzi w jedną:
Użyj tych poleceń (zastępując 5, 1 i C wartościami SHA odpowiednich zatwierdzeń):
Aby usunąć zatwierdzenie scalające i zastąpić je indywidualnymi zatwierdzeniami z gałęzi
Po prostu zrób (zastępując 5 wartością SHA odpowiedniego zatwierdzenia):
I wreszcie, aby całkowicie usunąć gałąź
Użyj tego polecenia (zastępując C i D SHA odpowiednich zatwierdzeń):
źródło
git rebase 5 master
przypadku, dlaczego nie jest to zamówienie „ABC 1 2 3 4 5 D ...”?master
nie mają nic wspólnego z,5
i umieszcza je na wierzchu5
. Zatwierdzenie wC
nie jest częścią linii5
, jest pierwszym, które zostanie przeniesione na górę5
.git rebase C 5; git rebase 5 master
Aby po prostu usunąć polecenie scalenia
Jeśli wszystko, co chcesz zrobić, to usunąć zatwierdzenie merge (2), aby wyglądało na to, że nigdy się nie wydarzyło, polecenie jest po prostu następujące
git rebase --onto <sha of 1> <sha of 2> <blue branch>
A teraz fioletowej gałęzi nie ma w ogóle w dzienniku zmian koloru niebieskiego i znowu masz dwie oddzielne gałęzie. Następnie możesz samodzielnie zmiażdżyć fiolet i wykonywać dowolne inne manipulacje bez konieczności scalania.
źródło
Istnieją dwa sposoby rozwiązania tego problemu w zależności od tego, czego chcesz:
Rozwiązanie 1 : Usuń fioletowe zatwierdzenia, zachowując historię (na wypadek, gdybyś chciał cofnąć)
-m 1
określa, którą linię nadrzędną wybraćPurpurowe zatwierdzenia nadal będą istniały w historii, ale ponieważ zostały przywrócone, nie zobaczysz kodu z tych zatwierdzeń.
Rozwiązanie 2 : Całkowicie usuń fioletowe zatwierdzenia (zmiana destrukcyjna, jeśli repozytorium jest udostępniane)
i usuń (usuń linie) odpowiadające fioletowym zatwierdzeniom.
Byłoby to mniej skomplikowane, gdyby zmiany nie były wykonywane po scaleniu. Dodatkowe zatwierdzenia zwiększają ryzyko konfliktów podczas
revert/rebase
.źródło
1 - 1 = 0
. Ale jeśli następnie zmienisz bazę fioletowych zatwierdzeń, pozostawisz cofniętą łatkę, chyba że ją również zmienisz. Jeśli tego nie zrobisz, to tak, jakbyś zastosował się-1
do swojej historii, a nie0
, więc zostawisz zmiany, których nie chcesz.