合并分支时,通常会遇到命令提示符中列出的合并冲突。我知道如何通过查看存在冲突的文件并进行适当的更改来解决问题。我们还有" mergetool"这可能非常有用(虽然不是很擅长使用它)。根据我从不同来源阅读的内容,解决这个问题的步骤是:
这看起来很简单。但是,如果我错过了什么并且不解决它会怎么样?除了使用mergetool之外,Git是否提供了一种检查是否还有其他东西需要修复的方法?
答案 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”标签等选项。