Jak utrzymać synchronizację gałęzi git z master


275

W chwili, gdy git wkracza, nie mogę znaleźć najlepszego rozwiązania dla poniższych.

Istnieją dwie gałęzie, jedna o nazwie master, a druga o nazwie mobiledevices support . Chcę zachować wsparcie mobiledevices jako ciągłą gałąź, która zostanie połączona / zsynchronizowana z gałęzią master, gdy wsparcie mobiledevices będzie stabilne. Spowodowałoby to scalenie zmian z obsługi urządzeń mobilnych w pomoc główną, ale także przeniesienie wszystkich zmian z obsługi urządzeń mobilnych do obsługi urządzeń mobilnych, tak aby gałąź mogła być dalej rozwijana, a funkcje ulepszone lub poprawione. To musi współpracować z centralnym repozytorium i wieloma programistami.

Proszę podać przykład podobnych przepływów pracy, z których korzystają inni ludzie, lub po prostu powiedz mi, czy ten pomysł jest głupi, i powinienem rozważyć inne opcje. W tej chwili przepływ pracy wydaje się być poprawny, ale po prostu nie wiem, jak mogę sprawić, aby git działał w ten sposób.

Dzięki, cała pomoc bardzo doceniona.

Aktualizacja 1: Jeśli miałbym scalić wzorzec z obsługą urządzeń mobilnych i obsługę urządzeń mobilnych w urządzeniach głównych, czy otrzymuję replikowane zatwierdzenia w obu oddziałach. Lub jest wystarczająco inteligentny, aby zorientować się, że wyciągnąłem najnowsze zmiany z gałęzi A do gałęzi B i dodałem scalenie zatwierdzenia C do gałęzi B. I wyciągnąłem najnowsze zmiany z gałęzi B do gałęzi A i dodałem scalenie zatwierdzenia D do gałęzi ZA?

Zamierzałem opublikować zdjęcie, ale nie mam dla niego wystarczającej reputacji, więc sądzę, że poniższa ilustracja będzie wystarczająca. Dwie gałęzie pracują nieprzerwanie, często łączą się w obie strony. Kluczową rzeczą, której nie jestem pewien, jest to, w jaki sposób git będzie odtwarzał zatwierdzenia i czy wypełni oba gałęzie zatwierdzeniami z drugiego oddziału po scaleniu, czy też pozostanie czysty. Używałem wcześniej bazy, ale wydaje się, że kończy gałąź i wstawia wszystkie zatwierdzenia do mastera, albo zrobiłem to źle. Dzięki za pomoc do tej pory.

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L

1
Jeśli tak jak ja szukałeś tego, jak to zrobić za pomocą klienta GitHub : help.github.com/articles/merging-branches
cregox

1
To pytanie uratowało mi życie na wieki; Dziękujemy za wielki wysiłek poświęcony na zadawanie tego cudownego pytania @Mr. EZEKIEL
DJphy

Jeśli pracujesz nad widelcem, musisz postępować zgodnie z help.github.com/articles/syncing-a-fork
koppor

Odpowiedzi:


416

tak, po prostu zrób

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

aby utrzymać mobiledevices support w synchronizacji z master

wtedy, gdy jesteś gotowy, aby wesprzeć urządzenia mobilne w master, najpierw połącz w master jak wyżej, a następnie ...

git checkout master
git merge mobiledevicesupport
git push origin master

i to wszystko.

zakłada się tutaj, że mobilexxx to gałąź tematyczna z pracą, która nie jest jeszcze gotowa do przejścia do głównej gałęzi. Tak więc łączymy się w mistrza tylko wtedy, gdy wsparcie mobilne jest w dobrym miejscu


Wydaje mi się to rozsądne, chyba nie jestem pewien, jak brudne byłoby uczynienie historii zatwierdzeń, zaktualizuję moje pytanie o przykład tego, co moim zdaniem się wydarzy.
Pan EZEKIEL

1
Będziesz miał sporo „zatwierdzeń scalania”, zasadniczo próbując rozwiązać różnice między gałęziami. jeśli martwisz się o to I jesteś jedynym korzystającym z gałęzi, zrób „git rebase master” zamiast „git merge master” I NIE NALEŻY PRZESUWAĆ ZOBOWIĄZAŃ DO ZDALNEGO ODDZIAŁU. Jeśli to zrobisz, zauważysz, że robisz dużo wypychania siły (git push --force) do wsparcia / mobiledevices support, ponieważ będziesz (prawdopodobnie) zawsze wysyłał, niezależnie od tego, historię zmian, które nie pasują do tego zdalny oddział ma. Więcej szczegółów tutaj git-scm.com/book/en/Git-Branching-Rebasing
concept47

Uważam, że to poprawna odpowiedź, brzmi dokładnie tak, jak tego chcę. Dodałem powyższą ilustrację, aby była nieco jaśniejsza, ale jeśli to, co mówisz, jest prawdą, to powinno działać dokładnie tak, jak chcę. Dziękuję Ci.
Pan EZEKIEL

2
Przeczytaj to, aby zrozumieć, dlaczego nie jest to szczególnie dobra rada: kentnguyen.com/development/visualized-git-practices-for-team/… . Zostało to napisane przez opiekuna Git, więc prawdopodobnie uczciwie jest powiedzieć, że wie, o czym mówi w odniesieniu do tego konkretnego tematu.
Dan Molding

2
Sprawia to, że historia zatwierdzeń jest nieporządna, zobacz moją odpowiedź zrób to przez rebase.
Gob00st

43

Ilekroć chcesz przenieść zmiany z mistrza do swojej gałęzi pracy, wykonaj git rebase <remote>/master. Jeśli są jakieś konflikty. rozwiązać je.

Kiedy twoja gałąź pracy jest gotowa, ponownie uruchom bazę, a następnie zrób git push <remote> HEAD:master. Spowoduje to zaktualizowanie gałęzi master na zdalnym (centralne repo).


3
Jakie są zalety / wady robienia tego w ten sposób zamiast w przyjętej odpowiedzi?
Hampus Ahlgren

33
Rozsądny, dopóki nie spędzisz 5 godzin w piekle
bazowym

21
Dzieje się tak tylko wtedy, gdy Twój oddział znajduje się w prywatnym repozytorium. Nigdy nie bazuj na czymś, co zostało popchnięte w górę. Oto dlaczego: git-scm.com/book/en/v2/…
Kleag

3
Problem polegający na tym, że rebasing jest przepisywaniem historii, polega na tym, że SHA zatwierdzonego rebasingu są zmieniane i dlatego nie możesz polegać na wynikach (np git branch --contains <commit>. ) .
jnns

13

Podejście concept47 jest właściwym sposobem na zrobienie tego, ale radzę połączyć się z opcją --no-ff, aby oczyścić historię zatwierdzeń.

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master

9

Tak, zgadzam się z twoim podejściem. Aby scalić obsługę urządzeń mobilnych w master, możesz użyć

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport

Podobnie możesz także połączyć master w mobiledevices support.

P: Jeśli łączenie krzyżowe stanowi problem, czy nie.

A. Cóż, zależy to od zatwierdzeń dokonanych w gałęzi mobile * i master od czasu ich ostatniej synchronizacji. Weźmy przykład: po ostatniej synchronizacji następujące zatwierdzenia zdarzają się w tych gałęziach

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E

Załóżmy teraz, że zatwierdzenie B dokonało pewnych zmian w pliku a.txt, a zatwierdzenie D również wprowadziło pewne zmiany w pliku a.txt. Przyjrzyjmy się teraz wpływowi każdej operacji łączenia,

git checkout master //Switches to master branch
git pull // Get the commits you don't have. May be your fellow workers have made them.
git merge mobiledevicesupport // It will try to add D and E in master branch.

Teraz możliwe są dwa rodzaje łączenia

  1. Scalanie do przodu
  2. Prawdziwe scalenie (wymaga ręcznego wysiłku)

Git najpierw spróbuje połączyć FF, a jeśli stwierdzi, że konflikty nie zostaną rozwiązane przez git. Nie udaje się połączyć i prosi o połączenie. W takim przypadku nastąpi nowe zatwierdzenie, które jest odpowiedzialne za rozwiązywanie konfliktów w pliku a.txt.

Podsumowując, łączenie krzyżowe nie jest problemem i ostatecznie musisz to zrobić i to właśnie oznacza synchronizacja. Upewnij się, że zabrudzisz ręce podczas łączenia oddziałów, zanim zaczniesz cokolwiek produkować.


1
Czy łączenie krzyżowe w ten sposób nie jest problemem?
Pan EZEKIEL

Łączenie krzyżowe to synchronizacja i nie stanowi problemu, chyba że zatwierdzenia w obu gałęziach nie powodują żadnych konfliktów. Proszę zobaczyć moją zaktualizowaną odpowiedź.
sachinjain024

3

Zaakceptowana odpowiedź za pomocą git merge wykona zadanie, ale pozostawi niechlujne zatwierdzenie hisotry, poprawnym sposobem powinno być „rebase”, wykonując następujące kroki (zakładając, że chcesz utrzymać gałąź funkcji w sycn z rozwijaniem, zanim wykonasz ostatni push przed PR ).

1 git fetchz gałęzi funkcji (upewnij się, że gałąź funkcji, nad którą pracujesz, jest aktualna)

2) git rebase origin/develop

3. jeżeli powstanie jakikolwiek konflikt, rozwiąż je jeden po drugim

4 użyj, git rebase --continuegdy wszystkie konflikty zostaną rozwiązane

5 git push --force


1
Jest to zarówno trudne do odczytania, jak i trudne do zrozumienia. Zaktualizuj swoją odpowiedź i użyj poprawnego kodu, aby oddzielić komentarze od poleceń.
not2qubit

2

Myślisz we właściwym kierunku. Ciągłe łączenie urządzenia głównego z obsługą urządzeń mobilnych i łączenie urządzenia głównego z urządzeniami mobilnymi, gdy wsparcie urządzeń mobilnych jest stabilne. Każdy programista będzie miał swój oddział i może łączyć się z urządzeniem głównym lub mobilnym w zależności od jego roli.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.