git - Github:在分叉的 master 上获取和 rebase fork
问题描述
我创建了一个项目的分支,并向我们的 master
. 在某个时间点,我不假思索地用强制推动改写了历史,因为我不能“无缘无故”推动,有时你只是想看到世界燃烧。
现在一切都很好,但是在我的仓库中的最后约 100 次提交upstream
不再被认为是相同的:我看到“提前 240 次提交”而不是“提前 40 次提交”。
是否可以获取上游 master 并在其上重新调整我们 master 的提交,并将其强制推送回我们的 master,以便我们和他们的与除我之外的所有先前提交同步?如果是这样,怎么做?请具体。
解决方案
我假设您有一个干净的沙箱,origin
指向您的分叉,并且您可以通过不同的 URL 访问上游存储库。origin/master
我还假设master
在您的沙箱中是同步的。
有了这些假设,这应该有效:
git remote add upstream <upstream_url>
git fetch upstream
git checkout master
git rebase upstream/master
希望变基能够工作并且不会引入任何重复的提交。如果不是这样,它甚至可能会突出为什么您必须首先强制推动。
在你开始 rebase 之前,git log --graph --decorate --all
(或gitk -all
任何其他显示完整图表的可视化 Git 日志替换)可能会告诉你你遇到问题的原因。
编辑:另一种更保守的方法是使用git cherry-pick
. rebase 解决方案依赖于 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
并仅添加您想要的新历史。
请注意--hard
in git reset --hard upstream/master
:正如 OP 在评论中指出的那样,这是确保您在采摘樱桃之前从干净状态开始所必需的。但首先要确保您没有任何要保存的未提交内容。
健全性检查:在樱桃挑选(或变基)之后,git diff master origin/master
应该什么都不返回,或者再次指出你需要处理的其他问题。结束编辑
一旦 rebase 或cherry-pick 完成并且你已经彻底说服自己这个新的历史就是你想要保留的:
git push -f origin master
应该让你的 fork 回到之前只有 40 次提交upstream
。
警告:我没有测试变基解决方案,但根据您对情况的描述,我相当有信心它应该可以工作。但是,我已经成功使用了樱桃挑选解决方案,但情况类似。如果您尝试任何一种方法,请报告您的成功或任何需要调整的错误。
推荐阅读
- python - 如何在不使用拆分的情况下使用 scikit-learn 线性回归?
- anaconda - 如何在 ipython 中从文件夹手动安装 pyaudio 库
- css - 在css中缩放时如何摆脱边线?
- ios - 当应用程序位于同一个 git 存储库 - iOS 时,如何链接框架?
- javascript - Javascript:将 JSON 解析为字符串数组
- python - 请求不发送具有正确 ip 的请求
- java - 如何创建安全的 Lombok JPA 实体?
- .net - 如何在毛伊岛使用 NavigationPage?
- c++ - 我可以在没有默认初始化的情况下初始化数组的 std::unique_ptr 吗(我只想让它有虚拟值)
- r - 通过增加样品编号分配组 ID