Jestem nowy w Git i teraz jestem w takiej sytuacji:
- Mam cztery gałęzie (master, b1, b2 i b3).
- Po tym, jak pracowałem nad b1-b3, zdałem sobie sprawę, że muszę coś zmienić w głównym oddziale, co powinno być we wszystkich innych gałęziach.
- Zmieniłem to, czego potrzebowałem
master
i ... oto mój problem:
Jak zaktualizować wszystkie inne oddziały za pomocą master
kodu oddziału?
git
git-branch
Ionuț Staicu
źródło
źródło
Odpowiedzi:
Masz dwie opcje:
Pierwszy to scalanie, ale tworzy to dodatkowe zatwierdzenie dla scalania.
Kasa dla każdego oddziału:
Następnie scal:
Następnie wciśnij:
Alternatywnie możesz zrobić rebase:
źródło
got push origin master
... nie ma sensu. Nie zmieniasz gałęzi master. Myślę, że to pomyłka przy przegłosowaniu 119: /git rebase master
poprawnej odpowiedziMasz w zasadzie dwie opcje:
Łączysz się. To jest właściwie dość proste i idealnie lokalne działanie:
To pozostawia historię dokładnie tak, jak to się stało: rozwidliłeś się z mastera, dokonałeś zmian we wszystkich gałęziach, a na końcu wprowadziłeś zmiany z mastera do wszystkich trzech gałęzi.
git
potrafi poradzić sobie z tą sytuacją naprawdę dobrze, jest przeznaczony do łączenia zachodzącego we wszystkich kierunkach jednocześnie. Możesz ufać, że będzie w stanie poprawnie zebrać wszystkie wątki. Po prostu nie ma znaczenia, czy gałąź sięb1
połączymaster
, czymaster
połączyb1
, zatwierdzenie scalania wygląda tak samo dla git. Jedyną różnicą jest to, która gałąź ostatecznie wskazuje na to zatwierdzenie scalania.Ty bazujesz. Osoby z SVN lub podobnym doświadczeniem uważają to za bardziej intuicyjne. Polecenia są analogiczne do przypadku scalenia:
Ludziom podoba się to podejście, ponieważ zachowuje ono liniową historię we wszystkich gałęziach. Jednak ta liniowa historia jest kłamstwem i powinieneś być tego świadomy. Rozważ ten wykres zatwierdzania:
Efektem scalenia jest prawdziwa historia:
Jednak rebase daje ci tę historię:
Chodzi o to, że rewizje
E'
,F'
iG'
nigdy tak naprawdę nie istniał, i prawdopodobnie nigdy nie były testowane. Mogą nawet się nie kompilować. W rzeczywistości dość łatwe jest tworzenie bezsensownych zatwierdzeń poprzez rebase, szczególnie gdy zmianymaster
są ważne dla rozwoju wb1
.Konsekwencją tego może być, że nie można odróżnić, który z trzech zatwierdzeń
E
,F
iG
faktycznie wprowadził regresji, zmniejszając wartośćgit bisect
.Nie mówię, że nie powinieneś używać
git rebase
. Ma swoje zastosowania. Ale za każdym razem, gdy go używasz, musisz zdawać sobie sprawę z faktu, że kłamiesz na temat historii. I powinieneś przynajmniej skompilować test nowych zatwierdzeń.źródło
git checkout <source branch>
git pull
. Następnie kontynuując powyżej:git checkout b1
...git merge
igit rebase
. Nie da się tego uniknąć.git rebase
ma tę zaletę, że pozwala ukryć kilka etapów zmiany zasad (tj. zmianę tej samej gałęzi na kilka różnych zatwierdzeń w sekwencji, aby zmniejszyć liczbę konfliktów na każdym etapie). Niemniej jednak sam fakt, że rebase kłamie na temat historii, znacznie ułatwia spieprzanie w tak wieloetapowym rebase ... Dlatego zawsze wolę scalanie, nawet gdy oznacza to, że muszę zaśmiecać historię kilkoma zatwierdzeniami scalania .git rebase master
jest właściwym sposobem na zrobienie tego. Scalenie oznaczałoby zatwierdzenie do scalenia, a ponowne bazowanie nie.źródło
Jeśli pracowałeś nad gałęzią bez przerwy lub wiele innych wydarzyło się podczas pracy nad czymś, najlepiej przenieść swoją gałąź na master. Utrzymuje to porządek w historii i znacznie ułatwia śledzenie.
Uwagi:
Rozdział na temat zmiany bazy znajduje się na stronie http://git-scm.com/book/ch3-6.html i mnóstwo innych zasobów w Internecie.
źródło
@cmaster udzielił najlepiej opracowanej odpowiedzi. W skrócie:
Nie należy ponownie zapisywać historii oddziału, a zamiast tego utrzymywać ją w aktualnym stanie do przyszłych odniesień. Łącząc się z master, tworzy jedno dodatkowe zatwierdzenie, ale jest tanie. Zobowiązania nie kosztują.
źródło
Aby zaktualizować inne gałęzie, takie jak (kopia zapasowa), za pomocą kopii oddziału głównego. Możesz wykonać dowolną drogę (rebase lub merge) ...
Scal gałęzie (nastąpi dodatkowe zatwierdzenie automatycznie w gałęzi kopii zapasowej).
Uwaga: Rebase to nic innego jak ustanowienie nowej bazy (nowa kopia)
(Powtórz dla innych oddziałów, jeśli takie jak backup2 i etc ..,)
(Powtórz dla innych oddziałów, jeśli takie jak backup2 i etc ..,)
źródło
Możesz połączyć lub zastosować indywidualne zatwierdzenia między oddziałami, używając git cherry-pick .
źródło
Istnieją dwie opcje tego problemu.
1) git rebase
2) Git Merge
Tylko różnią się z powyższymi w przypadku scalenia, będą miały dodatkowe zatwierdzenie w historii
1) Git Checkout Branch (b1, b2, b3)
2) git rebase origin / master (w przypadku konfliktów rozwiąż je lokalnie wykonując git rebase - kontynuuj)
3) git push
Alternatywnie opcja scalania git jest podobna
1) Git Checkout „Your_branch” (b1, b2, b3)
2) Git Merge Master
3) git push
źródło
aby zaktualizować swój oddział z poziomu głównego:
źródło