Github:在分叉的主节点上获取和变基分叉



>我创建了一个项目的分支,并在我们的master中添加了~40个提交。 在某个时间点,我轻率地用强制推动重写了历史,因为我无法"无缘无故">地推动,有时你只想看到世界燃烧。

现在一切都很好,但是我的存储库中的upstream的最后 ~100 个提交不再被认为是相同的:我看到"提前 240 个提交">而不是"提前 40 个提交"。

是否可以获取上游主站并在其上重新设置我们主站的提交,并将其强制推送回我们的主站,以便我们和他们的提交对于除我的之外的所有先前提交都是同步的?如果是这样,如何?请具体说明。

我假设你有一个干净的沙箱,origin指向你的叉子,并且你可以通过不同的URL访问上游存储库。我还假设沙盒中的origin/mastermaster是同步的。

有了这些假设,这应该有效:

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.

警告:我没有测试变基解决方案,但根据您对情况的描述,我相当有信心它应该有效。但是,我使用樱桃挑选解决方案并成功是类似的情况。如果您尝试任何一种方法,请报告您的成功或任何需要调整的错误。

最新更新