【问题标题】:Clean up a fork and restart it from the upstream清理一个 fork 并从上游重新启动它
【发布时间】:2012-03-27 14:51:00
【问题描述】:

我已经分叉了一个存储库,然后我做了一些更改,看起来我把所有东西都搞砸了。

我希望从头开始,使用当前的上游/主服务器作为我工作的基础。
我应该重新设置我的存储库还是完全删除它?

【问题讨论】:

  • 一个简单问题的非常复杂的答案。只需删除所有内容并再次克隆存储库。
  • @Yaza,不,这在某些情况下可能会给您带来更多麻烦。
  • @shimmy,如果您想像 OP 要求的那样从头开始,则不是。

标签: git


【解决方案1】:

最简单的解决方案是(使用 'upstream' 作为引用原始 repo 分叉的远程名称):

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(类似于这个GitHub page, section "What should I do if I’m in a bad situation?"

请注意,您可能会丢失在 master 分支上所做的更改(无论是在本地,因为 reset --hard,还是在远程端,因为 push --force)。

如果您想保留在master 上的提交,另一种方法是在当前upstream/master 之上重播这些提交。
git rebase upstream/master 替换重置部分。然后,您仍然需要强制推送。
另见“What should I do if I’m in a bad situation?


更完整的解决方案,备份您当前的工作(以防万一)在“Cleanup git master branch and move some commit to new branch”中有详细说明。

另请参阅“Pull new updates from original GitHub repository into forked GitHub repository”以了解“upstream”是什么。


注意:最近的 GitHub 存储库针对 push --force 执行 protect the master branch
所以你必须先取消保护master(见下图),然后是re-protect it after force-pushing)。


注意:特别是在 GitHub 上,有一个快捷方式 now (February 2019) 可以删除上游合并的拉取请求的分叉存储库。

【讨论】:

  • 嗨,效果很好!顺便说一句,正确的重置语法是 git reset --hard upstream/master
  • @tampe125 太好了。我已经在答案中修复了git reset 的语法。
  • 我在git reset --hard upstream/master 得到了fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree
  • @ShimmyWeitzhandler 是的,通过脚本:stackoverflow.com/a/58372324/6309
  • 对于那些有上游问题的人,首先确保上游配置了位输入git remote -v
【解决方案2】:

喜欢 VonC 的回答。这是适合初学者的简单版本。

有一个名为 origin 的 git 遥控器,我相信你们都知道。基本上,您可以根据需要向 git 存储库添加任意数量的遥控器。所以,我们能做的就是引入一个新的遥控器,它是原始的 repo 而不是 fork。我喜欢叫它original

让我们将原始 repo 作为遥控器添加到我们的 fork 中。

git remote add original https://git-repo/original/original.git

现在让我们获取原始 repo 以确保我们拥有最新的编码

git fetch original

正如 VonC 建议的那样,确保我们在 master 上。

git checkout master

现在,为了让我们的 fork 与原始 repo 上的最新代码保持同步,我们所要做的就是根据原始远程硬重置我们的 master 分支。

git reset --hard original/master

你完成了:)

【讨论】:

  • 我在最后一步收到fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.。有什么建议吗?
  • 看来这只会让你在原来的远程分支上存货。我认为这缺少将您的叉子重置回正确遥控器的步骤?
  • original 优于 upstream(Github 文档使用),因为 origin/master 是本地 master 的“上游”。减少歧义。我想知道这就是你使用它的原因吗?
  • 这正是我使用它的原因!
  • 我按照这些说明操作,现在 git status 说:在分支 master 你的分支和 'origin/master' 已经分道扬镳,分别有 52 和 5 个不同的提交。 (使用“git pull”将远程分支合并到你的分支中)——但我想放弃我的 5 个提交。下一步是什么?
【解决方案3】:

按照@VonC 的好答案。您的 GitHub 公司政策可能不允许在 master 上“强制推送”。

remote: error: GH003: Sorry, force-pushing to master is not allowed.

如果您收到类似这样的错误消息,请尝试以下步骤。

要有效地重置您的分叉,您需要执行以下步骤:

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

在 GitHub 上打开你的 fork,在“设置 -> 分支 -> 默认分支”中选择“new_master”作为新的默认分支。现在您可以强制推送“主”分支:

git checkout master
git push --force origin

然后您必须在 GitHub 设置中将 'master' 重新设置为默认分支。删除“tmp_master”:

git push origin --delete tmp_master
git branch -D tmp_master

其他关于丢失更改的警告仍然适用,请小心。

【讨论】:

    【解决方案4】:

    如何通过Sourcetree GUI 做到 100%

    (不是每个人都喜欢通过 git 命令行界面做事)

    设置完成后,您只需执行步骤 7-13。

    Fetch > checkout master branch > reset to their master > Push changes to server

    步骤

    1. 在屏幕顶部的菜单工具栏中:“存储库”>“存储库设置”

    1. “添加”

    1. 返回 GitHub 并复制克隆 URL。

    1. 将 url 粘贴到“URL / 路径”字段中,然后给它一个有意义的名称。我称它为“大师”。 不要选中“默认遥控器”复选框。您将无法直接推送到此存储库。

    1. 按“确定”,您现在应该会看到它出现在您的存储库列表中。

    1. 再次按“确定”,您应该会看到它出现在您的“遥控器”列表中。

    1. 单击“获取”按钮(源树标题区域的左上角)

    1. 确保选中“从所有遥控器获取”复选框并按“确定”

    1. 如果尚未签出,请双击您的“master”分支进行签出。

    2. 找到您要重置的提交,如果您将存储库称为“master”,您很可能希望找到带有“master/master”标签的提交。

      李>

    1. 右键单击提交>“将当前分支重置为此提交”。

    2. 在对话框中,将“使用模式:”字段设置为“硬 - 放弃所有工作副本更改”,然后按“确定”(确保将您不想丢失的任何更改放在先分离分支)。

    1. 单击“推送”按钮(源树标题区域的左上角)将更改上传到您的存储库副本。

    大功告成!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      相关资源
      最近更新 更多