2013-01-09 11 views
10

Wyobraź sobie sytuację, w której masz dwie gałęzie tego samego projektu, a jedna część pierwszego oddziału jest dramatycznie refaktoryzowana nad drugą. Ale przez pewien czas musisz utrzymywać obie gałęzie w stanie funkcjonalnym, więc robisz poprawki błędów i istotne dodatki do ich obu, czasem w nie symetryczny sposób. I w pewnym momencie przychodzi chwila, w której trzeba scalić refaktoryzowaną gałąź na oryginalną. Jaka jest najlepsza technika do zastosowania w takiej sytuacji? Czy nadal można zachować historię w czystości?Git: Jak prawidłowo połączyć dwie funkcjonalne i całkiem różne gałęzie?

Co ważniejsze, jaka powinna być moja początkowa strategia w takim scenariuszu?

Odpowiedz

8

Ponieważ zadaniem było po prostu użyć innego oddziału zamiast master, można po prostu usunąć master oddział całkowicie lub zmienić jego nazwę na powiedzmy - legacy, a następnie podjąć kolejny oddział i zmień jego nazwę na master. to jest to! Oto rzeczywiste polecenia, które musisz wykonać, aby osiągnąć cel lokalnie i na GitHub:

git branch -m master legacy    # rename local master to legacy 
git checkout legacy 
git branch -m another_branch master  # another_branch will be our new master 

Lokalnie skończyliśmy. Jednak nie można po prostu usunąć gałęzi master na GitHub. Najpierw musisz przyjąć inny oddział jako domyślny. Można to zrobić w repozytorium Settings > Default Branch. Po wykonaniu tej czynności można przystąpić:

git push origin :master     # remove master on GitHub 
git push origin master     # push out our new master branch 
git push origin legacy     # push our legacy branch too 

Następnie wróć do Settings > Default Branch i włączyć domyślną gałąź z powrotem do master. Dodatkowo możesz usunąć wszystkie dodatkowe gałęzie, które mogłeś utworzyć podczas procesu migracji.

Ewentualnie, jeśli chcesz zapisać wszystkie swoje działania w historii, sprawdź poprawną odpowiedź here.

+1

A jak usunąć "dziedzictwo"? –

+1

Chodziło o to, aby zachować dziedzictwo, na wszelki wypadek. Jeśli nie potrzebujesz dziedzictwa, możesz po prostu usunąć go jako dowolny inny oddział: http://stackoverflow.com/questions/2003505/how-do-i-delete-a-git-branch-both-locally-and- in-github – jayarjo

+0

Fantastyczne, dziękuję. – Dogweather

2

Skoro masz 2 gałęzie, jedno jest znacząco refaktoryzowane, a ty utrzymujesz oba ... powiedziałbym, że Git nie pomoże ci w magiczny sposób. Aby git pomógł, poprawki/zmiany, które zastosujesz do oddziału 1, muszą być podobne do gałęzi 2 (ale nie do końca takie same).

Ponieważ został refaktoryzowany, kod może nie być podobny, chyba że nowy kod jest zmodularyzowany, aby był taki sam w obu gałęziach.

Co powinieneś zrobić w pierwszej kolejności?

  • dodać kilka testów jednostkowych i/lub integracji kodu testowego do pierwotnego oddziału
  • wykonujących te same testy integracyjne na 2. oddziału
  • dla nowych zmian dodać testy
  • wtedy może zweryfikować zmiany pracy dla obu gałęzi

Aktualizacja: do zarządzania zmianami w obu gałęziach, prawdopodobnie wystarczy procesu, takie jak: - działa głównie na oddział-r efactored - scalanie każdej "historii" lub elementu pracy z dziedziczeniem-dziedziczeniem, tak jak jest to robione

Drugi krok to, jak sądzę, wiele pracy, jeśli kod jest zbyt różny między oddziałami. Jeśli musisz utrzymywać obie gałęzie, spróbuj zamknąć nowy kod w bibliotece, która może być używana w obu gałęziach. To sprawi, że scalenia z jednego oddziału do drugiego będą czystsze.

+2

Mam testy jednostkowe. To nie była moja sprawa.Chciałem tylko wiedzieć, czy istnieje lepsza strategia, aby uzyskać czystszą historię git. – jayarjo

Powiązane problemy