繁体   English   中英

很多令人困惑的 git 冲突

[英]Lots of confusing git conflicts

在 bitbucket 的拉取请求期间,我遇到了非常令人困惑的冲突问题。 我有 137 个冲突,如下所示。 如何解决它并防止将来发生这种情况? 这是 Android Studio 在 macOS 上的项目。

第一次冲突

第二次冲突

第三次冲突

如您所见,我刚刚添加了一些行,但 git 将其视为冲突。

您可以在下面找到与 merge.conflictStyle=diff3 的冲突。 1 次会议

2 会议

3 会议

我仍然不知道为什么它是冲突而不是版本。

您的 diff3 屏幕截图提供了答案。 (旁白:不要在这里使用屏幕截图。直接剪切并粘贴文本。在这种情况下,应该删除带有行号的装订线信息,但这没关系。请参阅我如何提出一个好问题。)

请记住,在 Git 中,合并是关于合并工作 涉及三个提交:

  • 你,在你的分支上,从一些提交开始。 Git 将此称为合并基础提交。

  • 他们在他们的分支上,从这个相同的 commit开始。

所以 Git 首先运行两个git diff命令(或内部等效命令)。 一个将此合并基础与的代码版本进行比较,第二个git diff将此合并基础与其代码版本进行比较。

我将从中间冲突开始。

diff3 风格的 diff 包括合并基本代码(来自提交ce442625 ),我们可以在其中阅读——我已经重新输入了这个,所以我可能添加了一些错别字1——原行说:

    chage_lang.setOnClickListener { openDialogToSelectLang() }

这显然是有缺陷的:它应该读取change_lang而不是chage_lang

您的提交中,在 HEAD 中,您保留了这一行,但在其后添加了一个空行 这是一个“差异大块”。

他们的提交中,在feature/dark_mode中,他们修复了拼写并将单个空行替换为非空行,以获得:

    change_lang.setOnClickListener { openDialogToSelectLang() }
    change_theme.setOnClickListener { openDialogToSelectTheme() }

在这里,Git 不知道是保留您添加的空行,还是保留它们的删除和替换空行; 它不知道是保留错误的拼写chage_lang还是使用更正的拼写change_lang 所以就产生了冲突:你必须select正确的分辨率。

就在这之下,最后一个冲突是相似的:合并基础版本说:

    android:layout_marginTop="@dimen/standard_margin"
    android:background="@color/white"

您的版本中,您将“第一行”更改为“8dp”并保持第二行不变,但在他们的版本中,他们保持第一行不变并删除了第二行。再一次,Git 不知道是否接受您的版本,他们的版本,两者的某种组合,或者什么。必须在此处选择正确的分辨率。

一个差异是最令人困惑的:这里,从合并基础版本中获取的行集是的。 您这边的变化是添加了一个空白行,而他们添加了一个非空白行阅读:

    setBackgroundColor(ContextCompat.getColor(context, ...

与其他两种情况一样,Git 不知道它是否应该添加您的空白行,或者他们的行,或者两者,或者两者都不,或者什么。 必须选择。

编辑有问题的文件以具有正确的组合(并且不再包含冲突标记),或使用合并工具来实现相同的效果。 然后在生成的文件上使用git add ,或使用合并工具(可能是相同的合并工具,全部作为一件事)运行git add for you git add更新 Git暂存区中的文件副本,以便 Git 知道正确的分辨率。

(Git 假设您告诉它的任何内容都是正确的,因此请确保您在这里告诉它正确的内容,换句话说,确保整个文件是正确的。通常这意味着您应该在给它之前测试您的合并分辨率Git. That's one reason I don't like git mergetool : you do the merge, and then git mergetool immediately tells Git it's right, and if it's not right, you have to start over. 2 )


1这种拼写错误的风险是“询问”页面建议使用剪切和粘贴的原因

2您可以只使用这一个文件重新开始,和/或编辑和调试它而无需重新创建冲突,但现在更难看到原始的三个输入文件。 使用git checkout -m重新创建冲突有效,但这会失去您的解决方案。 一旦你确切地知道你和 Git 正在做什么,所有这些都有解决方法,但总的来说,整个用户体验对我来说似乎很糟糕。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM