Integracja współbieżnych zmian w git przy użyciu rebase.

0

Cześć.
Obecnie zajmowałem się dużym taskiem ( zmiany w całej aplikacji), który nagenerował bardzo dużo konfliktów. Zadanie robiłem długo, a w tym czasie na masterze wylądowało bardzo dużo zmian. Chyba się nieco zgubiłem w tym jak rozwiązać istniejący problem.
Flow jest dosyć klasyczne, tworząc branch odbijam się lokalnie od mastera, pushuję zmiany na origin a po zaakceptowanym pull requescie merguję lub rebase zesquashowanych commitów do origin/master.
Problem mam z tym, że obecnie mam bardzo duzo konfliktów do rozwiązania z masterem. Jak rozwiązać konflikty brancha z masterem przy użyciu rebase aby nie zaśmiecić historii, a raczej aby nie pakować całej historii mastera na zdalnego brancha i potem tego wszystkiego nie mergowac/reabsowac do mastera znowu.

Obecnie zrobiłem tak ( najprawdoodobniej źle)
a) Update lokalnego mastera przez rebase
b) Rebase feature brancha z master i rozwiązanie konfliktów ( tutaj na feature branch lokalny wkracza mi cała historia mastera ( czy commitów, które pojawiły się wyżej niż ostatnio wspólny mastera i brancha?)
c)Push brancha. Tutaj wciąż mi się posypały jakieś konflikty nie wiem czemu do końca. Rozwiązałem je i tym czasem gh pokazuje, że dalej są konflikty z masterem ( chyba namieszałem :D )

Tak już to zostawiłem, najprawdopodobniej będe tworzył nowy branch i cherrypickował poszczególne commity, aby odratować. Tak czy siak jak to powinno być zrobione?

1

Pierwsza rada: nie twórz mega branchy, używaj feature toggli i nie refaktoruj całego systemu na raz. A jak już musisz - niech nikt inny przy tym nie pracuje. Inaczej... jesteś głęboko w bagnie. Nic przyjemnego.

Zakładam, że wiesz co robisz, i że używacie mastera a nie np development brancha i stąd konflikty po pushu, bo zrobiłeś merga mastera a feature wskazuje na develop.

1a. Skoro pracujesz na feature branchu nie powinieneś mieć żadnych zmian na masterze. Zwykły pull mastera powinien załatwić sprawę. Jeżeli nie... to tworzysz sobie potworka i utrudniasz dalsze kroki (czy to rebase czy merge mastera teraz nie będzie dokładnie tym samym czym chcesz by był).
1b. Jeżeli już tak wtopiłeś - najłatwiej usuń lokalnego mastera i pobierz z origin. Będzie 'czysty i aktualny'. (Tak, da się inaczej, na przykład zrobić reset do danego commita, ale nie wiem czy to nie jest trudniejsze dla Ciebie w tym momencie). Proste rozwiązania. Oczywiście jeśli masz tam jakieś zmiany - których nie powinieneś, możesz zrobić z nimi stasha, lub skopiuj sobie tego potwora do osobnego brancha - później sobie z niego wyciągniesz co chcesz.
2.Mając tak czystego mastera mógłbyś w teorii teraz (nie możesz bo już rebase zrobiłeś):
a) wejść na swój feature branch i zrobić merge master, rozwiązać konflikty (porządnie, inaczej się pojawią przy pushu), commit i push. Nie będzie już konfliktów (chyba, że pojawią się nowe, taki urok mega branchy, są %^%$^$%^%$).
Dzięki temu masz historię swoich zmian
b) zrobić rebase, skoro Ci na tym zależy żeby nie było merge commitów - jak wyżej, wchodzisz, robisz rebase, rozwiązujesz konflikty(porządnie, inaczej się pojawią przy pushu) i push. Nie będzie już konfliktów (chyba, że pojawią się nowe, taki urok mega branchy, są %^%$^$%^%$).

Problem w tym, że prawdopodobnie masz już miszmasz na swoim feature branchu po swojej akcji. Możesz spróbować otworzyć ją na osobnym nowym feature branchu... v2 i zrobić jak wyżej.

0

@AreQrm: nie jestem pewien czy dobrze rozumiem, czy może źle opisałem. Ja zrobilem rebase feature onto master w sensie dociągnąłem mastera do feature. Mastera mam czystego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1