git pull和git pull之间的区别
我开始使用git,并没有完全理解错综复杂的情况。 我的基本问题是找出git pull
和git pull --rebase
之间的git pull --rebase
,因为添加--rebase
选项似乎没有什么不同:只是做了一次拉。
请帮助我理解差异。
git pull
= git fetch
+ git merge
以跟踪上游分支
git pull --rebase
= git fetch
+ git rebase
跟踪上游分支
如果你想知道git merge
和git 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