首页 > 解决方案 > 为什么 git 隐形合并和复制代码?

问题描述

昨天,我将一个本地开发分支合并到我本地的 master 分支,之后我打算推送到远程 master。我从 git bash 运行 git 命令,然后切换到 Visual Studio 来处理合并冲突。

我的第一个线索是错误的,有多个合并冲突突出了大块代码,其中实际上存在零差异。传入分支上的文本突出显示也神秘地消失了,我最初认为这是我不小心更改或更新的设置,但考虑到其他一切,也许它是相关的。

然后我注意到一个字符串abcd在主abcd - efg分支和传入分支中的实例,它只是......隐形合并。它没有标记冲突并询问我想要哪个;它只是默默地选择保留哪个(并选择了错误的启动)。

然后我注意到if在合并中重复了一段代码。在对所有这些事情进行故障排除的过程中(在我注意到重复之前),我将分支合并到另一个本地分支以查看相同的问题是否仍然存在,并且该if块出现了 3 次,因此每个重复一次合并。如果不清楚我的意思是什么:

预合并:

// code
if (condition)
{
  // do things
}
// code

合并后:

// code
if (condition)
{
  // do things
}
if (condition)
{
  // do things
}
// code

然后我发现了另一个隐形合并的例子:变量名的改变。在一个分支中,它都是小写的,在另一个分支中,它是 camelCase,它只是默默地在变量声明和使用camelCase 的地方选择了小写版本。

然后我发现了另一个重复,但这次是整个函数。我什至把它放在一个文本比较器中以确保它们是相同的。请注意,此重复和if块重复位于原始的后续行中。

正如你可以想象的那样,我对这一点感到非常困惑。这不是正常的 git 行为。我的 git 还不错,我的同事甚至更好,而且我们都处于“什么是真正的 ****”阶段。然后今天早上我来上班,希望它在一夜之间神奇地解决(剧透警告:它没有),并发现另一个重复的函数,但这个函数与原始函数有很多代码分开,而不是紧随其后。诡异的。所以我开始比较它们并意识到重复确实是该功能的旧版本。从几周前开始。之间有多个提交。

故障排除:重新启动计算机,重新启动 VS,尝试合并到另一个分支,尝试重新安装 git,尝试重新克隆 repo 并将分支与重新安装的 git 合并。奇怪的行为持续存在。我尝试在谷歌上搜索关于隐形合并的信息,但成功有限,以及关于复制的信息,但没有一个答案与我的问题相符。

怎么了?!为什么会这样?!我该怎么办?请帮忙!

标签: gitmerge

解决方案


您是否尝试过使用 git rebase 而不是 git merge?它将向您显示冲突,这可能就是正在发生的事情。我可以保留两个副本并复制它。


推荐阅读