我正在合并一个可能有很多冲突的远程分支机构。我怎么知道它是否会有冲突?

我没看到任何类似于,git合并的预演。


当前回答

不完全是那样的。但是您可以使用——no-commit选项,这样它就不会在合并后自动提交结果。通过这种方式,您可以检查合并,如果需要的话,还可以在不破坏提交树的情况下撤消合并。

其他回答

我使用git日志来查看从主分支到特性分支上发生了什么变化

git log does_this_branch..contain_this_branch_changes

例如,查看哪些提交在一个已经/没有被合并到master的特性分支中:

git log master..feature_branch

我知道这在理论上是跑题的,但对于从谷歌搜索到这里的人来说,实际上是非常切题的。

当有疑问时,你可以使用Github界面创建一个pull-request,并检查它是否表明干净的合并是可能的。

我的解决方案是向后归并。

不要将您的分支合并到远程“目标”分支中,而是将该分支合并到您的分支中。

git checkout my-branch
git merge origin/target-branch

你将看到是否有任何冲突,并可以计划如何解决它们。

在这之后,你可以通过git merge—abort终止合并,或者(如果没有任何冲突并且合并已经发生)通过git reset—hard HEAD~1回滚到之前的提交

我很惊讶没有人建议使用补丁。

假设你想测试从your_branch到master的合并(我假设你已经检查了master):

$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch

这样应该可以了。

如果你得到这样的错误

error: patch failed: test.txt:1
error: test.txt: patch does not apply

这意味着补丁并不成功,合并会产生冲突。没有输出意味着补丁是干净的,您可以轻松地合并分支


请注意,这实际上不会改变您的工作树(当然除了创建补丁文件,但您可以安全地删除之后)。在git-apply文档中:

--check
    Instead of applying the patch, see if the patch is applicable to the
    current working tree and/or the index file and detects errors. Turns
    off "apply".

提醒那些比我更聪明/对git更有经验的人:如果我错了,请告诉我,这个方法确实显示出与常规合并不同的行为。奇怪的是,这个问题已经存在8年多了,没有人会提出这个看似显而易见的解决方案。

我使用request-pull git命令来做到这一点。它允许您查看合并时可能发生的每个更改,但无需对本地或远程存储库进行任何操作。

例如,假设您想将一个名为“feature-x”的分支合并到您的主分支中

git request-pull master origin feature-x

将向您展示将发生什么(不做任何事情)的摘要:

The following changes since commit fc01dde318:
    Layout updates (2015-06-25 11:00:47 +0200)
are available in the git repository at:
    http://fakeurl.com/myrepo.git/ feature-x
for you to fetch changes up to 841d3b41ad:
----------------------------------------------------------------
john (2):
    Adding some layout
    Refactoring
ioserver.js            |   8 +++---
package.json           |   7 +++++-
server.js              |   4 +--
layout/ldkdsd.js       | 277 +++++++++++++++++++++++++++++++++++++
4 files changed, 289 insertions(+), 7 deletions(-)
create mode 100644 layout/ldkdsd.js

如果您添加-pparameter,您还将获得完整的补丁文本,就像您对每个更改的文件执行git diff一样。