是否可以执行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。
答案 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 标记。
从编码的角度来看,所有其他答案也都指出了错误的解决方案。