Byłby prosty sposób, który oddzieliłby twój nowy rozwój od głównej gałęzi, nie wprowadzając cię w tę niefortunną sytuację: każda zmiana z pnia powinna być codziennie łączona z gałęzią programistów . (Czy twój klient był tak krótkowzroczny, że nie mógł przewidzieć, że pewnego dnia twój oddział będzie musiał zostać ponownie przeniesiony do głównej linii?)
W każdym razie najlepszym podejściem jest IMHO, próbujące powtórzyć to, co powinno się wydarzyć z pierwszej ręki:
- zidentyfikować semantykę zmian w linii głównej dla dnia 1 po utworzeniu gałęzi. Zastosuj je do bieżącej bazy kodu tak dobrze, jak to możliwe. Jeśli była to „zmiana lokalna”, powinna być prosta, jeśli była to „refaktoryzacja przekrojowa”, taka jak zmiana nazwy powszechnie używanej klasy, zastosuj ją w semantycznie równoważny sposób do bieżącej bazy kodu. Mam nadzieję, że w tym roku nie wprowadzono sprzecznych przekrojowych zmian w bazie kodu w „twojej” gałęzi, w przeciwnym razie może to stać się prawdziwą łamigłówką
- przetestować wynik (czy wspominałem, że do tego zadania potrzebujesz dobrego zestawu testów)? Napraw wszystkie błędy wykryte podczas testu
- teraz powtórz ten proces dla zmian w linii głównej dla dnia 2, następnie dnia 3 i tak dalej.
Może to działać, gdy zespoły ściśle przestrzegają klasycznych zasad kontroli wersji („zatwierdzaj tylko możliwe do kompilacji, przetestowane stany” i „melduj się wcześnie i często”).
Po 365 powtórzeniach (lub 250, jeśli masz szczęście i możesz powiązać pracę na weekendowe zmiany), będziesz prawie gotowy (prawie, ponieważ musisz dodać liczbę zmian, które będą miały miejsce w głównej linii podczas okresu integracji ). Ostatnim krokiem będzie ponowne scalenie zaktualizowanej gałęzi programisty w pień (abyś nie stracił historii pnia). To powinno być łatwe, ponieważ technicznie powinno to być jedynie zastąpienie dotkniętych plików.
I tak, mówię poważnie, prawdopodobnie nie ma na to skrótu. Może się okazać, że „porcje dzienne” mogą być czasami zbyt małe, ale nie spodziewałbym się tego, chyba bardziej prawdopodobne, że porcje dzienne mogą okazać się zbyt duże. Mam nadzieję, że twój klient naprawdę dobrze za to płaci i że jest to dla niego tak drogie, że wyciągnie wnioski z porażki.
Powinienem dodać, że możesz tego spróbować także z przełączonymi stronami - reintegrując zmiany z gałęzi w małych porcjach do linii głównej. Może to być prostsze, gdy w gałęzi dewelopera wprowadzono znacznie mniej zmian niż w linii głównej lub większość zmian nastąpiła w nowych plikach źródłowych, które obecnie nie są częścią linii głównej. Można to postrzegać jako „przenoszenie” funkcji z produktu A (gałąź programistów) do nieco innego produktu B (aktualny stan pnia). Ale jeśli większość przekrojowych refaktoryzacji została przeprowadzona w linii głównej i mają one wpływ na twój nowy kod (kolizje scalania 6500 wydają się być na to dowodem), może być łatwiej, tak jak to opisałem na początku.