【发布时间】:2019-01-31 15:43:57
【问题描述】:
我了解到git pull --rebase origin master = git fetch origin master + git rebase origin/master。我正在使用 git 2.18
但是当我阅读 this blog 时,它说并非总是如此。
(如果我理解错了,请从这里纠正我)
博客给出了一个例子来展示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 pull 在混乱中。即使是
git fetch; 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 冲突等引起的冲突。
我对此有以下疑问:
a) “此时 git pull 会导致混乱。” - 为什么?由于 pull 默认是非快进的,所以执行 git fetch 后状态不会变成这样。哪里乱了?
a---b---c---d---e---p---q---r (foo)
\
b+c---d+e---f (origin/foo)
b) 如果 a) 为真,git rebase origin/foo 将轻松将图形转换为:
a
\
b+c---d+e---f (origin/foo)
\
b---c---d---e---p---q---r (foo)
我哪里错了?为什么他说git fetch origin git rebase --onto origin/foo e foo会被处决?
【问题讨论】:
-
作为结束评论,我将得出结论:
git pull --rebase origin master=git fetch origin master+git rebase --onto origin/master $fork-point HEAD。这个$fork-point由 git pull 代码提供给 rebase
标签: git