如何在不先合并的情况下测试合并


Answers:


131

在尝试合并之前,我不认为有什么方法可以模拟发生的情况。但是,如果git status在合并之前确定的输出为空,则继续尝试是非常安全的。如果发生冲突,您可以使用以下方法立即回到以前的状态:

git reset --merge

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

git merge --abort

(正如添加该选项的提交消息所解释的添加该消息是为了与之保持一致,git rebase --abort依此类推。)


4
@Amber的答案恰好是在回答“如何模拟合并”。--no-commit在我看来,使用起来要容易得多
萨米拉德(Samirahmed)2013年

14
@samirahmed:@Amber确实从字面上回答了这个问题,尽管--no-commit您仍在更改索引和工作树,但这并不完全是“不做任何更改” :)我的意思是,当人们问这种问题时问题,通常是因为他们不知道查看合并方式的最佳方法是尝试合并,通常是因为他们不知道恢复之前的状态有多么容易如果发现有问题。
马克·隆air13年

2
我不知道是否在最新版本的git中添加了它,但是在文档(1.8.4)中它声明“ git merge --abort等于git reset --merge何时MERGE_HEAD存在”,所以更容易记住的是:)
Samuel Meacham

@SamuelMeacham:感谢您指出-它是在1.7.4中引入的。我已经更新了答案。谢谢!
Mark Longair 2013年

这个建议对我没有任何帮助,在git 1.9.4上。
djangofan 2014年

137

您可以使用 git merge --no-commit阻止合并的实际提交,如果您不喜欢合并的方式,只需将其重置为原始标题即可。

如果您绝对不希望完成合并,即使它是快速进行的(按照定义,因此也没有冲突),也可以添加--no-ff


我认为那不git merge --abort存在-也许你是说git reset --merge什么?
Mark Longair 2011年

不,我只是忘了,不像rebase没有--abortfor git merge
琥珀

7
我也会穿上--no-ff。为了防止ff合并发生。
安迪(Andy)

1
@安迪的--no-ff是相当多的强制性这里,如--no-commit不停止快进的改变。
jackr 2015年

1
@Anant Anand Gupta-这是一个很好的技巧,但是应该是:git config --global alias.tm“ merge --no-commit --no-ff”
pasx

109

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

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

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


4
您也可以做git checkout --detach任何测试。以后,如果您想保留更改,请执行git checkout -b new_branch。如果您想放弃所做的更改,请签出您想要的任何分支(git checkout master)。
Shayan Toqraee

If topic_branch很大(如果您一开始就遇到这个问题,可能就是这种情况),diff master如果合并会引起冲突,则输出可能太大而您无法察觉。
新月新鲜

我绝对很喜欢这个……安全又简单。
leo

4

我用 :

git merge --ff-only

根据文档

除非当前HEAD已经是最新的,否则合并将以非零状态退出,否则合并可以作为快进进行解析。

这并不是真正的模拟,因为如果两个分支之间没有冲突,则会进行快速合并。但是在发生冲突的情况下,您会被告知并且什么也不会发生。


4

git merge --abort最近我已经可以使用了。但是,仅在存在合并冲突时才能使用。如果您确定不想提交,请使用上面提到的其他方法。


1
上面提到的其他哪些方法?他们都提到git merge --abort。您应该将来通过指定由谁编写您所指的答案来证明您的答案。
迈克尔·富尔顿

3

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


1
您的建议实际上是伊恩简洁表达的答案:)
tzot18年

0

我不知道这是否是你的情况,但是您的问题记得我有时我会启动一个功能,我几天来提交,然后将开发合并多次。

在这一点上,我失去了对更改的确切文件的控制权,只有在关闭功能并开发代码后,我才知道它。

在这种情况下,一种很好的方式来知道您进行了哪些修改(不是从合并中进行的其他修改)正在使用Sourcetree。

您必须在基本分支上单击右键,然后选择Diff Against Current

Sourcetree的功能,可知道两个分支之间的差异

然后,如果您将分支合并到基础分支中,则sourcetree将显示所有将被合并的修改。

结果

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.