如何“git merge”而不创建合并提交?

问题描述 投票:0回答:7

是否可以执行

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

git git-merge
7个回答
881
投票

注意合并时的输出 - 它表示

Fast Forward

在这种情况下,你想做:

git merge <name-of-branch> --no-commit --no-ff

重要:如果您这样做,那么您将无法对暂存区域中的文件进行任何更改,例如您无法删除/添加文件或对文件进行任何更改。

如果你想合并更改然后提交,就好像你手动输入了合并的所有更改(与传统合并相反),你需要随后运行

rm .git/MERGE_HEAD
,这将迫使 git 忘记合并发生了。


70
投票

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

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


45
投票

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

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

38
投票

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

git merge branch_name

然后它会说你的分支领先于“

#
”提交,你现在可以弹出这些提交并将它们放入工作更改中,方法如下:

git reset @~#

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

git reset @~1

注意:在 Windows 上,需要引号。 (正如Josh在评论中指出的)例如:

git reset "@~1"

6
投票

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

git merge branch_name --ff

2
投票

你也可以这样做

git cherry-pick <commit hash> 

对于每个提交,如果您想保留提交历史记录...

我并没有真正看到一种使用

git merge
命令合并来自另一个分支的多个提交的“好”方法,而无需在某个时刻添加合并提交(即只有您想要包含的提交)


1
投票

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


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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.