Rozwiązanie tematu
Prawidłowym poleceniem odpowiadającym na wysłane pytanie może być dowolne z poniższych (zakładając, że gałąź topic
jest już wyewidencjonowana):
git rebase --onto B master
git rebase --onto master~1 master
git rebase --onto B A
git rebase --onto B C
git rebase --onto B
Jeśli topic
nie jest wyrejestrowany, po prostu dodajesz topic
do polecenia (z wyjątkiem ostatniego) w następujący sposób:
git rebase --onto B master topic
Alternatywnie, najpierw sprawdź oddział z:
git checkout topic
Zmień wartość dowolnego ciągu zatwierdzeń na zatwierdzenie docelowe
Podstawowa forma polecenia, którego potrzebujemy, zaczerpnięta z dokumentacji, to:
git rebase --onto <Target> [<Upstream> [<Branch>]]
<Branch>
jest opcjonalna i wszystko, co robi, to sprawdzenie określonej gałęzi przed wykonaniem reszty polecenia. Jeśli już wyewidencjonowałeś gałąź, którą chcesz przestawić, nie potrzebujesz tego. Zauważ, że musisz określić <Upstream>
, aby określić, w <Branch>
przeciwnym razie git pomyśli, że określasz <Upstream>
.
<Target>
jest zatwierdzeniem, do którego dołączymy nasz ciąg zatwierdzeń. Podając nazwę gałęzi, po prostu określasz zatwierdzenie głowy tej gałęzi. <Target>
może być dowolnym zatwierdzeniem, które nie będzie zawarte w ciągu przenoszonych zatwierdzeń. Na przykład:
A --- B --- C --- D master
\
\-- X --- Y --- Z feature
Aby przenieść całą gałąź funkcji, nie można wybrać X
, Y
, Z
lub feature
gdy <Target>
od tych, wszystkie są rewizje wewnątrz grupy są przenoszone.
<Upstream>
jest wyjątkowy, ponieważ może oznaczać dwie różne rzeczy. Jeśli jest to zatwierdzenie, które jest przodkiem wyewidencjonowanej gałęzi, wówczas służy jako punkt odcięcia. W przykładzie I, pod warunkiem, byłoby to wszystko, co jest nie C
, D
albo master
. Wszystkie zatwierdzenia po <Upstream>
do głowy wyrejestrowanej gałęzi są tymi, które zostaną przeniesione.
Jednakże, jeśli <Upstream>
nie jest przodkiem, to git tworzy kopię zapasową łańcucha od określonego zatwierdzenia, aż znajdzie wspólnego przodka z wyewidencjonowaną gałęzią (i przerywa, jeśli nie może go znaleźć). W naszym przypadku, <Upstream>
z B
, C
, D
czy master
będzie w ogóle wynik popełnić B
służąc jako punkt przecięcia. <Upstream>
jest sam w sobie poleceniem opcjonalnym i jeśli nie jest określone, to git sprawdza rodzica wyewidencjonowanej gałęzi, co jest odpowiednikiem wprowadzenia master
.
Teraz, gdy git wybrał zatwierdzenia, które będzie wycinał i przesuwał, stosuje je w kolejności <Target>
, pomijając te, które zostały już zastosowane do celu.
Ciekawe przykłady i wyniki
Korzystając z tego punktu wyjścia:
A --- B --- C --- D --- E master
\
\-- X --- Y --- Z feature
git rebase --onto D A feature
Zastosuje zobowiązuje B
, C
, X
, Y
, Z
aby popełnić D
i skończyć omijając B
a C
ponieważ już zostały zastosowane.
git rebase --onto C X feature
Zastosuje zatwierdzenia Y
i Z
zatwierdzenie C
, skutecznie usuwając zatwierdzenieX
git checkout B
przed biegiemgit rebase
?