是否有git-合并--dry-run选项?

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

我没有看到任何像git-merge上的--dry-run

272092 次浏览

如前所述,传入--no-commit标志,但为了避免快进提交,也传入--no-ff,如下所示:

$ git merge --no-commit --no-ff $BRANCH

要检查分阶段更改:

$ git diff --cached

您可以撤消合并,即使它是快进合并:

$ git merge --abort

使用git撤消合并非常容易,你甚至不应该担心空运行:

$ git pull $REMOTE $BRANCH# uh oh, that wasn't right$ git reset --hard ORIG_HEAD# all is right with the world

编辑:如下面的注释所述,如果您的工作目录或暂存区域有更改,您可能希望在执行上述操作之前隐藏它们(否则它们将在上面的git reset之后消失)

只需将当前分支与远程分支进行比较,这将告诉您在执行拉/合并时会发生什么变化。

#see diff between current master and remote branchgit diff master origin/master

如果你想从B快进到A,那么你必须确保git log B… A没有显示任何东西,即A没有B没有的东西。但是即使B… A有东西,你仍然可以在没有冲突的情况下合并,所以上面显示了两件事:会有一个快进,因此你不会得到冲突。

我对此的简单暴力解决方案是:

  1. 创建一个“pre-master”分支(当然来自master)

  2. 将您想要的所有内容合并到这个预大师中。
    然后你可以看到合并是如何发生的,而不接触主人。

    • 将pre-master合并到master或
    • 将所有wannabe发布的分支合并到master中

不管怎样,我会听从@orange80的建议。

我只需要实现一个方法来自动查找存储库与其远程之间的冲突。这个解决方案在内存中进行合并,这样它就不会接触索引,也不会接触工作树。我认为这是解决这个问题的最安全的方法。它是这样工作的:

  1. 将遥控器获取到您的存储库。例如:git fetch origin master
  2. 运行git merge-base:git merge-base FETCH_HEAD master
  3. 运行git merge-tree:git merge-tree mergebase master FETCH_HEAD合并是上一步中merge-base打印的十六进制id)

现在假设您想将远程主机与本地主机合并,但您可以使用任何分支。git merge-tree将在内存中执行合并并将结果打印到标准输出。Grep为模式<<>>。或者您可以将输出打印到文件中并检查。如果您发现以“两者都已更改”开头的行,那么很可能会有冲突。

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

您可以在看到有冲突后执行git merge --abort

我假设你只是想知道在实际尝试合并之前你给自己带来了多少麻烦……在合并失败后重置到最后一次提交是相对容易的,所以如果这是预期的方法,我不会感到惊讶。

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

git checkout -b mycrazybranch[change some stuff...]git add .git commit -m "changed some stuff"git format-patch master --stdout > crazy.patchgit checkout mastergit apply crazy.patch --check[all good! cleanup...]rm crazy.patch

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

作为对现有答案的总结,有两种方法可以检查是否会出现合并冲突

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

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

另一种方式:

git merge --no-commit branch2# check the return code heregit merge --abort

我使用git log来查看主分支的功能分支发生了什么变化

git log does_this_branch..contain_this_branch_changes

例如-查看已/未合并到master的功能分支中的提交:

git log master..feature_branch

这可能很有趣:从留档:

如果您尝试合并导致复杂的冲突并希望重新开始,你可以用git合并失败恢复。

但你也可以用幼稚(但缓慢)的方式来做:

rm -Rf /tmp/repositorycp -r repository /tmp/cd /tmp/repositorygit merge ......if successful, do the real merge. :)

(注意:它不能只克隆到 /tmp,你需要一个副本,以确保未提交的更改不会冲突)。

我做了一个别名这样做,工作就像一个魅力,我这样做:

 git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '

现在我只是打电话

git mergetest <branchname>

找出是否有任何冲突。

制作工作副本的临时副本,然后合并到其中,并将两者进行比较。

Git在合并时引入了--ff唯一选项。

来自:http://git-scm.com/docs/git-merge


--ff-仅限

拒绝合并并以非零状态退出,除非当前HEAD已经是最新的,或者合并可以作为快进解决。

执行此操作将尝试合并和快进,如果不能,它会中止并提示您无法执行快进,但不会触及您的工作分支。如果它可以快进,那么它将在您的工作分支上执行合并。此选项在git pull上也可用。因此,您可以执行以下操作:

git pull --ff-only origin branchA #See if you can pull down and merge branchA
git merge --ff-only branchA branchB #See if you can merge branchA into branchB

我使用拉取请求 git命令来执行此操作。它允许您查看合并时发生的每个更改,但在本地或远程存储库上不做任何事情

例如,假设您想将一个名为“功能-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-xfor you to fetch changes up to 841d3b41ad:----------------------------------------------------------------john (2):Adding some layoutRefactoringioserver.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

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

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

假设您想测试从your_branchmaster的合并(我假设您已签出master):

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

这应该会起作用。

如果你犯了这样的错误

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

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


请注意,这将没有实际更改您的工作树(当然除了创建补丁文件之外,但您可以在之后安全地删除它)。从git应用程序留档:

--checkInstead of applying the patch, see if the patch is applicable to thecurrent working tree and/or the index file and detects errors. Turnsoff "apply".

请注意任何比我更聪明/更有经验的人:如果我在这里错了,请一定让我知道,这种方法确实显示出与常规合并不同的行为。奇怪的是,在这个问题存在的8年多里,没有人会提出这个看似显而易见的解决方案。

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

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

git checkout my-branchgit merge origin/target-branch

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

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

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

当有疑问时,您可以始终使用Github接口创建拉取请求并检查它是否表明可以进行干净的合并。

我想看到只是的冲突(在GitHub中还看不到diff3)。从上面的这个答案中大量利用,我想出了这个:

git merge --no-commit --no-ff @{upstream}git grep -l '<<<<<<< HEAD' | xargs -I % sh -c "echo -e '\n\e[93m%\n---\e[0m' && cat %"git merge --abort

对我来说,这是为了检查我的PR。你可以用任何分支替换@{upstream}

我希望这对某人有帮助。