有没有办法在两个分支(当前工作分支和主分支)之间模拟git merge,但不做任何更改?当我必须做一个git merge的时候,我经常会有冲突。有没有办法先模拟合并?
git merge
2ic8powd1#
你可以使用git merge --no-commit来防止合并被提交,如果你不喜欢合并的结果,就重置为原来的head。如果你不想完成合并,即使它是一个快进(因此根据定义没有冲突),你也可以添加--no-ff。
git merge --no-commit
--no-ff
wlp8pajw2#
我不认为有一种方法可以模拟在你尝试合并之前会发生什么。但是,如果你在合并之前确保git status的输出是空的,那么继续尝试是很安全的。如果你遇到冲突,你可以立即回到你之前的状态:
git status
git reset --merge
字符串从git 1.7.4开始,你也可以通过执行以下操作来中止合并:
git merge --abort
型(As the commit message that added that option explains,这是为了与git rebase --abort保持一致而添加的。)
git rebase --abort
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
型这样,主分支永远不会改变。
jdgnovmf4#
下面是我找到的解决方案:git merge-tree“在内存中”进行合并,并在不接触工作目录的情况下打印diff,甚至可以在不检查的情况下测试一个分支。
git merge-tree
首先,这样做是为了确保你的仓库知道所有的远程分支:
$ git fetch --all
字符串现在使用这个bash代码片段来看看分支$branch * 是如何 * 合并到$master中的:
$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:
>>>
sed
$ git merge-tree $(git merge-base $branch master) master $branch | \ sed -ne '/^\+<<</,/^\+>>>/ p'
型
origin/feature
获取合并的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
xsuvu9jc5#
为什么不直接创建一个一次性的分支(git checkout -b),然后在那里做一个测试合并呢?
bbmckpt76#
我用途:
git merge --ff-only
字符串根据documentation:拒绝合并并以非零状态退出,除非当前HEAD已经是最新的,或者合并可以作为快进解决。这不是一个真正的模拟,因为在两个分支之间没有冲突的情况下,会有一个快进合并。但是在冲突的情况下,你会得到通知,什么也不会发生。
xxe27gdn7#
我最近可以使用git merge --abort。但是,这只能在合并冲突时使用。如果你确定你不想提交,那么使用上面提到的其他方法。
wmvff8tz8#
我想添加到excellent answer从@kolypto -(这应该是一个评论,但我没有点)。man page for git merge-tree在“要避免的错误”下指出:不要查看生成的顶层树来试图找到哪些文件冲突[.]有许多类型的冲突不能用冲突标记表示(修改/删除,模式冲突,二进制文件两边都改变了,文件/目录冲突,各种重命名冲突排列等)。.所以在git merge-tree的输出上执行fgrep '<<<'并不是确定是否存在冲突的正确方法。相反,您应该检查git merge-tree的退出代码:对于成功的、无冲突的合并,退出状态为0。当合并有冲突时,退出状态为1。如果由于某种错误而无法完成(或启动)合并,则退出状态为0或1以外的值(并且输出未指定)。范例:
fgrep '<<<'
#!/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
字符串
b4lqfgs49#
我不知道这是否是你的情况,但你的问题让我想起,有时我开始一个功能,我在几天内提交,我多次合并开发。
在这一点上,我失去了对我更改的确切文件的控制,只有当我的功能关闭并且我的代码开始开发时,我才会知道。在这种情况下,了解您做了哪些修改(而不是合并)的一个好方法是使用Sourcetree。您必须在基础分支上单击右键并选择Diff Against Current:
Diff Against Current
的数据然后源树将显示所有的修改,如果你将你的分支合并到基础分支中,这些修改将被合并。
的当然,它不会向您显示冲突,但它是合并中的一个有用工具。
9条答案
按热度按时间2ic8powd1#
你可以使用
git merge --no-commit
来防止合并被提交,如果你不喜欢合并的结果,就重置为原来的head。如果你不想完成合并,即使它是一个快进(因此根据定义没有冲突),你也可以添加
--no-ff
。wlp8pajw2#
我不认为有一种方法可以模拟在你尝试合并之前会发生什么。但是,如果你在合并之前确保
git status
的输出是空的,那么继续尝试是很安全的。如果你遇到冲突,你可以立即回到你之前的状态:字符串
从git 1.7.4开始,你也可以通过执行以下操作来中止合并:
型
(As the commit message that added that option explains,这是为了与
git rebase --abort
保持一致而添加的。)v440hwme3#
如果我想将主题分支上的更改与master进行比较,我发现执行以下操作最简单也最安全:
字符串
完成合并后,很容易看到master中合并后的更改
型
完成后,只需删除trial_merge分支即可
型
这样,主分支永远不会改变。
jdgnovmf4#
下面是我找到的解决方案:
git merge-tree
“在内存中”进行合并,并在不接触工作目录的情况下打印diff,甚至可以在不检查的情况下测试一个分支。获取合并差异
首先,这样做是为了确保你的仓库知道所有的远程分支:
字符串
现在使用这个bash代码片段来看看分支
$branch
* 是如何 * 合并到$master
中的:型
没有对你的工作目录或索引做任何更改。这是一个 * 试运行合并 *。
从输出中选择信息
输出是一个diff。如果分支已经被合并,它将是空的。
要查看是否存在冲突,请为
<<<
使用grep:型
要提取
<<<
和>>>
之间的冲突差异usesed
to extract lines:型
特性
origin/feature
测试从未使用过的分支添加到收藏夹
获取合并的diff:
git config --global alias.mergediff '!f(){分支="$1”; into="$2”; git merge-tree $(git merge-base“$分支”“$into”)“$into”“$分支”; };f '
使用方法:
型
获取合并冲突:
git config --global alias.mergetest '!f(){ git mergediff $@| sed -ne“/^+<</,/^+>/ p”; };f '
使用方法:
型
xsuvu9jc5#
为什么不直接创建一个一次性的分支(git checkout -b),然后在那里做一个测试合并呢?
bbmckpt76#
我用途:
字符串
根据documentation:
拒绝合并并以非零状态退出,除非当前HEAD已经是最新的,或者合并可以作为快进解决。
这不是一个真正的模拟,因为在两个分支之间没有冲突的情况下,会有一个快进合并。但是在冲突的情况下,你会得到通知,什么也不会发生。
xxe27gdn7#
我最近可以使用
git merge --abort
。但是,这只能在合并冲突时使用。如果你确定你不想提交,那么使用上面提到的其他方法。wmvff8tz8#
我想添加到excellent answer从@kolypto -(这应该是一个评论,但我没有点)。
man page for
git merge-tree
在“要避免的错误”下指出:不要查看生成的顶层树来试图找到哪些文件冲突[.]有许多类型的冲突不能用冲突标记表示(修改/删除,模式冲突,二进制文件两边都改变了,文件/目录冲突,各种重命名冲突排列等)。
.所以在
git merge-tree
的输出上执行fgrep '<<<'
并不是确定是否存在冲突的正确方法。相反,您应该检查git merge-tree
的退出代码:对于成功的、无冲突的合并,退出状态为0。当合并有冲突时,退出状态为1。如果由于某种错误而无法完成(或启动)合并,则退出状态为0或1以外的值(并且输出未指定)。
范例:
字符串
b4lqfgs49#
我不知道这是否是你的情况,但你的问题让我想起,有时我开始一个功能,我在几天内提交,我多次合并开发。
在这一点上,我失去了对我更改的确切文件的控制,只有当我的功能关闭并且我的代码开始开发时,我才会知道。
在这种情况下,了解您做了哪些修改(而不是合并)的一个好方法是使用Sourcetree。
您必须在基础分支上单击右键并选择
Diff Against Current
:的数据
然后源树将显示所有的修改,如果你将你的分支合并到基础分支中,这些修改将被合并。
的
当然,它不会向您显示冲突,但它是合并中的一个有用工具。