如何检查 git 合并问题是否已修复?

How to check if git merge problems have been fixed?

合并分支时,通常会在命令提示符中列出合并冲突。我知道如何通过查看有冲突的文件并进行适当的更改来解决问题。我们还有 "mergetool" 这可能非常有用(虽然不是很擅长使用它)。根据我从不同来源阅读的内容,解决此问题的步骤是:

这看起来很简单。但是,如果我遗漏了什么并且没有修复它怎么办? Git 是否提供了一种方法来检查除了使用 mergetool 之外是否还有其他问题需要修复?

我认为这个问题暗示的是 - 开发人员如何知道所有手动合并何时完成?例如,您可能 运行 像这样的简单合并:

git checkout master
git merge dev

然后你得到:

CONFLICT blah blah 
CONFLICT blah blah  
CONFLICT blah blah

有时候冲突多到你数不过来,(当你不负责任的时候)。

我所做的是解决我能找到的所有手动合并,然后在代码库中全局搜索“<<<<<”和“>>>>>”字符序列。过去似乎对我有用。如果您没有任何这些字符串,那么很可能您已经处理了所有需要处理的手动合并。只要您不使用 git merge-Xtheirs-Xours 选项,那么就可以非常安全地确定您已经按照自己的方式成功合并了代码。

在添加文件之前,请确保您在文件中找不到任何“====”。您可以在命令提示符下使用 vim 轻松实现此目的:

vim yourFile
/====
Enter

如果您什么也没找到,那么您可以添加它!

希望对您有所帮助

做:

git diff -S "<<<<<<< HEAD" -S "=======" -S ">>>>>>> $(git name-rev --name-only MERGE_HEAD)" HEAD

这会将工作树的内容与 HEAD 进行比较,但仅当更改中包含三种类型的合并标记中的一种​​或多种时才显示任何输出。

例如,如果您从名为 develop 的分支合并,则未合并的文件可能如下所示:

public void fooTheBar(Bar input) {
<<<<<<< HEAD
  if (input == null) {
    throw new Exception("input cannot be null!");
  }
=======
  Console.WriteLine("preparing to foo the bar");
>>>>>>> develop
  input.foo();
}

所以要确保所有文件都已合并,您需要搜索以下三行中的任意一行:

<<<<<<< HEAD
=======
>>>>>>> develop

这就是命令中 -S 参数的作用。由于它不会总是develop,我们使用命令:

git name-rev --name-only MERGE_HEAD

获取要合并到当前分支的分支的名称。

(您可能只搜索其中一行,但搜索所有三行更可靠,并且会向您展示例如您忘记删除其中一行的情况。)

由于该命令将工作树与 HEAD 进行比较,而不仅仅是与阶段性更改进行比较,因此即使您 git added 的文件仍然包含冲突,这仍然有效。

当然:

git merge --continue

如果您仍然有冲突或在没有 addrm 文件的情况下解决了冲突,将会窒息。

对于新合并:

git grep -En '<{7} HEAD'

自定义命令更加灵活。以下示例将忽略二进制文件:

find -exec grep -EIHn --color=auto '<{7}' {} \;

或将搜索限制为 C++ 文件:

find \( -name '*.cpp' -or -name '*.h' \) -exec grep -EHn --color=auto '<{7}' {} \;

要将这样的脚本变成真正的git命令,在路径中另存为git-conflicts。现在您应该可以使用:

git conflicts

自定义命令的一个优点是可以选择 git-conflicts repository-aware,进一步专门化文件集,甚至找到“TODO”或“BUG”标签等

Git custom commands