Git,合并已经是最新的但有差异?

Posted

技术标签:

【中文标题】Git,合并已经是最新的但有差异?【英文标题】:Git , Merge Already Up TO date but with diff? 【发布时间】:2021-12-01 03:36:51 【问题描述】:

我有两个本地分支机构,比如 A 和 B。 我运行以下命令

    git checkout A git merge -X theirs B - “评论”

如果我再次运行命令 git merge B --> 它抛出消息“已经是最新的”

如果我运行以下命令 git diff A..B --> 它返回 4 个文件的差异

所以我用分支 B 的内容“粉碎”分支 A 的内容 如果我再次在分支 A 上运行合并命令,它会返回一切都是最新的 但是如果我在两个分支之间运行“差异”,它会返回四个文件中的差异。

发生了什么?

提前致谢。 最好的问候

【问题讨论】:

【参考方案1】:

须知:

commits 中的 Git 流量。

每个提交至少有一个父提交,并通过其父链“到达”其他提交。

分支是一个提交的名称

合并创建一个提交并移动当前分支的分支名称。

短语“最新”意味着一个分支没有达到另一个分支没有达到的任何提交。

假设我们从这种情况开始(箭头指向时间向后,每个提交都指向其父级):

A <-- B <-- C <-- D (branch1)
 ↖︎
   <-- X <-- Y <-- Z (branch2)

现在我结帐branch1 并说git merge branch2。我明白了:

A <-- B <-- C <-- D <-- M (branch1)
 ↖︎                    ↙︎
   <-- X <-- Y <-- Z (branch2)

所以现在,一方面,尝试将branch2 合并到branch1 是没有意义的再次; branch1 已经达到了 branch2 达到的所有相同提交。因此,“最新”。但是 commit M 和 commit Z 也不相同。


也许你的困惑是因为你认为

git merge -X theirs B

在合并方面做了一些特别的事情。它没有。这仍然是一个非常普通的合并。它唯一特别做的是以防发生任何合并冲突; theirs 提供了有关如何在不寻求人工帮助的情况下解决这些冲突的提示。

【讨论】:

关于-X highlighted on the manual page 的一个重要说明是它不会选择合并策略,它会为所选策略选择一个选项。所以就其本身而言,-X theirs 使用带有“他们的”选项的“递归”策略,正如您所说,它控制着如何解决冲突。他们也是“我们的”策略 (-s ours),它将所有内容都标记为合并,而不会从其他分支中引入任何更改(但没有“他们的”策略)。 是的,我故意省略了ours 策略。它并不真正相关,因为它也不会使 MZ 相同。 它可以用来创建一个 M 和 Z 相同的树,我认为,通过在 branch2 上进行合并然后交换指针。像git switch branch2; git merge -s ours branch1; git branch temp; git reset --hard HEAD^; git switch branch1; git reset --hard temp; git branch -d temp 这样的东西最后,branch1 将具有 branch2 的内容(提交 Z),但是提交 D 的额外父级。 感谢您的快速回答,我打开了其中一个文件,差异表明它是不同的,并且确实存在差异,我怎样才能将 A 的版本与 B 中的版本“粉碎”?我想做的是用分支B中的内容“粉碎”分支A中的所有内容,就像“替换”一样?提前致谢 好的,但那不是你问的。我试图回答你提出的问题。如果您有不同的“如何做”问题,也许您可​​以将其作为一个新问题提出。虽然我认为之前的评论确实回答了这个问题。

以上是关于Git,合并已经是最新的但有差异?的主要内容,如果未能解决你的问题,请参考以下文章

git fetch后怎么比较差异

Git:如何将 KDiff3 配置为合并工具和差异工具?

为啥 Git 说我的主分支“已经是最新的”,即使它不是?

如何用git从develop分支拉最新代码至本地

Git 如何合并 Fork 的仓库的最新代码

git在merge后会不会把最新代码更新过来