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.

Proszę, pomóż mi zrozumieć różnicę.
 246
Author: Nakilon, 2013-09-21

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 .

 262
Author: mvp,
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

 209
Author: Mauri Lopez,
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
 35
Author: Deqing,
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

 9
Author: drahnr,
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

 7
Author: Sagar Mody,
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