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

时间:2016-12-20 15:59:02

标签: git git-merge

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

  • 修复冲突
  • 添加

这看起来很简单。但是,如果我错过了什么并且不解决它会怎么样?除了使用mergetool之外,Git是否提供了一种检查是否还有其他东西需要修复的方法?

4 个答案:

答案 0 :(得分:6)

执行:

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 add编辑了仍包含冲突的文件,这也会有效。

答案 1 :(得分:0)

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

git checkout master
git merge dev

然后你得到:

CONFLICT blah blah 
CONFLICT blah blah  
CONFLICT blah blah

有时会出现比你可以计算的更多的冲突(当你不负责任的时候)。

我所做的就是解决我能找到的所有手动合并,然后我全球搜索&#34;&lt;&lt;&lt;&lt;&lt;&lt;&#34;和&#34;&gt;&gt;&gt;&gt;&gt;&#34;代码库中的字符序列。似乎过去对我有用了就好了。如果您没有任何这些字符串,那么您很可能已经处理了需要处理的所有手动合并。只要您不使用-Xtheirs的{​​{1}}和-Xours选项,那么您已成功合并代码是非常安全的。你自己的条件。

答案 2 :(得分:0)

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

vim yourFile
/====
Enter

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

希望有所帮助

答案 3 :(得分:0)

当然:

git merge --continue
如果您仍然有冲突或已解决冲突而又没有 add rm 文件,则

会阻塞。

对于新合并:

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 存储库感知,进一步专门化文件集,甚至找到“ TODO”或“ BUG”标签等选项。

Git custom commands