Github:在forked master上获取并重新设置fork的基础

Github:在forked master上获取并重新设置fork的基础,git,github,rebase,git-history,Git,Github,Rebase,Git History,我已经创建了一个项目分支,并向我们的主机添加了约40个提交。 在某个时刻,我不假思索地用强迫的方式改写了历史,因为我“毫无理由”无法推动,有时你只想看到世界燃烧 现在一切都好了,但我回购协议中上游的最后100次提交不再被认为是相同的:我看到的是“提前240次提交”,而不是“提前40次提交” 是否有可能获取上游主控并重新确定主控的承诺,并强制将其推回到主控,以便我们的和他们的在除我之外的所有之前的承诺中保持同步?如果是,怎么做?请具体说明。我假设您有一个干净的沙箱,origin指向您的分支,并且您

我已经创建了一个项目分支,并向我们的
主机添加了约40个提交。
在某个时刻,我不假思索地用强迫的方式改写了历史,因为我“毫无理由”无法推动,有时你只想看到世界燃烧

现在一切都好了,但我回购协议中上游的最后100次提交不再被认为是相同的:我看到的是“提前240次提交”,而不是“提前40次提交”


是否有可能获取上游主控并重新确定主控的承诺,并强制将其推回到主控,以便我们的和他们的在除我之外的所有之前的承诺中保持同步?如果是,怎么做?请具体说明。

我假设您有一个干净的沙箱,
origin
指向您的分支,并且您可以通过不同的URL访问上游回购。我还假设沙箱中的
origin/master
master
是同步的

根据这些假设,这应该是可行的:

git remote add upstream <upstream_url>
git fetch upstream
git checkout master
git rebase upstream/master
这将为您提供一个新的
master
,它显式地从
upstream/master
开始,只添加您想要的新历史记录

注意
git reset--hard upstream/master
中的
--hard
:正如OP在评论中指出的那样,这是为了确保您在采摘樱桃之前从干净的状态开始。但是首先要确保你没有任何你想保存的未提交的东西

健全性检查:在樱桃拾取(或重基)之后,
git diff master origin/master
应该不返回任何内容,或者再次指出需要处理的其他问题。 结束编辑

一旦完成再基或樱桃采摘,并且您已经完全确信这段新的历史是您想要保留的:

git push -f origin master
应该使您的fork恢复到只比上游提交40次


警告:我没有测试rebase解决方案,但根据您对情况的描述,我相当有信心它会起作用。然而,我已经成功地使用了cherry pick解决方案,类似的情况也是如此。如果您尝试任何一种方法,请报告您的成功或任何需要调整的错误。

这两种方法都是值得尝试的。一旦其中一个起作用,我将欣然接受你的回答!我会再打给你的。方法1在每次提交数百个合并冲突的无限迷宫中结束了我。方法2是完美的(但是你需要一个干净的头部-重置会让它变脏-做一个硬重置,例如,
git reset——硬上游/主控
),或者至少只有十几个合并冲突。非常感谢。很高兴它起作用了。我很高兴我回来并添加了第二种方法。
git push -f origin master