Git: jak utrzymać stałe równoległe gałęzie

Mamy projekt (aplikację PHP), ale instalacja dla każdego klienta jest różna, czasami bardzo mało, czasami więcej. Mimo to duża część kodu źródłowego jest powszechna. Zarządzamy konkretnymi instalacjami jako gałęzie równoległe do gałęzi master i musimy przenieść zmiany z master do innych gałęzi. Ta sama sytuacja została rozwiązana w Git: jak utrzymać (głównie) równoległe gałęzie z niewielką różnicą? najczęściej głosowanym rozwiązaniem było przeniesienie zmian między brachami to sposób:

git pull
git checkout local
git rebase master

Jak wspomniano w rozwiązaniu, tworzy on nie-fast-forward popycha po rebasingu, co uważam za bardzo nieprzyjemne komplikacje. Moje pytanie brzmi - dlaczego nie robić zamiast tego:

git pull
git checkout local
git merge master
Author: Community, 2010-01-31

3 answers

To naprawdę zależy od tego, co chcesz zrobić z gałęzią. Tak, jeśli rebase lokalny, to utworzy non-fast-forward popycha po rebasingu. Z drugiej strony, będziecie utrzymywać zestaw wyraźnych zmian w przyszłości, a to, co będzie na waszej gałęzi, będzie zestawem zmian, tak jakby zostały wprowadzone do najnowszego HEAD of MASTER.

Połączenie mistrza z lokalnym, zamiast tego, utrzyma lokalny marsz w czasie z mistrzem i zapisze historię tak, jak to się stało. Jeśli musisz być / align = "center" bgcolor = "# e0ffe0 " / cesarz Chin / / align = center / Historia nigdy się nie zmieni. Ale będziesz miał bardziej skomplikowaną historię do załatwienia.

 6
Author: John Stoneham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-31 02:10:24

Chodzi o to, że używasz jednej wspólnej gałęzi, a dwóch (lub tyle, ile ty potrzeby) oddziały specyficzne dla klienta. Wszystkie wspólne zmiany idą w master, a każdy oddział klienta otrzymuje zmiany, które dotyczą tylko ten klient. Okresowo (gdy master jest uważany za stabilny punkt), połączysz zmiany z master do klienta branch (git checkout custA; git merge master). To przynosi nowsze "wspólny" kod w oddziale klienta. Nigdy nie połączysz drugiego sposób-to by zanieczyściło opanuj kod specyficzny dla klienta.

Kiedy dokonujesz dostawy do klienta A, kasujesz " custA" branch i wyślij to. I oczywiście podobnie dla innych klientów.

Teraz Załóżmy, że zdobędziesz nowego klienta, "C", a nieco później znajdziesz funkcji, której chcą klienci A I C, ale B nie. tworzysz (aka "widelec") gałąź od master (git checkout -b AC_feature master), koduj / testuj, dokonuj commitów, a następnie łącz je w A i C (git checkout A; git merge AC_feature and similarly for customer C). Nie kodujesz go w a i następnie polegaj na połączeniu A w C, ponieważ to dostałoby Wszystkie A do C.

Jeśli jakiś czas później znajdziesz drobny błąd w tej funkcji, dokonasz zmiana w tej samej gałęzi (git checkout AC_feature; edit/test/commit), a następnie łączysz go z custA i custC jak powyżej.

źródło: te odświeżająco jasne i pomocne artykuły od dewelopera Gitolite-Sitaram Chamarty, napisane częściowo z bezpośrednim wejściem od Junio Hamano (partnera Linusa Torvaldsa w utrzymaniu Git).

Utrzymanie Równoległych Oddziałów Klientów:

Http://gitolite.com/archived/special-branches.html

Kontynuacja artykułu na temat "naprawianie" wspólnych i klientów oddziałów:

Http://gitolite.com/archived/special-branch-fixups.html

 25
Author: Old McStopher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-27 07:51:28

Odpowiedź Grega na twoje inne pytanie wydaje się postrzegać różne gałęzie jako pozostające lokalne dla poszczególnych instalacji, a nie pchane do innych repozytoriów (podkreślenie dodane):

Jeśli jest tolokalne dla systemu , zatwierdź go dolokalnej gałęzi tego systemu , w przeciwnym razie zatwierdź go do "master" i wrzuć do wspólnego repozytorium.

Prawie zawsze chcesz szybko przesuwać do gałęzi we współdzielonym repozytorium. Na git rebase dokumentacja wyjaśnia jak odzyskać z upstream rebase (czyli, git rebase następnie git push -f), a to nie jest zabawne dla wszystkich zaangażowanych.

Aby uzyskać inne podejście, zobacz nigdy nie łącz się z powrotem :

Istnieją ważne przypadki, w których raz widelec z zamiarem nigdy nie połączyć z powrotem, ale ogólnie należy bardzo mocno starać się utrzymać zmiany na takim widelcu do minimum.

Autor omawia zasady rozgałęzień dla różnych wydań klientów w tym samym repozytorium.

 3
Author: Greg Bacon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:32