【问题标题】:git pull and fast forward merginggit pull 和快进合并
【发布时间】:2017-10-18 07:42:18
【问题描述】:

我的问题很简单。 git pull 从原始存储库中提取新更改时是否执行快进合并?我在文档中读到默认情况下它没有,但是在拉取时我没有任何合并提交。

以具有以下历史记录的原始存储库为例:

A -> B -> C -> D

我的工作存储库是这样的:

A -> B -> C -> W -> X

然后,如果我从远程拉出,我会得到:

A -> B -> C -> W -> X -> D

XD 之间没有任何合并提交。拉取新更改时没有合并冲突。这与我从 git 指南中了解的内容不符。

【问题讨论】:

  • 除非您在示例中更改了与 D 提交相同的文件,否则不会发生冲突,因此它只会将您的更改与远程分支中的更改合并
  • 关于true mergefast-forward mergegit-scm.com/docs/git-merge

标签: git merge git-merge git-pull pull


【解决方案1】:

如果出现这种情况,您要么调用了git pull --rebase,要么更改了本地存储库的配置,以便pull 默认执行变基。

pull 是先执行 fetch 以集成分支,然后默认执行 merge 或者如果配置或参数另有说明则执行 rebase 的组合。

如果您没有任何仅存在于本地分支中的提交,merge 默认情况下会进行快进合并。您可以通过配置或参数--no-ff 防止这种情况发生,或者您可以通过配置或参数--ff-only 强制执行仅快进合并,在这种情况下,如果无法进行快进合并,则合并将失败(即您已完成本地提交)。

merge 无法实现您所描述的行为,因为 rebase 会更改 D 的历史记录,从而更改其 SHA 值。这是一个全新的提交,您作为提交者名称,现在作为提交者日期,它引入了与 D 所做的相同更改,并且具有相同的作者姓名和作者日期。这种重写的提交通常称为D'

【讨论】:

  • 但它甚至不是基于拉配置,b/c 在 git pull 之后它将是 A -> B -> C -> D -> W -> X 因为 W 和 X 是本地的。可能是在写问题时感到困惑,没有任何线索。
  • 啊,对,你是对的,rebase 当然会把你的提交放在首位。因此,如果没有看到您执行的确切命令和git config -l 的输出,就很难说出您是如何得到结果的。但是合并仍然不能从两个都有单独提交的分支中产生线性历史记录。
  • 不是我的结果,只是在评论您的答案时考虑了问题中 OP 的结果。 :)
猜你喜欢
  • 2022-01-06
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2017-03-26
  • 2015-07-22
  • 2013-01-15
  • 1970-01-01
相关资源
最近更新 更多