git pull和git pull之间的区别

我开始使用git,并没有完全理解错综复杂的情况。 我的基本问题是找出git pullgit pull --rebase之间的git pull --rebase ,因为添加--rebase选项似乎没有什么不同:只是做了一次拉。

请帮助我理解差异。


git pull = git fetch + git merge以跟踪上游分支

git pull --rebase = git fetch + git rebase跟踪上游分支

如果你想知道git mergegit rebase如何不同,请阅读。


有时我们有一个上游,重新启动/倒回我们依赖的分支。 这可能是一个大问题 - 如果我们在下游,会给我们造成凌乱的冲突。

魔术是git pull --rebase

一般情况下,git pull是这样的(我们将在所有这些示例中使用远程调用的起源和一个名为foo的分支):

# assume current checked out branch is "foo"
git fetch origin
git merge origin/foo

乍一看,你可能会认为git pull --rebase就是这样做的:

git fetch origin
git rebase origin/foo

但是如果上游的rebase包含任何“挤压”(意味着提交的patch-id不仅仅是它们的顺序),那也不会有帮助。

这意味着git pull --rebase必须做更多的事情。 以下是对它的作用和方式的解释。

假设你的出发点是这样的:

a---b---c---d---e  (origin/foo) (also your local "foo")

时间过去了,你在自己的“foo”上做了一些提交:

a---b---c---d---e---p---q---r (foo)

与此同时,上游维护人员在反社会愤怒的情况下,不仅重新启动了他的“foo”,甚至还用了一两个壁球。 他的提交链现在看起来像这样:

a---b+c---d+e---f  (origin/foo)

在这一点上的混帐会导致混乱。 即使是一个git获取; git rebase origin / foo不会削减它,因为一方提交“b”和“c”,另一方提交“b + c”会冲突。 (并且与d,e和d + e类似)。

在这种情况下, git pull --rebase做的是:

git fetch origin
git rebase --onto origin/foo e foo

这给你:

 a---b+c---d+e---f---p'---q'---r' (foo)

你可能仍然会发生冲突,但它们将是真正的冲突(在p / q / r和a / b + c / d + e / f之间),而不是b / c与b + c冲突造成的冲突等。

回答采取(并稍作修改):
http://gitolite.com/git-pull--rebase


假设你在本地分支有两个提交:

      D---E master
     /
A---B---C---F origin/master

在“git pull”之后,将会是:

      D--------E  
     /          
A---B---C---F----G   master, origin/master

在“git pull --rebase”之后,将没有合并点G.请注意,D和E会变成不同的提交:

A---B---C---F---D'---E'   master, origin/master
链接地址: http://www.djcxy.com/p/45087.html

上一篇: Difference between git pull and git pull

下一篇: git: difference between merge and rebase