Mam takie drzewo:
(commit 1) - master
\-- (commit 2) - (commit 3) - demo
\-- (commit 4) - (commit 5) - PRO
i muszę przenieść gałąź PRO do mastera
(commit 1) - master
|-- (commit 2) - (commit 3) - demo
\-- (commit 4) - (commit 5) - PRO
Próbowałem git rebase master
z oddziału PRO, ale nic się nie dzieje.
Dla wyjaśnienia : pracowałem w master, a potem musiałem zrobić demo produktu ( git checkout -b demo
i kilka commits). Potem przez pomyłkę tworzę kolejną gałąź z demo ( git checkout -b PRO
i niektórych zatwierdzeń) i teraz muszę przenieść gałąź PRO do mastera i pozostawić demo nienaruszone. Na koniec zarówno wersja demo, jak i wersja PRO zostaną zawieszone na master.
Odpowiedzi:
Użyj
--onto
do tego:Biorąc pod uwagę Twój przypadek:
Zasadniczo pobierasz wszystkie zatwierdzenia od po
demo
doPRO
i przekształcasz je wmaster
zatwierdzenie.źródło
git rebase --onto first-branch second-branch second-branch
ale nie rozumiem składnigit rebase --onto first-branch master second-branch
--onto
, i jak pisali mi pomógłgit rebase --onto newBase oldBase feature/branch
origin/newBase
to nazwa gałęzi, tak jaknewBase
w moim przykładzie. Zależałoby to tylko od tego, czy ponownie bazujesz na gałęzi, która istnieje w twoim lokalnym repozytorium (newBase
), czy też takiej, która istnieje w zdalnym (origin/newBase
).newBase
to nazwa oddziału lokalnego, aorigin/newBase
to nazwa oddziału zdalnego. Który z nich chcesz, zależy od tego, na czym się opierasz. Nie chodzi o to, że się pracuje, a nie tak, chodzi o to, że bazują na innych rzeczach. Oryginalne pytanie nigdy nie wspomina o pilotach, więc użycie pilotów w moim przykładzie nie pasowałoby do zadanego pytania.Sprawdź do
PRO
gałęzi, skopiuj najstarsze ( zatwierdzenie4 ) i najnowsze ( zatwierdzenie5 ) skróty zatwierdzeń tej gałęzi i wklej gdzie indziej:Usuń
PRO
gałąź (zachowaj kopię zapasową tylko dla bezpieczeństwa). Utwórz i zapłać do nowegoPRO
oddziału zmaster
:Weź (najlepszy wybór ) zakres zatwierdzeń poprzedniej
PRO
gałęzi do nowejPRO
gałęzi:Teraz, jeśli wszystko jest w porządku, wymuś (-f) wypchnij do
remote PRO
gałęzi i usuńPRO.bac
gałąź lokalną :źródło
Postaram się być tak ogólnikowy, jak tylko mogę. Najpierw upewnij się, że jesteś na wybranej gałęzi:
Następnie użyj następującego polecenia (gdzie
new-base-branch
jest gałąź, która ma być twoją nową bazą, acurrent-base-branch
jest to gałąź, która jest twoją aktualną bazą).Jeśli nie masz konfliktów, to świetnie - gotowe. Jeśli tak (w większości przypadków), czytaj dalej.
Mogą pojawić się konflikty, które trzeba będzie rozwiązać ręcznie. Git teraz próbuje zrobić „3-drożny seryjnej” między telefonem
current-branch
,current-base-branch
anew-base-branch
. Z grubsza tak będzie działać wewnętrznie git:Git najpierw przebuduje bazę
current-base-branch
nanew-base-branch
. Mogą wystąpić konflikty; które będziesz musiał rozwiązać ręcznie. Po zakończeniu zwykle robiszgit add .
igit rebase --continue
. W tym celu utworzy nowe tymczasowe zatwierdzenietemp-commit-hash
.Po tym Git będzie teraz ponownie bazował
current-branch
natemp-commit-hash
. Mogą wystąpić dalsze konflikty i znowu będziesz musiał rozwiązać je ręcznie. Po zakończeniu kontynuuj ponownie zgit add .
igit rebase --continue
, po czym z powodzeniem ponownie bazujeszcurrent-branch
nanew-base-branch
.Uwaga: jeśli zaczniesz się bałaganić, możesz to zrobić w
git rebase --abort
dowolnym momencie podczas procesu rebase i wrócić do punktu wyjścia.źródło
rebase
polecenie po prostu daje mi komunikat „fatal: invalid upstream 'current-base-branch'”. Ponadto, dlaczego w ogóle jest konieczne, aby powiedzieć GIT, jaka jest bieżąca gałąź nadrzędna tej gałęzi - czy nie powinna już tego wiedzieć?Przyjąłem nieco inne podejście, używając resetowania i skrytek, które pozwalają uniknąć usuwania i ponownego tworzenia gałęzi, a także eliminują potrzebę zmiany gałęzi:
Resetując gałąź na podstawie zatwierdzenia przez zatwierdzenie, w zasadzie po prostu przewijasz historię rozgałęzień do zatwierdzenia na raz.
źródło