Czasami mamy upstream, który zmienił / przewinął gałąź, od której jesteśmy zależni. To może być duży problem - powodując dla nas bałaganiarskie konflikty, jeśli jesteśmy na niższych szczeblach.
Magia jest git pull --rebase
Normalne ściąganie git jest, mówiąc luźniej, czymś takim: (we wszystkich tych przykładach użyjemy zdalnego o nazwie origin i gałęzi o nazwie foo):
# assume current checked out branch is "foo"
git fetch origin
git merge origin/foo
Na pierwszy rzut oka możesz pomyśleć, że git pull --rebase robi to:
git fetch origin
git rebase origin/foo
Ale to nie pomoże, jeśli rebase poprzedzający wiązałby się z jakimś „squashingiem” (co oznacza, że zmieniono łatki commits, nie tylko ich kolejność).
Co oznacza, że git pull --rebase musi zrobić coś więcej. Oto wyjaśnienie tego, co robi i jak.
Powiedzmy, że Twoim punktem wyjścia jest:
a---b---c---d---e (origin/foo) (also your local "foo")
Czas płynie, a na twoim własnym „foo” dokonałeś pewnych zmian:
a---b---c---d---e---p---q---r (foo)
Tymczasem, w przypływie antyspołecznej wściekłości, opiekun wyższego szczebla nie tylko zmienił swoje „foo”, ale nawet użył squasha lub dwóch. Jego łańcuch zatwierdzeń wygląda teraz następująco:
a---b+c---d+e---f (origin/foo)
Git pull w tym momencie spowodowałby chaos. Nawet git fetch; git rebase origin / foo nie wyciąłby go, ponieważ zatwierdza „b” i „c” z jednej strony, a zatwierdza „b + c” z drugiej, powodowałoby konflikt. (I podobnie z d, e i d + e).
Co git pull --rebase
robi, w tym przypadku, to:
git fetch origin
git rebase --onto origin/foo e foo
To daje ci: