Moja rekomendacja (lub, "co bym zrobił, gdybym był Mr Orange"), zaczyna się od git fetch
. Teraz będę miał to w repozytorium, czyli to, co Mr Blond miał po swoim rebase i tuż przed uruchomieniem "git push-f".
M1 - M2 - M3
\ \
\ \
A1 - A2 A1' - A2'
Jedną istotną różnicą jest to, będę mieć moją lokalną wytwórnię A
wskazując rev a2, a pilot etykieta remotes/origin/A
wskazując na A2' (Pan Blond miał to na odwrót, lokalny label A
wskazując A2 'i remotes/origin/A
wskazujące na A2).
Jeśli pracuję w moim egzemplarzu oddziału o nazwie „A” Muszę to zamiast:
M1 ---- M2 ---- M3
\ \
\ \
A1 - A2 - A3 A1' - A2'
(z moim lokalnym etykieta wskazując A3 zamiast A2 lub A4 lub A5 itp., w zależności od tego, ile zmian zastosowałem.) Teraz wszystko, co muszę zrobić, to zmienić moje A3 (i A4 w razie potrzeby itd.) Na A2 '. Jednym z oczywistych bezpośredni sposób:
$ git branch -a
master
* A
remotes/origin/master
remotes/origin/A
$ git branch new_A remotes/origin/A
$ git rebase -i new_A
a następnie spadek obr A1 i A2 w całości, gdyż te są modyfikowane w new_A jako A1' i A2' . Lub:
$ git checkout -b new_A remotes/origin/A
$ git format-patch -k --stdout A3..A | git am -3 -k
(metoda git am -3 -k
jest opisana w git-format-patch
stronie podręcznika).
te wymagają zastanawianie się, co mam, że pan nie Blond przedtem czynił jego rebase
, czyli identyfikacji A1, A2, A3 itd
Jeżeli drugie podejście jest skuteczne I skończyć z:
M1 ---- M2 ---- M3
\ \
\ \
A1 - A2 - A3 A1' - A2' - A3'
gdzie nazywam oddział new_A
punkty do A3' (mój istniejący A
oddział nadal wskazuje na starą A3). Jeśli używam pierwszego podejścia i to się uda, kończę na tym samym, po prostu moja obecna nazwa oddziału A
będzie teraz wskazywała na A3 '(i nie mam nazwy dla starego oddziału z A1-A2-A3, nawet chociaż wciąż jest w moim repozycie, znalezienie go wymaga przechodzenia przez reflogi lub podobne).
(Jeśli moje potrzeby A3 modyfikacji stać A3' , zarówno interaktywne rebase i «git am» metoda będzie wymagać pracy przeze mnie, oczywiście.)
Oczywiście jest to również możliwe, aby po prostu git merge
(jak w odpowiedzi Gary Fixler), ale stworzy scalającej („M” bez numeru, poniżej) i utrzymać obroty A1 i A2 widoczne, dając:
M1 ---- M2 ---- M3
\ \
\ \
A1 - A2 - A3 A1' - A2' -- M
\_______________/
Jeśli chcesz zachować oryginalny A1 i A2, to jest dobra rzecz; jeśli chcesz się ich pozbyć, to źle. A więc "co robić" zależy od "tego, co chcesz osiągnąć".
Edytuj, aby dodać: bardziej podoba mi się metoda zmiany formatu, ponieważ pozostawia ona moją starą nazwę oddziału, podczas gdy ja upewniam się, że wszystko jest w porządku. Zakładając, że to wszystko działa i jest dobry, oto ostatnie kilka kroków:
$ git branch -m A old_A
$ git branch -m new_A A
a następnie, jeśli old_A może być opuszczony w całości:
$ git branch -D old_A
lub, równoważnie, zacznij oddział usuwać następnie zmień nazwę new_A do A.
(Edit: patrz również git rebase --onto
dokumentację, za cel przebazowania A3, etc., na oddziale new_A.)
Uwaga: nie ma białych spacji między '-' a 'hard' - zajęło mi to trochę czasu, ponieważ odpowiedź została umieszczona na moim ekranie dokładnie pomiędzy tymi dwoma :) – qbolec