如何检查 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 add
ed 的文件仍然包含冲突,这仍然有效。
当然:
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 repository-aware,进一步专门化文件集,甚至找到“TODO”或“BUG”标签等
合并分支时,通常会在命令提示符中列出合并冲突。我知道如何通过查看有冲突的文件并进行适当的更改来解决问题。我们还有 "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 add
ed 的文件仍然包含冲突,这仍然有效。
当然:
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 repository-aware,进一步专门化文件集,甚至找到“TODO”或“BUG”标签等