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
策略。它并不真正相关,因为它也不会使 M
与 Z
相同。
它可以用来创建一个 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,合并已经是最新的但有差异?的主要内容,如果未能解决你的问题,请参考以下文章