Począwszy od git 1,9 / 2,0 Q1 2014, nie będzie musiał zaznaczyć swoją poprzednią pochodzenie oddział przed przebazowania go na przepisany upstream oddziału, jak opisano w Arystoteles Pagaltzis „s odpowiedź :
See popełnić 07d406b i popełnić d96855f :
Po pracy nad topic
gałęzią utworzoną w programie git checkout -b topic origin/master
, historia gałęzi ze zdalnym śledzeniem origin/master
mogła zostać przewinięta i przebudowana, co prowadzi do historii o takim kształcie:
o---B1
/
---o---o---B2--o---o---o---B (origin/master)
\
B3
\
Derived (topic)
gdzie origin/master
wykorzystywane do punktu, w zatwierdzeń B3
, B2
, B1
a teraz wskazuje na to B
, a topic
oddział został uruchomiony na nim z powrotem, gdy origin/master
był na B3
.
Ten tryb wykorzystuje reflog of origin/master
do znalezienia B3
jako punktu rozwidlenia, dzięki czemu topic
można zmienić bazę na zaktualizowanąorigin/master
przez:
$ fork_point=$(git merge-base --fork-point origin/master topic)
$ git rebase --onto origin/master $fork_point topic
Dlatego git merge-base
polecenie ma nową opcję:
--fork-point::
Znajdź punkt, w którym gałąź (lub jakakolwiek historia, do której prowadzi <commit>
) rozwidliła się z innej gałęzi (lub dowolnego odniesienia) <ref>
.
To nie tylko wyszukuje wspólnego przodka dwóch zatwierdzeń, ale także bierze pod uwagę refleksję, <ref>
aby zobaczyć, czy historia prowadząca do <commit>
rozwidlenia od wcześniejszego wcielenia gałęzi<ref>
.
Polecenie " git pull --rebase
" oblicza punkt rozwidlenia gałęzi podlegającej zmianie przy użyciu wpisów reflog gałęzi " base
" (zazwyczaj gałęzi zdalnego śledzenia), na której była oparta praca gałęzi, aby poradzić sobie z przypadkiem, w którym "baza" oddział został przewinięty i odbudowany.
Na przykład, jeśli historia wyglądała tak, gdzie:
- aktualny wierzchołek „
base
” oddział jest B
, ale wcześniej pobieraniu zauważył, że jego końcówka kiedyś B3
, a potem B2
, a potem B1
, zanim się do prądu popełnić, i
- gałąź, która jest przebudowywana na najnowszą "bazę", jest oparta na zatwierdzeniu
B3
,
próbuje znaleźć B3
przechodząc przez wyjście „ git rev-list --reflog base
” (czyli B
, B1
, B2
, B3
), aż znajdzie zobowiązują się, że jest przodkiem obecnego końcówką „ Derived (topic)
”.
Wewnętrznie możemy get_merge_bases_many()
obliczyć to za jednym razem.
Chcielibyśmy stworzyć bazę scalającą pomiędzy Derived
i fikcyjne zatwierdzenie scalające, które wynikałoby z połączenia wszystkich historycznych wskazówek " base (origin/master)
".
Gdy takie zatwierdzenie istnieje, powinniśmy otrzymać pojedynczy wynik, który dokładnie pasuje do jednego z wpisów reflog w „ base
”.
Git 2.1 (Q3 2014) doda, że ta funkcja będzie bardziej niezawodna: zobacz commit 1e0dacd autorstwa Johna Keeping ( johnkeeping
)
poprawnie obsłużmy scenariusz, w którym mamy następującą topologię:
C --- D --- E <- dev
/
B <- master@{1}
/
o --- B' --- C* --- D* <- master
gdzie:
B'
jest poprawioną wersją programu, B
która nie jest łatka z B
;
C*
i D*
są identyczne z poprawkami C
i D
odpowiednio i powodują konflikt tekstowy, jeśli zostaną zastosowane w złej kolejności;
E
zależy od tekstu D
.
Prawidłowe wynikiem git rebase master dev
jest to, że B
jest określona jako widełek punktu dev
i master
tak, aby C
, D
, E
to dopuszcza, które muszą być odtwarzane na master
; ale C
i D
są patch-identyczne z C*
i D*
i tak mogą być usunięte, tak że efekt końcowy to:
o --- B' --- C* --- D* --- E <- dev
Jeśli punkt rozwidlenia nie zostanie zidentyfikowany, to wybranie B
gałęzi zawierającej B'
powoduje konflikt, a jeśli zatwierdzenia identyczne z łatą nie są poprawnie zidentyfikowane, wybranie C
do gałęzi zawierającej D
(lub równoważnie D*
) powoduje konflikt.
" --fork-point
" Tryb " git rebase
" cofnął się, gdy polecenie zostało przepisane w C w 2.20 era, co zostało poprawione w Git 2.27 (Q2 2020).
Zobacz commit f08132f (09 grudnia 2019) autorstwa Junio C Hamano ( gitster
) .
(Scalone przez Junio C Hamano - gitster
- w zobowiązaniu fb4175b , 27 marca 2020 r.)
rebase
: --fork-point
naprawa regresji
Podpisał: Alex Torok
[jc: odnowił poprawkę i użył testów Alexa]
Podpisał: Junio C Hamano
git rebase --fork-point master
Kiedyś „ ” działało OK, jak to wewnętrznie nazywało się „ git merge-base --fork-point
”, które wiedziało, jak obsługiwać krótką nazwę referencyjną i skracać ją do pełnej nazwy referencyjnej przed wywołaniem podstawowej get_fork_point()
funkcji.
Nie jest to już prawdą po przepisaniu polecenia w C, ponieważ jego wewnętrzne wywołanie bezpośrednio do get_fork_point()
nie ogranicza krótkiego odwołania.
Przenieś argument „dwim the refname” do logiki „full refname”, która jest używana w „git merge-base”, do podstawowej get_fork_point()
funkcji, tak aby inny wywołujący funkcję w implementacji „git rebase” zachowywał się w ten sam sposób, aby naprawić ten regres.