无自动提交的Git合并

无自动提交的Git合并,git,Git,是否可以进行git合并,但不进行提交 “man-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 merge和--no commit时,它仍然会

是否可以进行
git合并
,但不进行提交

“man-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 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日志
显示了合并到master中的v1.0分支的所有提交。

您误解了合并的含义


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

注意执行合并时的输出-它是说
快进

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

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

如果您只想在一次提交中提交所有更改,就像您自己键入一样,-squash也可以

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

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

git merge branch_name
然后,它会说您的分支在“
#
”提交之前,您现在可以弹出这些提交并将它们放入工作更改中,如下所示:

git reset @~#
例如,如果合并后为1提前提交,请使用:

git reset @~1
注意:在Windows上,需要引号。(如评论中所述)例如:


当分支中只有一个提交时,我通常会这样做

git merge branch_name --ff

有很多答案的老问题,但这个问题太大了,无法评论


正如另一个答案所提到的,将v1.0合并到master中会导致快进合并。事实上,确实没有合并。v1.0标记有一个commit,其父commit是master的提示。在一次提交之前,已将指向master的指针提前了一步

如果这样做会导致错误的合并,那么您“真正”在v1.0标记上给了我们错误的提交

更合适的解决方案是将v1.0快速合并到主控中,即向主控添加一个提交以更正错误代码。然后删除v1.0标记并重新创建它,或者重新标记v1.0并强制推送标记。更好的是,从修复v1.0的提交中创建一个v1.0.1标记


从编码的角度来看,每一个其他答案都会给你指出错误的解决方案。

这不一定会(imo)消除混淆;我认为这是文档真正清晰的一次(相对罕见):
git help merge
=>“With
--no commit
执行合并,但假装合并失败,不自动提交,在提交之前,让用户有机会检查并进一步调整合并结果。”当然,关键是将其与
--no ff
结合使用……也许打破严格的术语并用“git merge”这样的方式来描述会更容易混淆“这样做,快进没有合并提交,因为实际上根本没有合并。这实际上是理想的情况:快进是一件好事,没有这种额外的“合并提交”是有意义的。这是良好的默认行为,不应禁用。(用恰当的说法,快进是一种合并,但它不是一种“真正的合并”。)它与项目的策略相关,在某些情况下,即使是ff,拥有/强制这些额外的“合并提交”也是有用的,因为您需要将特性包含到主分支中……什么。好吧,我觉得git几乎卖不出去。这个答案尤其说服我尝试Mercurial。如果有冲突怎么办?@Tesea快进中的菠萝从不引起冲突。如果是“真实”合并,而不是快进,则只有在不发生冲突的情况下,
--no commit
开关才有效,如果发生冲突,git将永远不会自动提交。仅供参考:如果要合并更改,然后提交,就像手动键入所有合并的更改一样(与传统合并相反)您需要在之后运行
rm.git/MERGE\u HEAD
,这将迫使git忘记发生了合并。仅供参考:以下是成功合并的示例输出:
自动合并进行得很顺利;在按请求提交之前停止
显然
git merge BRANCHENAME--no commit--no ff
使我的工作区处于git“MERGING”状态。不太清楚这到底是怎么回事,但一个简单的
git-stash-save
git-stash-pop
循环似乎能让一切恢复正常;目标分支中的修改文件已按预期就位,不再处于合并状态。这与git merge v1.0的效果相同吗?不提交-不ff不,不同的效果。Squash使用新哈希创建新提交。它将一个分支中的所有提交合并为一个提交。您能再解释一下区别吗?在windows上,需要加引号:
git reset“@~1”
git merge branch_name --ff