Git rebase --merge仅使用部分提交进行操作

6

我做了几个提交,比如说提交A、B、C。现在我只想把提交A和B推送到远程仓库。(并将提交C保留以便在稍后合并和推送) 在推送之前,我需要运行以下命令:

git fetch origin master
git rebase --merge FETCH_HEAD

问题是上述命令会要求我解决提交C的冲突,但我现在不打算推送它。

是否可以在不处理提交C的情况下进行变基?

谢谢

2个回答

8

变基前的保存

为了推迟解决冲突,保存提交的最简单方法是将其打上标签,这样您以后就可以引用该提交:

$ git tag save-commitC <sha1>

不包含提交 C 的变基

在保存了一个引用后,进行不包含提交 C 的变基:

$ git rebase --interactive --merge FETCH_HEAD

它应该打开你的编辑器,文件看起来像这样:

pick <sha1> <message>
pick <sha1> <message>
pick <sha1> <message>
...

要从该分支的历史记录中删除提交C,只需删除或注释掉提交的 请注意,提交按相反顺序列出,最早的提交在最前面,最新的提交在最后面。列表上的第一个提交应该是不是FETCH_HEAD的祖先的第一个提交。
重新定位(rebase)没有C的情况下,请继续推送。
$ git push origin master

重新应用提交

当你准备在变基后的分支上应用它时:

$ git cherry-pick save-commitC
   # resolve merge conflicts
$ git commit
$ git tag -d save-commitC

1
这不会永久删除提交记录,对吧?我的意思是,我以后还能应用它吗? - AmirW
谢谢,如果我有A、B、C、D(而不是A、B、C),并且我只想合并A、B,会发生什么变化?使用以下命令是否可以:git tag save-commitCD <sha1> <sha2>? - AmirW
1
最简单的方法是对于您想要保存的每个提交运行 git tag save-commitX <sha1>(您无法一次创建多个标签),但稍后您可以一次性选择所有的标签:git cherry-pick save-commitC save-commitD。另一种方式是仅在您进行的最后一个提交 (D) 上打标签,然后稍后您可以执行 git cherry-pick save-commitD~1 save-commitD 来选择 D 和其父级。 - vergenzt
实际上,我有超过1个提交要延迟(即C是一组提交)。我认为我会使用您的方法,因为它看起来更明确和灵活。 - AmirW
2
git cherry-pick tag~3..tag 会挑选出 tag 和它之前的三个提交。每个提交都包含其父提交的引用,因此对最后一个提交的引用也就是对其父提交的引用。这就是为什么分支名称实际上只是对该分支上最后一个提交的引用。 - vergenzt
显示剩余6条评论

2
您可以重置到提交b,然后将更改存储,推送,然后重新应用您的存储。
git reset HEAD~1
git stash
(rebasing or whatever other intermediate steps required go here)
git push
git stash pop

1
假设提交的 A、B、C 按顺序排列,并且是最后 3 次提交。 - sjakubowski
实际上,在我的情况下,这个假设是可以的。我已经重新排序了我的提交,使它们按顺序排列,并且它们是最后的提交。 - AmirW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接