git - 无法理解为什么 git merge -s ours 会忽略以前的提交

标签 git git-merge

几个小时以来,我一直在阅读关于git merge -s ours 的策略。我发现的所有资源都表明它会诱使 Git 忽略在使用 -s ours 策略进行的“假” merge 之前发生的提交,我不明白为什么:

假设我有以下 git 历史,其中 masterfeature 分支之间有很多差异:

(A)------(B)-------(C)------(D) <---[master] <---[HEAD]
 \
  \
   (E)------(F)------(G) <---[feature]

现在我运行 git merge -s ours feature,结果是提交 H:

(A)------(B)-------(C)------(D)--(H) <---[master] <---[HEAD]
 \                              /
  \                            /
   (E)------(F)--------------(G)   <-- [feature]

然后我在两个分支上进行更多提交:

(A)------(B)-------(C)------(D)--(H)------(K)------(L) <---[master] <---[HEAD]
 \                              /
  \                            /
   (E)------(F)--------------(G)------(I)------------(J)    <-- [feature]

然后,在 master 上运行 git merge feature

如果我错了,请纠正我,那时 Git 会:

  1. 计算提交 G 作为 merge-base
  2. GL 之间运行差异
  3. GJ 之间运行 diff>
  4. 复制提交 G,比如 G' 并将上述 2 个差异应用到提交 G'
  5. LJ 成为 G' 的父级

这是我不明白的地方:根据文档,提交 EF 的更改不会影响 merge ,但 GL 之间的差异仍将反射(reflect)在提交 EF 因为 G 是从它们“诞生”的,所以这些提交中的更改怎么可能仅仅因为使用了 我们的 策略就不会影响 merge ?

在更极端的情况下,如果这些分支分歧更大,例如,feature 分支中有 100 个文件(在 G 之前引入)并且它们是master中,那么它们不会仍然出现在GL之间的diff中吗?/strong> 在上次 merge 期间? **编辑:我不明白为什么它们不会出现在 diff 中

最佳答案

不,GL 之间的差异 不反射(reflect) E 的变化F。如果 I 引入了更改,它将显示在 diff 中,但之前的更改不包含在 diff 中。

如您所写:G 被检测为 merge 基础,其他所有内容均从那里计算。

也许下面的帮助:

  • E 添加一个文件 e
  • F 添加一个文件f
  • G 包含文件 ef
  • H 包含一棵与 D
  • 相同的树
  • I 添加一个文件 i
  • GI 之间的差异仅包含 G 之后的变化,即新文件 。由于文件 ef 之后都没有更改,因此它们不会出现在 diff 中。就 Git 而言,这些更改已经 merge (但“解决”为不显示在最终结果中,只有“我们的”树是结果的一部分)。

从 Git 的角度来看,G 之前的更改在与 ours 策略 merge 时会被还原。您可以通过比较两个提交来确认这一点:git diff G H 将准确地向您显示 EF(或 A..G 如果你愿意的话)。

关于git - 无法理解为什么 git merge -s ours 会忽略以前的提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66190308/

相关文章:

git clone 不工作并返回 403 http 错误

git - 如何在我的 git 服务器上获得类似 github 的 ssh 访问行为

git - Jenkins git 插件 : Peer's Certificate issuer is not recognized

git - 仅 rebase /重放 merge 提交

GIT - 稀疏 checkout 未按预期工作

c# - 为 Asp.net 中的项目推荐一个在线存储库和项目管理工具

git - 是否可以在 Git 中只 pull 一个文件?

git - 使用 `git merge` 选项传递自定义消息时保留自动 `-m` 消息

Git - merge 与 rebase

git - 如何找到两个分支之间的待提交提交(排除已经挑选/merge 的更改)?