Jak mogę bezboleśnie połączyć rozbieżne gałęzie funkcji?

0

Pytanie

Mam otwarty pr w oddziale pod nazwą feature-b to wkrótce będzie łączona z main. Tym nie mniej, napisałem to, aby wspierać swoją feature-a oddział, który trwa. Chcę kontynuować pracę nad feature-a i korzystać z tej pracy, którą wykonałem w feature-b przed tym, jak został połączony z main.

Jak najlepiej to zrobić? Nasze połączenie z main rozwalone, więc wszystkie commity na feature-b będzie przepisany jako jeden commit, gdy jest on połączony w main. Dlatego, relokacja feature-a na feature-b teraz doprowadzi do przyszłego konfliktu bólu, kiedy сольюсь feature-a Dla main bo jedne i te same zmiany zostaną wprowadzone w różne zmiany.

Jaki jest najlepszy sposób dla mnie, aby uwzględnić zmiany wprowadzone w feature-b w moim feature-a gałąź, minimalizując przyszłą ból, kiedy w końcu объединюсь feature-a Dla main?

Zaktualizować

Poszedłem dalej i:

  1. Przeniesiony feature-a na feature-b
  2. Wprowadzono więcej zmian (tylko 1 blokada) w feature-a podczas gdy feature-b było
  3. Squash-слитый feature-b jak tylko został zatwierdzony (żadnych dalszych zmian nie jest wymagane, więc feature-a już dokładny kod, który został połączony)
  4. Wyciągnął ostatnią main i перебазировался feature-a na dodatek

Jak i obawiali się, git skarży się, że kilka plików "oba zmodyfikowane" lub "oba dodane". To samo w sobie byłoby to trochę irytujące, ale to łatwo naprawić. Co sprawia, że jest to bardzo mylące, zwłaszcza jeśli minęło trochę czasu-tak to komentarze korespondencji seryjnej w plikach.

Nawet pomimo faktu, że oba main i feature-a gałęzie mają jeden i ten sam kod we wszystkich plikach, dostaję bardzo irytujące zachowanie:

  1. Dla plików "oba dodane" są dodawane komentarze korespondencji seryjnej do "TYTUŁU (chwilowa)" i "rodzic #HASH (komunikat w sprawie zatwierdzenia)". Jestem zmuszony wybrać to jedno, to drugie, choć są zupełnie takie same!
  2. Dla obu zmienionych plików to jeszcze gorzej. "NAGŁÓWEK (chwilowa)" pokazuje prawidłowy kod. Jednak w dziale "rodzic #HASH (komunikat w sprawie zatwierdzenia)" pokazuje połowa kodu. Znowu, pomimo faktu, że w obu gałęziach jest cały kod!! Ja nie żartuję, biorąc "przychodzący zmiana" (jak to określono VS Code), to usuń kod, który znajduje się w obu gałęziach!

Gdybym nie wprowadził te zmiany w szybkiej sekwencji, byłem kompletnie zagubiony i zdezorientowany tym, że pokazuje mi, że jest git. To naprawdę się zdarzyło kilka razy w przeszłości, ale nie mogłem zrozumieć, co się dzieje nie tak. Teraz, kiedy odtworzyłem to i sprawdziłem zachowanie, jestem zupełnie zdezorientowany co do tego, co sprawia, że jest git i jak ludzie radzą sobie z tym scenariuszem.

AKTUALIZACJA 2

Dobrze, ja w pewnym sensie rozumiem, dlaczego chciał usunąć kod teraz. To dlatego, że zmiany, których dokonałem w feature-b byli w kilku коммитах, i te zmiany okazały się rozbierać na części, gdy połączenie w main stało się. Jest to bez wątpienia źródło bólu, i dlatego staram się wymyślić jakiś sensowny pracy.

git
2021-11-23 23:26:24
1

Najlepsza odpowiedź

0

Nie jestem pewien, że ostateczna fuzja/squash będzie brudny. Jeśli jedno i to samo zmiana jest na różne zmiany, być może, Git będzie w stanie to wykryć i będzie zadowolony z tego.

Jeśli naprawdę myślisz, że to będzie brudne, to, co można zrobić, to:

  1. Перебазируйте swój feature-a oddział z feature-b teraz, aby twój feature-a oddział obejmuje teraz całą funkcji B i wykonywanej funkcji A, która jest tym, co jest potrzebne do wykonywania swojej pracy.
  2. Po feature-b łączy w main oddział, перебазировка feature-a na commit bezpośrednio przed zgnieciony commit, który zrobili dla funkcji B. Wszystko musi pójść gładko.
  3. Na twoje feature-a oddział używać git reset --soft X gdzie X czy hash zatwierdzenia dla раздавленной zatwierdzenia, którą zrobili dla funkcji B. Następnie użyj git commit aby wziąć na siebie zobowiązanie. Teraz masz skompresowany (blokada, której zawartość wynosi bieżącego stanu pracy nad funkcją A. Ale rodzicem tego commita jest commit, który dodaje funkcję B w główną gałąź, więc w przeciwieństwie do tego commita od tego rodzica będzie zawierać tylko funkcję A. Na tym etapie można kontynuować pracę nad funkcją A lub po prostu poprosić o połączenie.

Przy okazji, jestem całkiem pewny, że to wszystko nie miało by być tak dziwne, gdyby twoja organizacja wykorzystała fuzji zamiast relokacji do dodawania obiektów w główną gałąź. I wtedy byłoby korzystne zachować rzeczywistą historię kodu, nad którym pracowali, zamiast po prostu zapisać tę sztuczną historię.

2021-11-23 23:52:54

Żeby było jasne, nie używamy reline - używamy zgniecione commit. I jestem na 99% pewien, że wszystko będzie tak samo brudne, jak próbowałem to w przeszłości. Git strasznie plącze się z powodu różnych commits wpływające na te same zmiany. Jestem gotów spróbować jeszcze raz, choć i zgłosić :)
me--

@me-jestem prawie pewien, że zgniecione commit-to relokacja
evolutionxbox

To oznacza poruszanie się gałęzi tak, aby zaczynała się z innego punktu, który przepisuje historię jej rozwoju. Kompresja oznacza przekształcenie całej gałęzi w jeden commit, odrzucenie historii tego, jak został zaprojektowany, za wyjątkiem końcowego wyniku.
David Grayson

@DavidGrayson Proszę zapoznać się z moim aktualnym zagadnieniem dla wyjaśnienia zachowania, które widzę u git.
me--

OK. Krok 4 ("Wyciągnął ostatnią podstawową i zaktualizowanych funkcji-a na niej") - to jest to, co sprawia ci ból, dlatego nie polecam tego robić. Zamiast wykonać krok 4 w swoim pytaniu, spróbuj wykonać kroki 2 i 3 z mojej odpowiedzi.
David Grayson

Dziękuję @DavidGrayson. To wydaje się takie czasochłonne ...
me--

Jak już powiedziałem w swojej odpowiedzi, problem jest spowodowany tym, że człowiek to czyta i ściska, a nie po prostu wylewa.
David Grayson

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................