【问题标题】:Why is git stealth-merging and duplicating code?为什么 git 隐形合并和复制代码?
【发布时间】: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 自动做到了?
  • 没有所谓的“隐形合并”。这只是理解什么是合并的问题。如果您查看合并基础和被合并的两个分支之间的差异,您将看到每个分支对您的代码所做的贡献,一切都会很清楚。事实上,您没有告诉我们足够多的详细解释。

标签: git merge


【解决方案1】:

你试过用 git rebase 代替 git merge 吗?它将向您展示冲突,这可能就是正在发生的事情。我可以保留两个副本并复制它。

【讨论】:

  • 我也可以看到与 git merge 的冲突,这就是我使用 VS 处理合并的原因。根据您的建议,我尝试了 git rebase,它做了同样的事情:/
  • 提交是否也重复?还是只是代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 2014-04-22
  • 2015-04-11
  • 2014-09-08
相关资源
最近更新 更多