我正在处理一个开源项目的拉取请求,但我不小心将我的更改提交到我的本地master
分支。在没有考虑到它的情况下,我只是继续把它推到我的起源并提交我的主分支作为公关。然后我将上游主人拉到我的主人那里,这样我就可以修复合并冲突,让我的PR保持最新状态。从那以后,对上游做了更多的提交。
所以现在我有:
upstream master: A - B - C ... H - I - J
my fork master: A - B - X - Y
其中X是我的PR的第一个版本,Y是C-H到X的合并。
所以现在我的叉子很纠结。如果没有在B之前启动分支,然后每次都将上游主服务器拉入该分支,我就无法处理不相关的PR。如果我的原始PR被拒绝或需要一年的时间来获得反馈,我将无限期地陷入这种状态。
有没有解决此问题的方法?我是否必须核对我的PR以及我的X和Y提交并手动重做(如果是,如何)?或者我可以以某种方式挽救我的PR并让我的主分支与上游同步回来吗?
答案 0 :(得分:2)
在这种情况下我会做的事情看起来有点像这样:
首先,查看现有master
的新分支:
git checkout -b master-preserve
然后,将master
重置为upstream/master
:
git checkout master
git fetch upstream
git reset --hard upstream/master
现在,创建另一个分支:
git checkout -b upstream-with-commits
樱桃挑选X
和Y
到它上面:
git cherry-pick X Y # Replace with the appropriate commit IDs
然后将此分支推送到您的分支,核对现有的PR,并针对upstream-with-commits
打开一个新的分支。为了使你的前叉master
按顺序恢复,请执行:
git checkout master
git push -f origin HEAD
git push -f
会强制推送,并覆盖origin/master
中的所有历史记录。请注意,如果其他人从您的分叉克隆,可能会给他们带来麻烦。
哦,不要忘记删除master-preserve
:
git branch -D master-preserve
一旦你cherry-pick
编辑了它,就不再需要了。