Zarówno rebase
(i cherry-pick
) i merge
mają swoje zalety i wady. Popieram merge
tutaj, ale warto zrozumieć oba. (Zajrzyj tutaj, aby znaleźć alternatywną, dobrze uzasadnioną odpowiedź z wyszczególnieniem przypadków, w których rebase
jest preferowany).
merge
jest korzystniejszy cherry-pick
i rebase
na kilka powodów.
- Solidność . Identyfikator SHA1 zatwierdzenia identyfikuje go nie tylko sam w sobie, ale także w odniesieniu do wszystkich innych zatwierdzeń, które go poprzedzają. Daje to gwarancję, że stan repozytorium na danym SHA1 jest identyczny we wszystkich klonach. Teoretycznie nie ma szans, że ktoś zrobił coś, co wygląda jak ta sama zmiana, ale w rzeczywistości psuje lub porywa twoje repozytorium. Możesz wybierać poszczególne zmiany i są one prawdopodobnie takie same, ale nie masz gwarancji. (Jako drugorzędny drugorzędny problem nowe zatwierdzone wybory zajmą dodatkowe miejsce, jeśli ktoś inny wybierze ponownie w tym samym zatwierdzeniu, ponieważ oba będą obecne w historii, nawet jeśli kopie robocze będą identyczne.)
- Łatwość użycia . Ludzie zazwyczaj
merge
dość łatwo rozumieją przebieg pracy. rebase
jest zwykle uważany za bardziej zaawansowany. Najlepiej zrozumieć oba, ale ludzie, którzy nie chcą być ekspertami w zakresie kontroli wersji (co z mojego doświadczenia obejmowało wielu kolegów, którzy są cholernie dobrzy w tym, co robią, ale nie chcą spędzać dodatkowego czasu), mają łatwiej czas po prostu się łączy.
Nawet przy dużym obciążeniu roboczym rebase
i cherry-pick
nadal są przydatne w określonych przypadkach:
- Jednym minusem
merge
jest zagracona historia. rebase
Zapobiega rozproszeniu długiej serii zatwierdzeń w twojej historii, tak jak w przypadku okresowego łączenia zmian innych. To w rzeczywistości jego główny cel, gdy go używam. To, na co chcesz bardzo uważać, to nigdy nie rebase
kodować kodu udostępnionego innym repozytoriom. Kiedy push
edycja jest zatwierdzona, ktoś inny mógł ją zatwierdzić, a ponowne bazowanie w najlepszym wypadku spowoduje rodzaj duplikacji omówiony powyżej. W najgorszym wypadku możesz skończyć z bardzo zdezorientowanym repozytorium i subtelnymi błędami, które zajmie ci dużo czasu.
cherry-pick
jest przydatny do próbkowania niewielkiego zestawu zmian z gałęzi tematycznej, którą w zasadzie postanowiłeś odrzucić, ale zdałeś sobie sprawę, że jest kilka przydatnych elementów.
Jeśli chodzi o łączenie wielu zmian w jedną: jest to o wiele prostsze. Połączenie wielu zestawów zmian może być bardzo uciążliwe, gdy zaczniesz mieć ich wiele. Rozdzielczość scalania w git (oraz w Mercurial i na Bazaar) jest bardzo dobra. Przez większość czasu nie będziesz mieć problemów z łączeniem nawet długich oddziałów. Generalnie łączę wszystko naraz i tylko w przypadku dużej liczby konfliktów wykonuję kopię zapasową i ponownie uruchamiam fragmentarycznie scalanie. Nawet wtedy robię to w dużych kawałkach. Jako bardzo realny przykład miałem kolegę, który miał 3 miesiące zmian do scalenia i dostałem około 9000 konfliktów w 250000 bazach kodu linii. Naprawiliśmy scalanie wartości jednego miesiąca: konflikty nie narastają liniowo, a robienie tego w kawałkach skutkuje dalekomniej niż 9000 konfliktów. Wciąż było dużo pracy, ale nie tyle, ile próba zrobienia tego pojedynczo.
Moim zdaniem wybieranie wiśni powinno być zarezerwowane na rzadkie sytuacje, w których jest to wymagane, na przykład, jeśli dokonałeś poprawki bezpośrednio w gałęzi „master” (trunk, main gałąź programistyczna), a następnie zdałeś sobie sprawę, że należy ją również zastosować do „. Powinieneś oprzeć przepływ pracy albo na scalaniu, albo na rebase (lub „git pull --rebase”).
Proszę pamiętać, że wybranie Cherry lub rebased jest inne z punktu widzenia Git (ma inny identyfikator SHA-1) niż oryginał, więc różni się od zatwierdzenia w zdalnym repozytorium. (Rebase zwykle sobie z tym radzi, ponieważ sprawdza identyfikator łatki, tj. Zmiany, a nie identyfikator zatwierdzenia).
Również w git możesz łączyć wiele gałęzi jednocześnie: tak zwane scalanie ośmiornic . Zauważ, że scalenie ośmiornicy musi się udać bez konfliktów. Niemniej jednak może być przydatne.
HTH.
źródło
git blame
poprawki błędów : aby znaleźć zatwierdzenie, które wprowadziło błąd, igit branch --contains
ustalić, gdzie połączyć gałąź. Bardziej szczegółowo opisane w tym pościeRebase i Cherry-pick to jedyny sposób na zachowanie czystej historii zatwierdzeń. Unikaj używania scalania i unikaj tworzenia konfliktów scalania. Jeśli używasz gerrit, ustaw jeden projekt, aby Scalić, jeśli to konieczne, a jeden projekt w tryb wyboru i spróbuj sam.
źródło