我在进行git合并时经常遇到冲突。是否有一种方法可以先模拟合并来避免这种情况?
你可以使用 git merge --no-commit
命令来防止合并被实际提交,如果你不喜欢合并的结果,只需重置到原始版本。
如果你绝对不想完成合并,即使它是一个快进合并(因此根据定义没有冲突),你也可以添加 --no-ff
。
git merge --abort
不存在。也许你的意思是 git reset --merge
? - Mark Longairrebase
不同的是 git merge
没有 --abort
选项。 - Amber--no-ff
。这样可以防止快进式合并的发生。 - Andy--no-ff
在这里几乎是强制性的,因为--no-commit
不能阻止快进更改。 - jackr我认为没有一种方法可以模拟合并操作前会发生什么。但是,如果你确保在执行合并操作前git status
的输出为空,那么尝试合并操作是非常安全的。如果出现冲突,你可以使用以下命令立即回到之前的状态:
git reset --merge
自Git 1.7.4版本起,您也可以通过执行以下操作来中止合并过程:git merge --abort
(正如添加该选项的提交消息所解释的那样,这是为了与git rebase --abort
等命令保持一致性。)
--no-commit
会改变索引和工作树,这并不完全等同于"没有进行任何更改" :) 我想表达的是,当人们问这种类型的问题时,通常是因为他们不知道查看合并结果最好的方法是_尝试合并_,往往是因为他们不知道如果出现问题,回到之前的状态有多容易。 - Mark Longairgit merge --abort
等同于git reset --merge
”,所以无论哪个更容易记住 :) - Samuel Meacham如果我想将一个主题分支上的更改与主分支进行比较,我觉得最简单且最安全的方法是执行以下操作:
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
这样,主分支就永远不会改变。
git checkout --detach
命令测试任何想要的内容。如果想要保留更改,可以使用 git checkout -b new_branch
命令创建一个新分支;如果想要放弃更改,则可以切换到任何分支(例如 git checkout master
)。 - Shayan Toqraeetopic_branch
很大(如果您首先看到此问题,这可能是情况),则diff master
输出可能太大,无法通过目测判断合并是否会导致冲突。 - Crescent Fresh这是我找到的解决方案: git merge-tree
在内存中合并并打印差异,而不会触及您的工作目录。您甚至可以在不检出分支的情况下测试分支。
首先,执行以下操作以确保仓库了解所有远程分支:
$ git fetch --all
现在使用此 bash 片段查看分支 $branch
将如何合并到 $master
中:
现在使用此 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 '<<<'
要提取冲突差异,使用sed
提取在<<<
和>>>
之间的行:
$ 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
我使用:
git merge --ff-only
如果两个分支之间没有冲突,那么会进行快进合并,因此它不是真正的模拟。但如果存在冲突,您将会收到通知,但不会发生任何事情。如果当前HEAD已经是最新的或合并可以被解决为快进,则拒绝合并并以非零状态退出。
最近我学会了使用git merge --abort
。不过,只有在合并冲突时才能使用这个命令。如果你确定不想提交,那么请使用上述其他方法。
git merge --abort
。为了使你的回答具有未来性,你应该指定你所参考的答案是由谁编写的。 - Michael Fultongit merge-tree
的man页面中提到,在“应避免的错误”部分:
所以,在不要查看生成的顶层树以尝试找到冲突的文件[...]冲突标记无法表示的冲突类型有很多(修改/删除、模式冲突、二进制文件在两边都发生了更改、文件/目录冲突、各种重命名冲突排列等)
git merge-tree
的输出上执行fgrep '<<<'
并不是确定是否存在冲突的正确方法。相反,你应该检查git merge-tree
的退出代码。#!/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