有没有办法在两个分支(当前工作分支和主分支)之间模拟git merge
,但不做任何更改?
当我必须制作git merge
时,我经常会遇到冲突。有没有办法先模拟合并?
答案 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
拒绝以非零状态合并和退出,除非当前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'
origin/feature
测试您从未使用过的分支获取合并的差异:
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)