git合并没有自动提交


402

是否可以执行git merge,但无需提交?

“ man git merge”这样说:

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 merge时,--no-commit它仍然会自动提交。这是我所做的:

$> ~/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)

随后的内容git log显示了v1.0分支中合并到master的所有提交。

Answers:


616

合并时记下输出-这就是说 Fast Forward

在这种情况下,您想要执行以下操作:

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

7
如果有冲突怎么办。
尔根·保罗

20
@PineappleUndertheSea快进永远不会造成冲突。在没有快速前进的“真实”合并的情况下,--no-commit切换仅在没有冲突发生时才有效,在发生冲突的情况下git将永远不会自动提交。
gronostaj 2015年

38
仅供参考:如果您要合并更改,然后像手动键入要合并的所有更改(而不是传统合并)一样进行提交,则需要rm .git/MERGE_HEAD稍后运行,这将迫使git忘记合并已发生。
乔恩,2016年

7
仅供参考:这是成功合并的示例输出:Automatic merge went well; stopped before committing as requested
kevinarpe

6
显然git merge BRANCHENAME --no-commit --no-ff我的工作区处于git“合并”状态。不太清楚这是什么一样准确,但一个简单的git stash savegit stash pop周期似乎一切都恢复正常; 仅将目标分支中已修改的文件按预期放置到位,而不再处于MERGING状态。
MoonLite

49

您在这里误解了合并的含义。

这样--no-commit可以防止MERGE COMMIT的发生,并且只有在合并两个不同的分支历史时才会发生。在您的示例中,情况并非如此,因为Git表示这是“快进”合并,然后Git仅按顺序应用分支中已经存在的提交。


12
(imo)不一定能消除混乱;我认为这是一次(相对罕见的)文档实际上很清晰的时间:git help merge=>“ --no-commit执行合并但假装合并失败并且不自动提交,使用户有机会检查并进一步调整合并结果,然后再提交。 ” 当然,关键是与--no-ff
michael

6
...也许打破严格的术语并以这种方式描述它会比较容易混淆:执行快速转发的“ git merge”没有合并提交,因为实际上根本没有合并。实际上,这是理想的情况:快进是一件好事,没有多余的“合并提交”是有道理的。这是默认的良好行为,不应禁用它。(用适当的话来说,快进是一种合并,但它不是“真正的合并”。)
迈克尔

4
它是相对于项目策略的,在某些情况下,即使是ff,也具有/强制执行这些额外的“合并提交”很有用,因为您需要标记功能是否包含在主分支中。
Samus_

7
...什么。好吧,我认为git几乎无法挽救。这个答案尤其说服了我尝试Mercurial。
Brian Gordon

24

如果您只想像键入自己一样提交所有更改,--squash也会这样做

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

1
这与git merge v1.0 --no-commit --no-ff
jpierson

2
不,效果不同。Squash使用新哈希创建新的提交。它将分支中的所有提交合并为合并的一个提交。
卡维·西格尔

23

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

git merge branch_name

然后它将说出您的分支在“ #”提交之前,您现在可以弹出这些提交,并使用以下命令将它们放入工作更改中:

git reset @~#

例如,如果在合并之后是1提交,请使用:

git reset @~1

注意:在Windows上,需要使用引号。(如乔希在评论中指出的),例如:

git reset "@~1"

4
在Windows上,需要引号:git reset "@~1"
乔什(Josh)

1

当分支中只有一次提交时,我通常会

git merge branch_name --ff
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.