2011-12-27 115 views
234

是否有可能做一个“混帐合并”,但没有提交?没有自动提交的git合并

“人混帐合并”这样说:

With --no-commit perform the merge but pretend the merge failed and do not autocommit, 
to give the user a chance to inspect and further tweak the merge result before 
committing. 

但是,当我尝试使用git与合并仍然--no提交它的自动提交。下面是我所做的:

$> ~/git/testrepo$ git checkout master 
Switched to branch 'master' 

$> ~/git/testrepo$ git branch 
* master 
    v1.0 

$> ~/git/testrepo$ git merge --no-commit v1.0 
Updating c0c9fd2..18fa02c 
Fast-forward 
file1 | 1 + 
1 files changed, 1 insertions(+), 0 deletions(-) 

$> ~/git/testrepo$ git status 
# On branch master 
# Your branch is ahead of 'origin/master' by 1 commit. 
# 
nothing to commit (working directory clean) 

随后的“混帐日志”显示所有从1.0分支提交合并成高手。

回答

385

注意,在做合并的输出 - 跟它Fast Forward

在这种情况下,你想做的事:

git merge v1.0 --no-commit --no-ff 
+3

如果有任何疑问,该怎么办? – Michelle 2015-01-03 05:06:42

+14

@PineappleUndertheSea快进不会导致冲突。如果“真正”合并而没有快速转发,'--no-commit'开关仅在没有冲突发生时才有效,如果发生冲突,git将永远不会自动提交。 – gronostaj 2015-01-05 19:20:21

+17

供参考:如果您想要合并更改,然后提交_as,如果您手动键入了所有in_合并的更改(与传统合并相反),则需要运行'rm。git/MERGE_HEAD',这会迫使git忘记合并发生了。 – Jonn 2016-02-27 00:23:23

32

您误解了合并的含义,--no-commit会阻止MERGE COMMIT的发生,并且只会在合并两个发散分支历史记录时发生;在你的例子中,情况并非如此,因为git表明它是一个“快进”合并,然后git只按顺序应用已经存在于分支上的提交。

+10

这不会(imo)一定清除混乱;我认为这是一个(相对较少)的时间,文档实际上很清楚:'git help merge' =>使用'--no-commit'执行合并,但假装合并失败并且不自动提交,为用户提供在提交之前有机会检查并进一步调整合并结果。“关键当然是将它与'--no-ff' – michael 2013-02-12 00:58:57

+3

一起使用...也许从严格的术语中突破并且用这种方式来描述它会更少混淆:一个快速前进的“混帐合并”没有合并提交,因为根本没有合并。这实际上是理想的情况:快进是一件好事,并没有这个额外的“合并承诺”变得有意义。这是很好的默认行为,不应该被禁用。 (用适当的话来说,快进是一种合并,但它不是“真正的合并”。) – michael 2013-03-27 08:32:08

+3

它与项目的策略有关,在某些情况下,有必要/强制这些额外的“合并提交“,即使它是一个ff,因为你需要标记该特征包含在主分支中。 – 2013-06-22 01:28:19

12

如果你只想要一个承诺仿佛要提交所有更改自己输入,--squash会做太多

$ git merge --squash v1.0 
$ git commit 
+0

这是否与'git merge v1.0 --no-commit --no-ff'相同[ – jpierson 2017-08-18 13:30:48

+0

]不,效果不同。 Squash用新的散列创建一个新的提交。它将分支中的所有提交合并为一个提交。 – 2018-01-17 22:49:19

7

我更喜欢这种方式,所以我不需要记住任何罕见的参数。

git merge branch_name 

然后,它会说你的分支是领先对手#承诺,你现在可以弹出这些承诺关闭并投入工作的变化有以下:

git reset @~# 

例如,如果合并后它是1提前使用,使用:

git reset @~1