【发布时间】:2014-08-31 17:40:36
【问题描述】:
在开发开源项目时,我遇到了以下 git 问题。我做了一些更改,并发送了一个拉取请求。 PR一开始就被接受了。然而,我的更改结果发现有一些微妙的错误,维护者再次恢复了我的提交,要求我在解决问题后发送一个新的拉取请求。然而,在这期间发生了很多其他的提交,所以我需要更新我的拉取请求。不幸的是,我无法让 git 在master 的最新状态之上重新调整或挑选我的旧 PR。
让我用一个例子来澄清一下。比如说,我最初的拉取请求提交了A 和B 并被接受了。然后,几次提交之后,我的 PR 被恢复(R),然后又发生了一些提交。历史是这样的:
...--A---B--...--R--...--o master
现在,我想将其转换为以下形式,以便在master 的最新状态之上优化我的拉取请求:
...--A---B--...--R--...--o master
\
A---B newPR
但是,rebase 和 cherry-pick 都未能实现这一点。问题似乎是,git 认为A 和B 已经是master 的一部分,因为它们已经在历史中了。因此,它不会在 master 之上应用这些更改。
如何强制 git 这样做?
【问题讨论】:
-
你说的我没能做到到底是什么意思?您是否从 Git 收到特定消息?此外,添加您使用的确切的
rebase和cherry-pick命令。 -
@Jubobs Fails 表示
A和B的更改不存在。就 git 而言,这不是一个错误。 rebase 命令是git rebase --onto master beforePR B,其中beforePR是A之前的最后一次提交。这直接来自git rebase手册页。挑选的樱桃是git cherry-pick A..B。 -
有人在这里评论只是为了revert the revert。这实际上工作得很好。不幸的是,我不记得用户名,但如果那个人将其作为答案发布,并且没有更好的魔法出现,那么我很乐意接受。
-
我快速浏览了man page。
cherry-pick有一个--keep-redundant-commits选项。也许这行得通。我会发布它作为答案,但我无法复制您的错误情况;我总是能够挑选一个还原的提交。 -
@musiKk 非常好!我不知道那个选项。我试过了,这是另一个很好的解决我的问题的方法。与还原还原相比,不利的一面是,如果 PR 仅部分还原,那么您的新 PR 将包含空提交。您需要使用
rebase -i手动删除的那些...
标签: git rebase cherry-pick