如何在没有实际合并的情况下测试合并

时间:2011-09-20 11:12:46

标签: git merge

有没有办法在两个分支(当前工作分支和主分支)之间模拟git merge,但不做任何更改?

当我必须制作git merge时,我经常会遇到冲突。有没有办法先模拟合并?

8 个答案:

答案 0 :(得分:120)

您可以使用git merge --no-commit来阻止合并实际提交,如果您不喜欢合并的效果,只需重置为原始头。

如果您肯定不想完成合并,即使它是快进的(因此根据定义没有冲突),您也可以添加--no-ff

答案 1 :(得分:114)

我认为有一种方法可以模拟在尝试合并之前会发生什么。但是,如果在进行合并之前确保git status的输出为空,那么继续尝试它是非常安全的。如果您遇到冲突,您可以立即回到以前的状态:

git reset --merge

从git 1.7.4开始,您也可以通过执行以下操作来中止合并:

git merge --abort

(作为the commit message that added that option explains,添加此内容是为了与git rebase --abort保持一致等等。)

答案 2 :(得分:87)

如果我想将主题分支上的更改与主分支进行比较,我发现执行以下操作最简单,最安全:

git checkout master
git checkout -b trial_merge
git merge topic_branch

完成合并后,很容易看到来自主

的合并更改
git diff master

完成后,只需删除trial_merge分支

即可
git checkout master
git branch -D trial_merge

这样,主分支永远不会改变。

答案 3 :(得分:4)

我最近能够使用git merge --abort。但是,只有在发生合并冲突时才能使用此选项。如果您确定不想提交,请使用上面提到的其他方法。

答案 4 :(得分:4)

我用:

git merge --ff-only

根据documentation

  

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

它不是真正的模拟,因为在两个分支之间没有冲突的情况下会有快进合并。但是如果发生冲突,您将被告知并且不会发生任何事情。

答案 5 :(得分:3)

为什么不创建一个一次性分支(git checkout -b),并在那里进行测试合并?

答案 6 :(得分:2)

这是我找到的解决方案:git merge-tree确实合并了“内存中”并打印了diff,而没有触及您的工作目录。您甚至可以测试分支而无需将其检出。

获取合并差异

首先,执行此操作以确保您的存储库了解所有远程分支:

$ git fetch --all

现在使用此bash代码片段查看分支$branch 合并到$master中的方式:

$ branch='feature'
$ git merge-tree $(git merge-base $branch master) master $branch

不对您的工作目录或索引进行任何更改。这是空运行合并

从输出中选择信息

输出为差异。 如果分支已合并,它将为空。

要查找是否存在冲突,请对<<<进行grep:

$ git merge-tree $(git merge-base $branch master) master $branch | fgrep '<<<'

要提取冲突差异,请在<<<>>>之间使用use sed to extract lines

$ git merge-tree $(git merge-base $branch master) master $branch | \
  sed -ne '/^\+<<</,/^\+>>>/ p'

功能

  • 如果分支已经合并,差异将为空
  • 使用grep / sed提取冲突信息
  • 使用origin/feature测试您从未使用过的分支
  • 可用于查看2个分支的分支方式

将其添加到收藏夹

获取合并的差异:

git config --global alias.mergediff'!f(){branch =“ $ 1”; into =“ $ 2”; git merge-tree $(git merge-base“ $ branch”“ $ into”)“ $ into”“ $ branch”; }; f'

用法:

$ git mergediff <feature-branch> <merge-into>
$ git mergediff feature master

获取合并冲突:

git config --global alias.mergetest'!f(){git mergediff $ @ | sed -ne“ / ^ + <<< /,/ ^ + >>> / p”; }; f'

用法:

$ git mergetest <feature-branch> <merge-into>
$ git mergetest feature master

答案 7 :(得分:0)

我确切地知道这不是你的情况,但是你的问题记住了我有时候我会开始一个功能,我承诺这些日子并且我多次合并了它的开发。

在这一点上,我失去了对我改变的确切文件的控制权,只有当我的功能关闭并且我的代码开始发展时我才会知道。

在这种情况下,知道你做了哪些修改(不是合并中的其他修改)的好方法是使用Sourcetree。

您必须使用基本分支上的右键单击并选择Diff Against Current

Sourcetree's feature to know the diff between two branches

然后,如果将分支合并到基本分支,sourcetree将向您显示将要合并的所有修改。

Results

当然,它不会向您展示冲突,但它在合并中是一个有用的工具。