Git合并不自动提交

ktca8awb  于 2023-03-28  发布在  Git
关注(0)|答案(7)|浏览(390)

有没有可能做一个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中。

r7s23pms

r7s23pms1#

注意合并时的输出-它说Fast Forward
在这种情况下,您需要执行以下操作:

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

重要信息:如果你这样做,那么你不能做任何改变的文件在暂存区,例如,你不能删除/添加文件或作出任何改变的文件。

如果你想合并修改,然后提交,就好像你已经手动输入了所有合并的修改(而不是传统的合并),你需要在之后运行rm .git/MERGE_HEAD,这将迫使git忘记合并的发生。

4sup72z8

4sup72z82#

你误解了合并的意义。
--no-commit阻止了MERGE COMMIT的发生,只有当你合并两个不同的分支历史时才会发生;在你的例子中,情况并非如此,因为Git指出这是一个“快进”合并,然后Git只按顺序应用已经存在于分支上的提交。

b5lpy0ml

b5lpy0ml3#

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

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

c3frrgcw4#

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

git merge branch_name

然后它会说你的分支领先“#“提交,你现在可以弹出这些提交并将它们放入工作更改中,如下所示:

git reset @~#

例如,如果合并后它提前提交了1次,则用途:

git reset @~1

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

git reset "@~1"
vof42yt1

vof42yt15#

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

git merge branch_name --ff
lskq00tm

lskq00tm6#

你也可以

git cherry-pick <commit hash>

如果你想保存提交历史记录
我真的没有看到一个“好”的方法来合并来自另一个分支的多个提交,使用git merge命令,而不需要在某个时候添加一个合并提交(即只包含你想要包含的提交)

n3h0vuf2

n3h0vuf27#

有很多答案的老问题,但这太大了,无法评论。
正如另一个答案提到的,将v1.0合并到master会导致快进合并。事实上,真的没有合并。v1.0标签有一个提交,它的父提交是master的尖端。get只是将master的指针提前了一个提交。
如果这样做会引入一个错误的合并,那么你真正“给我们的是一个错误的v1.0标签提交。
更合适的解决方案是将v1.0快速合并到master中,然后向master添加一个提交来纠正错误代码。之后,要么删除v1.0标签并重新创建它,要么重新标记v1.0并强制推送标签。更好的方法是,从修复v1.0的提交创建一个v1.0.1标签。
从编码的Angular 来看,其他的答案也都指向了错误的解决方案。

相关问题