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

标签 git github rebase git-history

我创建了一个项目的分支,并向我们的 master 添加了约 40 次提交。 在某个时间点,我不假思索地用强制 push 重写了历史,因为我无法“无缘无故” push ,有时你只是想看到世界燃烧。

现在一切都很好,但是上游上最后约 100 次提交(也在我的存储库中)不再被认为是相同的:我看到“前面有 240 次提交” 而不是 “提前 40 次提交”。

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

最佳答案

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

有了这些假设,这应该可行:

git remote add upstream <upstream_url>
git fetch upstream
git checkout master
git rebase upstream/master

希望 rebase 能够发挥作用,并且不会引入任何重复提交。如果没有,它甚至可能会突出显示为什么您必须首先强制推送。

在开始 rebase 之前,git log --graph --decorate --all(或 gitk -all 或任何其他显示完整的可视化 Git 日志替换)图)可能会告诉您遇到麻烦的原因。

编辑:另一种更保守的方法是使用gitcherry-pick。 rebase 解决方案依赖于 Git 来识别应该常见的历史记录由 upstream/master 上已经存在的提交组成。但是,您可以识别要保留的第一个提交的父级,而不是 rebase ,如果您确实有 40 个提交要保留,那么假设 origin/master~40 ,然后在末尾添加这些提交上游/主控:

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 upload/master中的--hard:正如评论中OP所指出的,这是需要确保您从采摘前的干净状态。但首先请确保您没有任何想要保存的未提交内容。

健全性检查:在cherry-pick(或rebase)之后,git diff master origin/master 应该不返回任何内容,或者再次向您指出需要处理的其他问题。 结束编辑

一旦 rebase 或cherry-pick 完成,并且您已经彻底说服自己这个新历史就是您想要保留的内容:

git push -f origin master

应该使您的 fork 恢复到在上游之前仅进行 40 次提交。

警告:我没有测试 rebase 解决方案,但根据您对情况的描述,我相当有信心它应该有效。然而,我已经使用了cherry-pick解决方案,在类似的情况下取得了成功。如果您尝试任一方法,请报告您的成功或任何需要调整的错误。

关于Github:在 fork 的 master 上获取并重新设置 fork ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54674971/

相关文章:

git - 查找 git 中删除 "deleted by us"文件的时间

Git全局钩子(Hook)定制

github - 使用 github 进行团队合作

git - 如何使用NPM 安装特定的Git 分支?

git - 错误 : failed to push some refs to new repository

svn - 将现有的 Git 存储库推送到 SVN

Git - 从以前的提交分支和拆分提交历史

git - 在 Github 上删除 <user> committed with <user>

git - 从 git 提交中删除提交者信息

git - 在 git 中 merge 拆分历史记录