2010-08-05 5 views
9

Pochodzące z svn tło: prawie nigdy nie rozgałęziony, ze względu na (brak) prędkości przełączania i godzinę lub więcej zajęło scalić gałęzie z powrotem do bagażnika. Czasami, gdybym musiał poprawić problem na stronie internetowej, wprowadziłbym zmiany w bagażniku (który byłby zgodny z poprzednimi zmianami lub nowymi funkcjami), a następnie przejdę do tego pliku i po prostu zrobię "svn up path/to/filename "i zaktualizowałby tylko ten plik, naprawiając problem, ale oszczędzając pozostałe pliki.zrozumienie git-pick-pick

Pojęciowo nie wydaje się to możliwe w git (lub konieczne); czy jest to zorganizowana inscenizacja i pogrupowane commity, które pozwalają na zbiór owoców? Mogę więc zmienić konkretny obszar witryny i zatwierdzić go jako grupę, zamiast robić to, jak pracuję z svn, i przejść około dnia pracy i dotknąć plików po całym pliku wsadowym na raz?

Odpowiedz

10

Co prawdopodobnie chcesz zrobić w tym przypadku, należy utworzyć nową gałąź dla poprawki, rozgałęziając się od wspólnego przodka wszystkich gałęzi, które będą wymagać poprawki. Na przykład załóżmy, że masz kilka utrzymany komunikaty wraz z aktualnym rozwoju:

- X - o - o - o - o - o - o - o - o - o (master) 
    \      \ 
    o - o - o (release A) o - o (release B) 

Jeśli trzeba wykonać poprawki, które będą miały zastosowanie do obu wersjach utworzyć oddział począwszy od popełnienia oznaczonym X. Commit swoją poprawkę , a następnie połącz tę gałąź we wszystkie trzy gałęzie.

Można wybierać z wiśni, ale tu jest dobra zasada dotycząca wyboru czereśni: nie. Jedyny przypadek, w którym chcesz wybrać cherry, to sytuacja, w której źle zarządzasz swoimi oddziałami. W takim przypadku może to oznaczać, że wprowadziłeś poprawkę do wzorca, zamiast odpowiednio rozgłaszać ją z wcześniejszego punktu, a ludzie już pobrali aktualizacje do opanowania, więc nie możesz tego zmienić. Musiałbyś wybrać wiśnia, by dostać to na dwóch gałęziach wydania. Ale oczywiście powinieneś po prostu zarządzać swoimi oddziałami w pierwszej kolejności i nigdy nie będziesz musiał wybierać wiśni. (Tak, to się zdarza czasami, takie jest życie.)

+0

To jest niesamowite. Po prostu grałem z "git branch foo old-merge-sha1" i to jest po prostu niesamowite. – Hans

+0

Czy najlepiej jest utworzyć rozgałęziony wzorzec dla "FeatureA", a następnie odłączyć ponownie "FeatureA" ponownie dla tematu (tematów), łącząc je w FeatureA, gdy są gotowe, ale nie dotykając wzorca, dopóki cały FeatureA nie będzie gotowy, kiedy czy połączyć FeatureA w master? W tej chwili (w svn) jeśli pracuję nad czymś, co zajmie kilka tygodni i potrzebuję poprawki, robię to, co opisałem w moim pytaniu (svn up path/to/filename), a następnie przejdź dalej. Rozgałęzianie Gita wydaje się być poleceniem "scalaj często", ale co jeśli nie * chcę * master/trunk dotknięty, dopóki nie będzie gotowy, więc mogę swobodnie aktualizować stronę internetową. – Hans

+2

@Hans: Nie łączą się, dopóki, cóż, nadszedł czas, aby połączyć. Zwykle master jest bieżącą stabilną gałęzią, więc możesz przesunąć częściową, ale stabilną funkcję, jeśli chcesz, ale ogólnie powinieneś scalać tylko kompletne rzeczy. I całkiem możliwe jest posiadanie kilku stabilnych gałęzi o różnych smakach - jeden dla danego relase (dla twojej witryny), jeden dla bieżących stabilnych testów, jeden dla niestabilnego testowania ... po prostu upewnij się zawsze scalać we właściwym kierunku (temat -> feature -> master lub unstable -> stable). – Cascabel