Mam następującą sytuację:
- Stworzyłem
clone
(Y) z głównego repozytorium (X), ponieważ na Y pracowało wiele osób, a my nie robiliśmyrebase
tylkomerge
s. Kiedy chcemy dostarczyć (push
) Y do X, chcielibyśmy zrobićrebase
, aby wszystko było ładne i czyste
Problem polega na tym, że kiedy to robimy, rebase
jesteśmy proszeni o wykonanie wszystkich połączeń, które już wykonaliśmy w poprzednich merge
krokach. Czy istnieje rozwiązanie tego problemu, oprócz tego, które oznacza ponowne wykonanie scalenia?
Spodziewałem się, że będzie to całkiem proste, ponieważ rozwiązaliśmy już konfliktowe połączenia.
git
merge
rebase
git-rebase
INS
źródło
źródło
Odpowiedzi:
Rebasing w celu uzyskania „czystej” historii jest przeceniany. Najlepszym sposobem, jeśli chcesz zachować historię, jest po prostu scalenie zamiast ponownego bazowania. W ten sposób, jeśli kiedykolwiek będziesz musiał wrócić do wersji, będzie ona dokładnie taka sama, jak ta, którą przetestowałeś podczas programowania. To również rozwiązuje problem dotyczący wcześniej rozwiązanych konfliktów scalania.
Jeśli nie zależy Ci na zachowaniu historii, możesz utworzyć nową gałąź poza wzorcem, sprawdzić ją, a następnie
git read-tree -u -m dev
zaktualizować drzewo robocze, aby pasowało dodev
gałęzi. Następnie możesz przypisać wszystko do jednego dużego zatwierdzenia i połączyć go z głównym w normalny sposób.źródło
--squash
. Zwykłe scalanie doda N lub N + 1 zatwierdzeń do mastera, jeśli w gałęzi było N zatwierdzeń. Powyższa sugestia, lubmerge --squash
, zawsze doda tylko jedno zatwierdzenie do mastera.git merge --squash
jest teraz moim preferowanym sposobem zmiany bazy po dużej ilości pracy i wielu połączeniach ( zobacz tę odpowiedź ). Jeśli gałąź, nad którą pracujesz, jest wywoływanamy-branch
i chcesz zmienić bazę,master
wykonaj następujące czynności:źródło
Dwie uwagi:
git rerere
, co jest zrobione w tego rodzaju sytuacjach.Zobacz więcej na
git rerere
.źródło
Możesz wziąć wszystkie zmiany w swojej gałęzi i umieścić je w nowym zatwierdzeniu w
master
następujący sposób:Następnie przygotuj swoje pliki i zatwierdź.
źródło
Jeśli chodzi o odtwarzanie konfliktów scalania, możesz użyć git rerere, aby zachować bazę danych, w jaki sposób konflikty scalania zostały już rozwiązane, dzięki czemu wykonanie ponownego bazowania, które powoduje te same konflikty, będzie wymagało automatycznego wykonania pracochłonnych części.
https://hackernoon.com/fix-conflicts-only-once-with-git-rerere-7d116b2cec67
git config --global rerere.enabled true
Jedyną rzeczą, na którą należy zwrócić uwagę, jest to, że jeśli rozwiązałeś coś niepoprawnie , następnym razem zostanie to automatycznie zablokowane i możesz nie zdawać sobie z tego sprawy.
Bardziej formalna dokumentacja tutaj: https://git-scm.com/docs/git-rerere
źródło