git 如何在不实际合并的情况下测试合并

5us2dqdw  于 11个月前  发布在  Git
关注(0)|答案(9)|浏览(181)

有没有办法在两个分支(当前工作分支和主分支)之间模拟git merge,但不做任何更改?
当我必须做一个git merge的时候,我经常会有冲突。有没有办法先模拟合并?

2ic8powd

2ic8powd1#

你可以使用git merge --no-commit来防止合并被提交,如果你不喜欢合并的结果,就重置为原来的head。
如果你不想完成合并,即使它是一个快进(因此根据定义没有冲突),你也可以添加--no-ff

wlp8pajw

wlp8pajw2#

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

git reset --merge

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

git merge --abort


(As the commit message that added that option explains,这是为了与git rebase --abort保持一致而添加的。)

v440hwme

v440hwme3#

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

git checkout master
git checkout -b trial_merge
git merge topic_branch

字符串
完成合并后,很容易看到master中合并后的更改

git diff master


完成后,只需删除trial_merge分支即可

git checkout master
git branch -D trial_merge


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

jdgnovmf

jdgnovmf4#

下面是我找到的解决方案:git merge-tree“在内存中”进行合并,并在不接触工作目录的情况下打印diff,甚至可以在不检查的情况下测试一个分支。

获取合并差异

首先,这样做是为了确保你的仓库知道所有的远程分支:

$ git fetch --all

字符串
现在使用这个bash代码片段来看看分支$branch * 是如何 * 合并到$master中的:

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


没有对你的工作目录或索引做任何更改。这是一个 * 试运行合并 *。

从输出中选择信息

输出是一个diff。如果分支已经被合并,它将是空的。
要查看是否存在冲突,请为<<<使用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'

特性

  • 如果已经合并了分支,则diff将为空
  • 使用grep/sed提取冲突信息
  • 使用origin/feature测试从未使用过的分支
  • 可用于查看2个分支如何分叉

添加到收藏夹

获取合并的diff:
git config --global alias.mergediff '!f(){分支="$1”; into="$2”; git merge-tree $(git merge-base“$分支”“$into”)“$into”“$分支”; };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

xsuvu9jc

xsuvu9jc5#

为什么不直接创建一个一次性的分支(git checkout -b),然后在那里做一个测试合并呢?

bbmckpt7

bbmckpt76#

我用途:

git merge --ff-only

字符串
根据documentation
拒绝合并并以非零状态退出,除非当前HEAD已经是最新的,或者合并可以作为快进解决。
这不是一个真正的模拟,因为在两个分支之间没有冲突的情况下,会有一个快进合并。但是在冲突的情况下,你会得到通知,什么也不会发生。

xxe27gdn

xxe27gdn7#

我最近可以使用git merge --abort。但是,这只能在合并冲突时使用。如果你确定你不想提交,那么使用上面提到的其他方法。

wmvff8tz

wmvff8tz8#

我想添加到excellent answer从@kolypto -(这应该是一个评论,但我没有点)。
man page for git merge-tree在“要避免的错误”下指出:
不要查看生成的顶层树来试图找到哪些文件冲突[.]有许多类型的冲突不能用冲突标记表示(修改/删除,模式冲突,二进制文件两边都改变了,文件/目录冲突,各种重命名冲突排列等)。
.所以在git merge-tree的输出上执行fgrep '<<<'并不是确定是否存在冲突的正确方法。相反,您应该检查git merge-tree的退出代码:
对于成功的、无冲突的合并,退出状态为0。当合并有冲突时,退出状态为1。如果由于某种错误而无法完成(或启动)合并,则退出状态为0或1以外的值(并且输出未指定)。
范例:

#!/bin/bash

branch='myFeatureBranch'
ret=0
mergeTest=`git merge-tree --write-tree master $branch` || ret=$?
if [ ! $ret -eq 0 ];then
   echo "Merge would result in conflicts:"
   echo "$mergeTest" | grep CONFLICT
   ## Do something useful here
   exit 1
fi

字符串

b4lqfgs4

b4lqfgs49#

我不知道这是否是你的情况,但你的问题让我想起,有时我开始一个功能,我在几天内提交,我多次合并开发。

在这一点上,我失去了对我更改的确切文件的控制,只有当我的功能关闭并且我的代码开始开发时,我才会知道。
在这种情况下,了解您做了哪些修改(而不是合并)的一个好方法是使用Sourcetree。
您必须在基础分支上单击右键并选择Diff Against Current


的数据
然后源树将显示所有的修改,如果你将你的分支合并到基础分支中,这些修改将被合并。



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

相关问题