没有自动提交的Git合并

时间:2011-12-27 03:29:31

标签: git

是否可以执行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。

6 个答案:

答案 0 :(得分:496)

在进行合并时请注意输出 - 它是Fast Forward

在这种情况下,你想做:

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

答案 1 :(得分:40)

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

--no-commit阻止MERGE COMMIT发生,并且仅在合并两个不同的分支历史时发生;在你的例子中并非如此,因为Git表示它是一个“快进”合并,然后Git只按顺序应用已经存在于分支上的提交。

答案 2 :(得分:21)

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

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

答案 3 :(得分:12)

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

git merge branch_name

然后它将通过#commit声明你的分支领先,你现在可以弹出这些提交并将它们放入工作变更中,具体如下:

git reset @~#

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

git reset @~1

答案 4 :(得分:1)

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

git merge branch_name --ff

答案 5 :(得分:0)

有很多答案的老问题,但这对于评论来说太大了。


正如另一个答案所提到的,将 v1.0 合并到 master 会导致快进合并。事实上,真的没有合并。 v1.0 标签有一个提交,其父提交是 master 的提示。刚刚在一次提交前为 master 提前了指针。

如果这样做会导致错误的合并,那么你*真正“在 v1.0 标签上给了我们一个错误的提交。

更合适的解决方案是将 v1.0 快速向前合并到 master 中,添加一个 commit 到 master 纠正错误代码。之后,要么删除 v1.0 标签并重新创建它,要么重新标记 v1.0 并强制推送该标签。更好的是,从修复 v1.0 的提交中创建一个 v1.0.1 标记。

从编码的角度来看,所有其他答案也都指出了错误的解决方案。