【发布时间】:2021-09-09 20:05:38
【问题描述】:
昨天,我将本地开发分支合并到本地 master 分支,之后我打算推送到远程 master。我从 git bash 运行 git 命令,然后切换到 Visual Studio 来处理合并冲突。
我的第一个线索是,有多个合并冲突突出了大块代码,其中实际上存在零差异。传入分支上的文本突出显示也神秘地消失了,我最初认为这是我不小心更改或更新的设置,但考虑到其他一切,也许它是相关的。
然后我注意到一个实例,其中一个字符串在 master 中是 abcd,在传入分支中是 abcd - efg,它只是......隐形合并。它没有标记冲突并询问我想要哪个;它只是默默地选择保留哪个(并选择了错误的启动)。
然后我注意到if 代码块在合并中重复。在对所有这些事情进行故障排除的过程中(在我注意到重复之前),我将分支合并到另一个本地分支以查看相同的问题是否仍然存在,并且这个 if 块在那里出现了 3 次,所以它重复了每次合并一次。如果不清楚我的意思:
合并前:
// code
if (condition)
{
// do things
}
// code
合并后:
// code
if (condition)
{
// do things
}
if (condition)
{
// do things
}
// code
然后我发现了另一个隐身合并的实例:变量名的更改。在一个分支中,它全是小写,在另一个分支中,它是 camelCase,它只是默默地在变量声明中选择了小写版本,并在任何使用它的地方选择了驼峰。
然后我发现了另一个重复,但这次是整个函数。我什至把它放在一个文本比较器中以确保它们是相同的。请注意,此重复和 if 块重复位于原始的后续行中。
正如你可以想象的那样,我对这一点感到非常困惑。这不是正常的 git 行为。我的 git 还不错,我的同事甚至更好,而且我们都处于 “what the actual ****” 阶段。然后今天早上我来上班,希望它在一夜之间神奇地解决(剧透警告:它没有),并发现 another 重复函数,但这个函数与原始函数被大量代码分开紧随其后。诡异的。所以我开始比较它们并意识到重复确实是该功能的旧版本。 几周前。之间有多个提交。
疑难解答:重新启动计算机,重新启动 VS,尝试合并到另一个分支,尝试重新安装 git,尝试重新克隆 repo 并将分支与重新安装的 git 合并。奇怪的行为持续存在。我尝试在谷歌上搜索关于隐形合并的信息,但成功有限,以及关于复制的信息,但没有一个答案符合我的问题。
发生了什么?!为什么会这样?!我该怎么办?请帮忙!
【问题讨论】:
-
您的
.gitattributes文件中是否有任何内容,例如任何地方的merge=union条目? -
如果一个字符串仅在分支中更改,但在master中保持不变(但仍然不同),那么Git正在完成它的工作并应用changes 从分支到您的合并目标。如果在两个分支中更改了同一行,这只是冲突。这里没有发生隐形合并(但如果没有看到实际的命令和提交就很难分辨)。
-
至于重复代码:也许你解决了与Visual Studio的冲突并选择了冲突的双方?
-
@bk2204 不,任何地方都没有
merge=union,只有merge = refs/heads/[branchname]。 @knittl我不确定我是否遵循。我更改了分支中的字符串,我将该分支合并到 master 中,它将版本保留在 master 中,因此忽略了更改并且没有询问我想要哪个版本。你说这是正确的行为?重新重复代码,如果发生这种情况,这不是我做出的选择,即,也许 VS 自动做到了? -
没有所谓的“隐形合并”。这只是理解什么是合并的问题。如果您查看合并基础和被合并的两个分支之间的差异,您将看到每个分支对您的代码所做的贡献,一切都会很清楚。事实上,您没有告诉我们足够多的详细解释。