在开源项目时,我遇到了git的以下问题。我做了一些更改,并发送了一个pull-request。 PR首先被接受了。然而,我的更改结果是有一些微妙的错误,维护者再次恢复了我的提交,要求我在修复问题后发送新的请求。但是,之间发生了很多其他提交,所以我需要更新我的pull-request。不幸的是,我无法在最近的master
状态之上获得改变或挑选我的旧公关。
让我用一个例子来澄清事情。比如说,我原来的提取请求已提交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执行此操作?
答案 0 :(得分:2)
除了cherry-pick选项之外,rebase现在有一个--force-rebase
选项来生成新的提交,这样它就会忽略之前恢复的合并。
另请参阅:revert-a-faulty-merge How-To,git 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