>我创建了一个项目的分支,并在我们的master
中添加了~40个提交。 在某个时间点,我轻率地用强制推动重写了历史,因为我无法"无缘无故">地推动,有时你只想看到世界燃烧。
现在一切都很好,但是我的存储库中的upstream
的最后 ~100 个提交不再被认为是相同的:我看到"提前 240 个提交">而不是"提前 40 个提交"。
是否可以获取上游主站并在其上重新设置我们主站的提交,并将其强制推送回我们的主站,以便我们和他们的提交对于除我的之外的所有先前提交都是同步的?如果是这样,如何?请具体说明。
我假设你有一个干净的沙箱,origin
指向你的叉子,并且你可以通过不同的URL访问上游存储库。我还假设沙盒中的origin/master
和master
是同步的。
有了这些假设,这应该有效:
git remote add upstream <upstream_url>
git fetch upstream
git checkout master
git rebase upstream/master
希望变基能够正常工作,并且不会引入任何重复提交。如果没有,它甚至可能突出为什么你必须首先强制推送。
在开始变基之前,git log --graph --decorate --all
(或gitk -all
或任何其他显示完整图形的可视 Git 日志替换)可能会显示遇到问题的原因。
编辑:另一种更保守的方法是使用git cherry-pick
。变基解决方案依赖于 Git 认识到应该通用的历史记录由upstream/master
上已经存在的提交组成。但是,您可以确定要保留的第一个提交的父级,而不是变基,假设origin/master~40
如果您真的有 40 个提交要保留,并在upstream/master
末尾添加这些提交:
git remote add upstream <upstream_url>
git fetch upstream
git checkout master
git reset --hard upstream/master
git cherry-pick origin/master~40..origin/master
这为您提供了一个新master
,该明确地从upstream/master
开始,并仅添加所需的新历史记录。
请注意git reset --hard upstream/master
中的--hard
:正如OP在评论中指出的那样,这是确保在挑选樱桃之前从干净的状态开始所必需的。但首先要确保你没有任何想要保存的未承诺。
健全性检查:在挑选(或变基)之后,git diff master origin/master
应该什么都不返回,或者再次指出您需要处理的其他问题。 结束编辑
一旦变基或挑选完成,并且您已经彻底说服自己,这些新历史就是您想要保留的:
git push -f origin master
应该让你的分叉恢复到只有 40 次提交,领先upstream
.
警告:我没有测试变基解决方案,但根据您对情况的描述,我相当有信心它应该有效。但是,我使用樱桃挑选解决方案并成功是类似的情况。如果您尝试任何一种方法,请报告您的成功或任何需要调整的错误。