Rozwiązanie tematu
Prawidłowym poleceniem odpowiadającym na wysłane pytanie może być dowolne z poniższych (zakładając, że gałąź topicjest 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 topicnie jest wyrejestrowany, po prostu dodajesz topicdo 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, Zlub featuregdy <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, Dalbo 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, Dczy masterbędzie w ogóle wynik popełnić Bsł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, Zaby popełnić Di skończyć omijając Ba Cponieważ już zostały zastosowane.
git rebase --onto C X feature
Zastosuje zatwierdzenia Yi Zzatwierdzenie C, skutecznie usuwając zatwierdzenieX
git checkout Bprzed biegiemgit rebase?