Różnica między git pull a git pull --rebase
Zacząłem używać Gita jakiś czas temu i nie do końca rozumiem zawiłości. Moim podstawowym pytaniem jest sprawdzenie różnicy między git pull
i git pull --rebase
, ponieważ dodanie opcji --rebase
nie wydaje się robić czegoś zupełnie innego : po prostu wykonuje pull.
5 answers
git pull
= git fetch
+ git merge
przeciw śledzeniu gałęzi upstream
git pull --rebase
= git fetch
+ git rebase
przeciw śledzeniu gałęzi upstream
Jeśli chcesz wiedzieć, jak git merge
i git rebase
różnią się, przeczytaj to .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:19
Czasami mamy upstream, który rebasował / przewijał gałąź, na której polegamy. To może być duży problem -- powodowanie niechlujnych konfliktów dla nas, jeśli jesteśmy w dół rzeki.
Magia jest
git pull --rebase
Normalny git pull jest, luźno mówiąc, czymś takim (użyjemy pilota o nazwie origin i gałęzi o nazwie foo we wszystkich tych przykładach):
# assume current checked out branch is "foo" git fetch origin git merge origin/foo
Na pierwszy rzut oka można by pomyśleć, że git pull --rebase robi tak:
git fetch origin git rebase origin/foo
Ale to nie pomoże, jeśli rebase upstream wymagał "zgniatania" (co oznacza, że Patch-ID commitów uległo zmianie, a nie tylko ich kolejność).
Co oznacza, że git pull --rebase musi zrobić trochę więcej. Oto wyjaśnienie, co robi i jak.
Powiedzmy, że twój punkt wyjścia jest taki:
a---b---c---d---e (origin/foo) (also your local "foo")
Czas mija, a ty zrobiłeś kilka commitów na swoim własnym "foo": {]}
a---b---c---d---e---p---q---r (foo)
Tymczasem, w przypływie antyspołecznej wściekłości, upstream maintainer nie tylko zrebasował swoje "foo", ale nawet użył squasha lub dwóch. Jego łańcuch commit wygląda teraz tak:
a---b+c---d+e---f (origin/foo)
Git pull w tym momencie spowodowałby chaos. Nawet fetch git; git rebase origin / foo nie wyciąłby go, ponieważ commity "b" I "c" po jednej stronie, a commity "b+c" po drugiej, byłyby sprzeczne. (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:
a---b+c---d+e---f---p'---q'---r' (foo)
Nadal możesz mieć konflikty, ale będą to prawdziwe konflikty (między p / q / r I a/b+c/d+e/f), a nie konflikty spowodowane przez b / c sprzeczne z b+C itp.
Odpowiedź zaczerpnięta z (i nieco zmodyfikowana):
http://gitolite.com/git-pull--rebase
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-28 06:13:19
Załóżmy, że masz dwa commity w lokalnej gałęzi:
D---E master
/
A---B---C---F origin/master
Po "git pull" będzie:
D--------E
/ \
A---B---C---F----G master, origin/master
Po "git pull --rebase", nie będzie punktu scalania G. zauważ, że D i E stają się różnymi commitami:
A---B---C---F---D'---E' master, origin/master
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-01 07:46:22
W najprostszym przypadku bez kolizji
- z rebase: rebasuje lokalne commity na szczycie zdalnej głowy i nie tworzy merge / merge commit
- without / normal: merges and creates a merge commit
Zobacz też:
man git-pull
Dokładniej, git pull uruchamia git fetch z podanymi parametrami i wywołuje git merge, aby połączyć odzyskane nagłówki gałęzi z bieżącą branch. Z --rebase uruchamia się Git rebase zamiast Git merge.
Zobacz:
Kiedy powinienem użyć git pull --rebase?
http://git-scm.com/book/en/Git-Branching-Rebasing
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:16
Ponieważ jest to ważne, aby zrozumieć różnicę między Merge i Rebase.
Rebases to sposób, w jaki zmiany powinny przejść od góry hierarchii w dół / align = "left" /
Po szczegóły patrz - http://www.derekgourlay.com/archives/428
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-21 09:27:37