git revert后git rebase

时间:2014-08-31 17:40:37

标签: git rebase cherry-pick

在开源项目时,我遇到了git的以下问题。我做了一些更改,并发送了一个pull-request。 PR首先被接受了。然而,我的更改结果是有一些微妙的错误,维护者再次恢复了我的提交,要求我在修复问题后发送新的请求。但是,之间发生了很多其他提交,所以我需要更新我的pull-request。不幸的是,我无法在最近的master状态之上获得改变或挑选我的旧公关。

让我用一个例子来澄清事情。比如说,我原来的提取请求已提交AB并被接受。然后,一些提交后来我的PR被还原(R),然后又发生了一些提交。历史看起来像这样:

...--A---B--...--R--...--o master

现在,我想将其转换为以下形式,以便在最新状态master之上优化我的提取请求:

...--A---B--...--R--...--o master
                          \
                           A---B newPR

但是,我无法通过rebasecherry-pick实现这一目标。问题似乎是,git认为AB已经是master的一部分,因为它们已经在历史中。因此,它不会在master之上应用这些更改。

如何强制git执行此操作?

2 个答案:

答案 0 :(得分:2)

除了cherry-pick选项之外,rebase现在有一个--force-rebase选项来生成新的提交,这样它就会忽略之前恢复的合并。

另请参阅:revert-a-faulty-merge How-Togit rebase --no-ff和完整的git rebase文档。

答案 1 :(得分:0)

被修改

git checkout master
git checkout -b redo
git cherry-pick Aref
git cherry-pick Bref
... do fixes and commits
git merge master

之前

* e553928d35646512f640b0f0ca208f6729884993 D
* 5157867afdbdcf4300f7b722e3816e294e0f2ae4 C
* caa01fd5378f87b67811212aa4325963fab72905 Revert "A"
* 8603f6b1231dbefa4911699cb59fa81f1a20e432 Revert "B"
* d4c38c2c63ab0b4be00480bf9c9542ffc66dcb5f B
* f2f6e0a0b7a804a4a8075839d7b73b37b747a7b3 A
* 59597e64b49b234b45a94a86d950f0811a19cdfe root commit

* e6a314b66d8be8a85abd6becd53e0d2c7a6332a5 E
* d7d91af4225d5ba7d783303e73bcac1b5ba02a91 B
* 381b95bea7f87662f72a1da67bd70cdfc497be47 A
* e553928d35646512f640b0f0ca208f6729884993 D
* 5157867afdbdcf4300f7b722e3816e294e0f2ae4 C
* caa01fd5378f87b67811212aa4325963fab72905 Revert "A"
* 8603f6b1231dbefa4911699cb59fa81f1a20e432 Revert "B"
* d4c38c2c63ab0b4be00480bf9c9542ffc66dcb5f B
* f2f6e0a0b7a804a4a8075839d7b73b37b747a7b3 A
* 59597e64b49b234b45a94a86d950f0811a19cdfe root commit

本地为我工作

$ git checkout master
Switched to branch 'master'
$ ls
A B C D E