是否可以执行
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 分支的所有提交。
注意合并时的输出 - 它表示
Fast Forward
。
在这种情况下,你想做:
git merge <name-of-branch> --no-commit --no-ff
重要:如果您这样做,那么您将无法对暂存区域中的文件进行任何更改,例如您无法删除/添加文件或对文件进行任何更改。
如果你想合并更改然后提交,就好像你手动输入了合并的所有更改(与传统合并相反),你需要随后运行
rm .git/MERGE_HEAD
,这将迫使 git 忘记合并发生了。
你误解了这里合并的含义。
--no-commit
可以防止 MERGE COMMIT 发生,并且只有当您合并两个不同的分支历史记录时才会发生这种情况;在你的示例中,情况并非如此,因为 Git 指示这是一个“快进”合并,然后 Git 仅按顺序应用分支上已经存在的提交。
如果您只想在一次提交中提交所有更改,就像您自己键入一样,--squash 也可以
$ git merge --squash v1.0
$ git commit
我更喜欢这种方式,这样我就不需要记住任何罕见的参数。
git merge branch_name
然后它会说你的分支领先于“
#
”提交,你现在可以弹出这些提交并将它们放入工作更改中,方法如下:
git reset @~#
例如,如果合并后提前 1 次提交,请使用:
git reset @~1
注意:在 Windows 上,需要引号。 (正如Josh在评论中指出的)例如:
git reset "@~1"
当分支中只有一个提交时,我通常会这样做
git merge branch_name --ff
你也可以这样做
git cherry-pick <commit hash>
对于每个提交,如果您想保留提交历史记录...
我并没有真正看到一种使用
git merge
命令合并来自另一个分支的多个提交的“好”方法,而无需在某个时刻添加合并提交(即只有您想要包含的提交)
老问题有很多答案,但这对于评论来说太大了。
正如另一个答案提到的,将 v1.0 合并到 master 中会导致快进合并。事实上,确实没有合并。 v1.0 标签有一个提交,其父提交是 master 的提示。刚刚将 master 的指针提前了一次提交。
如果这样做会引入错误的合并,那么您“真正”在 v1.0 标签上给了我们一个错误的提交。
更合适的解决方案是将 v1.0 快速合并到 master 中,添加一个提交到 master 来纠正错误的代码。之后,删除 v1.0 标签并重新创建它,或者重新标记 v1.0 并强制推送该标签。更好的是,从修复 v1.0 的提交中创建一个 v1.0.1 标签。
从编码的角度来看,其他每个答案也都指出你是错误的解决方案。