问题描述
我从回购“A”分叉。将我的回购命名为“B”。在本地拉下来。做出改变,承诺,推动。创建的拉取请求的目标是仅合并到 repo "B" 的源/master,但由于它是一个分叉的 repo,BitBucket 的默认设置将它合并到我分叉的 repo,repo "A"。
所以现在,回购“A”的主人有我的改变,那不应该在那里。他们应该最终成为我的“B”存储库的主人。
BitBucket 在拉取请求上有一个“恢复”按钮,但我收到了这条消息。
我尝试了“git revert -m 1 commit-hash”并且收到此错误..
如何恢复拉取请求并将存储库“A”恢复到合并发生之前的状态?
我看了很多答案,但没有类似的案例。
解决方法
我不知道解决方案会如此简单。我在这里找到的答案 How do I revert a Git repository to a previous commit? 使它只使用两个命令即可工作。历史被保留,repo A 处于合并前的相同状态。添加了新的还原提交。
,假设您对存储库 A 具有执行此操作的权限,您可以重写其 master
的历史记录并删除所有错误的合并提交。
例如,如果存储库 A 在 commit1 之前有一个干净的历史记录,那么 PR 被合并,因此历史记录的其余部分包含来自该错误 PR 的提交,但也包含来自其他 PR 的“良好”提交,然后在该存储库中:
git checkout master && git pull # be sure to work with the latest
git rebase -i commit1
这将打开您最喜欢的编辑器,每行显示一个提交。删除与“坏”提交(包括来自该 PR 的任何合并提交)相对应的所有行,并保留“好”提交。保存并退出。
如果发生冲突(有人根据该 PR 中的某些内容进行工作),您需要手动修复它,然后git rebase --continue
。
rebase 完成后,您的分支历史记录就干净了,就好像 PR 从未合并过一样。但是,这里是您需要获得许可才能执行此操作的地方,您需要使用 git push -f origin master
在远程重新发布它,并确保将其报告给可能检查过旧错误版本的任何人(他们必须删除+创建存储库或分支,或者如果他们实际上已经在它之上完成了一些工作,那么他们可能无论如何都应该删除+创建分支并使用存储或挑选来复制它之上的工作)。>
如果没有“好的”提交与“坏的”提交混合在一起,那么解决方案就简单多了。例如,如果存储库 A 在 commit1 之前有一个干净的历史记录,然后其他一切都是“错误的”,您可以将分支重置为最后一次好的提交:
git checkout master && git pull
git reset --hard commit1
git push -f origin master
同样,您需要分支 master
的写入权限,并警告可能基于该分支进行工作的任何人。