【问题标题】:What is the difference between git pull and git fetch + git rebase?git pull 和 git fetch + git rebase 有什么区别?
【发布时间】:2011-03-22 09:22:10
【问题描述】:

Another question 表示git pull 就像git fetch + git merge

但是git pullgit fetch + git rebase 之间有什么区别?

【问题讨论】:

  • 有人应该清理链接......我很惊讶其他问题得到了多少票。
  • @xeno:我想这只是统计有多少人说“我也有这个问题”
  • 有一天我会抽出时间真正阅读 git 文档,但在那之前,我会为这些类型的问题投票

标签: git git-rebase git-pull git-fetch


【解决方案1】:

您的问题应该很明显,您实际上只是在询问git mergegit rebase 之间的区别。

因此,假设您处于常见情况 - 您在 master 分支上做了一些工作,然后从 origin 中提取,它也做了一些工作。提取后,情况如下所示:

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (origin/master)

如果你此时合并(git pull 的默认行为),假设没有任何冲突,你最终会得到:

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (origin/master)

另一方面,如果你做了适当的变基,你会得到这样的结果:

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (origin/master)

你的工作树的内容在这两种情况下应该是一样的;您刚刚创建了一个不同的历史记录。 rebase 重写了你的历史,使它看起来好像你已经在 origin 的新 master 分支 (R) 之上提交,而不是你最初提交的位置 (H)。如果其他人已经从您的 master 分支中拉出,您不应该使用 rebase 方法。

最后,请注意,您实际上可以通过将配置参数 branch.<name>.rebase 设置为 true 来为给定分支设置 git pull 以使用 rebase 而不是合并。您也可以使用 git pull --rebase 为单次拉动执行此操作。

【讨论】:

  • 如果你在有人已经从你的 master 分支拉出后你要 rebase 会发生什么?这会破坏回购吗?
  • 如何知道是否有人从你的 master 分支中拉取了?
  • 如果你不确定某人没有,你应该假设他们有。
  • 我只是在想,除非您也在 origin/master 以外的地方推送更改,否则我认为不会遇到其他人拉取相关更改的问题,因为如果您已经将这些更改推送到 origin/master,首先没有什么可以重新设置的。在我看来,警告真的只在你有比 X -> origin/X 更复杂的东西的情况下才重要,但我可能是错的。如果有人知道我忽略的场景,请分享。
  • @SteveChambers 不,这不是结果。这些线仅代表提交祖先,即 A 是 B 的父母。对于 Q 或 B 是否是第一个时间没有任何暗示。所有这些操作都基于提交图,而不是时间。 Rebase 只是简单地移植了一些提交,无论提交时间戳是什么,结果都是我展示的。
【解决方案2】:

TLDR:

git pull 就像运行git fetch 然后git merge
git pull --rebase 就像git fetch 然后git rebase

回复您的第一个声明,

git pull 就像git fetch + git merge

"在默认模式下,git pull 是git fetch 的简写,后跟 git merge FETCH_HEAD" 更准确地说,git pull 运行 git fetch 与 给定参数然后调用git merge合并检索到的分支 进入当前分支”

(参考:https://git-scm.com/docs/git-pull


关于您的第二个陈述/问题:

'但是git pull VS git fetch + git rebase 有什么区别'

再次,来自同一来源:
git pull --rebase

“使用--rebase,它运行 git rebase 而不是 git merge。”


现在,如果你想问

'mergerebase的区别'

这里也有答案:
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
(改变版本历史记录方式的区别)

【讨论】:

  • 我想提一下,“git pull --rebase”在大多数情况下就像“git fetch then git rebase”——但并非总是如此。在某些情况下,“git pull --rebase”会做得更多。在此处查看这个经常引用的示例:gitolite.com/git-pull--rebase
  • 非常感谢您的回答。我真的很了解git fetch + git rebase 命令从现在开始的工作方式。从现在开始,我们的 git 树上没有或多或少的冲突 :)
  • @DanielK, git rebase 也做了这些额外的步骤,因为在那篇博文写完后不久。请参阅git help rebase 中对--fork-point 的讨论。
猜你喜欢
  • 2011-09-11
  • 2017-06-30
  • 2018-03-05
  • 2020-08-24
  • 2015-03-21
  • 2022-06-14
  • 2021-08-17
  • 2014-10-15
相关资源
最近更新 更多