git可以告诉我合并是否会在没有实际合并的情况下发生冲突?

Pen*_*enz 176 git

是否可以在不触及工作树的情况下知道合并是否会发生冲突?我不想触摸工作树,因为我不想让它签出.如果我想在几个分支机构看到这些信息,那将需要很长时间.

Ian*_*son 98

我假设你只是想知道在实际尝试合并之前你遇到了多少麻烦......并且在合并失败后重置到最后一次提交相对容易,所以我不会感到惊讶是预期的方法.

也就是说,如果您真的不想触摸工作树中的现有文件 - 您可以创建一个补丁并对目标分支进行测试.这样做的好处是可以准确显示对哪些文件进行了哪些更改 - 只需在文本编辑器中打开补丁文件即可.

git checkout -b mycrazybranch
[change some stuff...]
git add .
git commit -m "changed some stuff"
git format-patch master --stdout > crazy.patch
git checkout master
git apply crazy.patch --check
[all good! cleanup...]
rm crazy.patch
Run Code Online (Sandbox Code Playgroud)

如您所见,这将创建一个补丁文件,然后您可以使用--check进行测试并查看是否存在任何错误,然后删除补丁文件.

  • 有效!如果你这样做,你甚至不需要临时文件:`git format-patch master --stdout | git-apply --check -` (50认同)
  • 这对我来说不准确 - git在应用补丁时无法使用'递归'合并策略,所以它有冲突,但它与'git merge'一起工作正常. (9认同)
  • @Penz在我的git v1.8.1.1中,`git-apply`不起作用。它必须显示为“ git apply”。 (5认同)
  • 另一个问题是,补丁文件为在新分支中创建的新文件提供了错误。 (2认同)

man*_*lds 76

git merge --abort看到有冲突后你可以做.

  • 是的,但即使没有冲突,如果你不想应用它也行不通.就像在字面上只是_check_. (22认同)
  • @SamuelRobert换句话说:`git merge other-branch --no-commit --no-ff; git merge --abort` - 似乎工作得很好. (10认同)
  • @OllieFord如何使用--no-commit --no-ff选项? (3认同)

Con*_*Guo 58

作为现有答案的摘要,有两种方法可以检查是否存在合并冲突

git format-patch $(git merge-base branch1 branch2)..branch2 --stdout | git apply --3way --check -

注意,branch1当你运行上面的命令时,你当前的分支应该是

其他方式:

git merge --no-commit branch2
# check the return code here
git merge --abort
Run Code Online (Sandbox Code Playgroud)

  • 实际上,你的第一个命令没有做正确的3向合并,所以你会得到一堆误报.第二种方式效果更好. (8认同)
  • 如果用`HEAD`替换`branch1`,你的命令可以在任何分支上运行. (2认同)

Ale*_*dre 23

不完全是那样的.但是您可以使用--no-commit选项,因此它不会在合并后自动提交结果.通过这种方式,您可以检查并在需要时撤消合并,而不会弄乱提交树.