清理叉子并从上游重新启动它

tam*_*125 360 git

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

我希望从头开始,使用当前的上游/主人作为我工作的基础.
我应该改装我的存储库还是删除它?

Von*_*onC 732

最简单的解决方案是(使用' 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 
Run Code Online (Sandbox Code Playgroud)

(类似于这个GitHub页面,"如果我处境不好,该怎么办?")

请注意,您可能会丢失在master分支上执行的更改(在本地,因为reset --hard和远程端,因为push --force).

如果你想保留你的提交master,另一种方法是在当前重播这些提交upstream/master.
用a替换重置部分git rebase upstream/master.然后你仍然需要强制推动.
另请参阅" 如果情况不好,我该怎么办? "


一个更完整的解决方案,备份您当前的工作(以防万一)在" 清理git master分支并将一些提交移动到新分支 "中详细说明.

另请参阅"将新的更新从原始GitHub存储库拉入分叉的GitHub存储库 "以说明" upstream"是什么.

上游


注:最近GitHub的回购做保障master分支反对push --force.
因此,您必须首先取消保护master(见下图),然后在强制推动后重新保护它.

在此输入图像描述


注意:特别是在GitHub上,现在(2019年2月)有一条快捷方式可以删除已经合并到上游的pull请求的分叉repos.

  • 嗨,它很棒!顺便说一句,正确的重置语法是`git reset --hard upstream/master` (4认同)
  • 我在“git重置--hard上游/主控”上得到了“致命:不明确的参数‘上游/主控’:未知修订版或路径不在工作树中” (2认同)

Ahm*_*ais 31

爱VonC的回答.这是初学者的简单版本.

有一个git遥控器origin,我相信你都知道.基本上,您可以根据需要为git repo添加任意数量的遥控器.所以,我们能做的是引入一个新的遥控器,它是原始的回购而不是前叉.我喜欢称呼它original

让我们将原始回购添加到我们的fork作为远程.

git remote add original https://git-repo/original/original.git
Run Code Online (Sandbox Code Playgroud)

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

git fetch original
Run Code Online (Sandbox Code Playgroud)

正如VonC建议的那样,确保我们是主人.

git checkout master
Run Code Online (Sandbox Code Playgroud)

现在,为了让我们的叉子快速使用原始仓库的最新代码,我们所要做的就是根据原始遥控器硬重置我们的主分支.

git reset --hard original/master
Run Code Online (Sandbox Code Playgroud)

你完成了:)

  • 我正在变得"致命":模糊的论证'原创/主人':未知的修订或路径不在工作树中.在最后一步.有什么建议? (2认同)
  • `original` 比 `upstream` (Github 文档使用的)更好,因为 `origin/master` 是本地 `master` 的“上游”。减少歧义。我想知道这就是你使用它的原因吗? (2认同)
  • 我遵循了这些指示,现在git status表示:在分支主服务器上您的分支和'origin / master'已经分开,分别有52和5个不同的提交。(使用“ git pull”将远程分支合并到您的分支中)-但是我想放弃5个提交。下一步是什么? (2认同)

Hug*_*dby 8

关注@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
Run Code Online (Sandbox Code Playgroud)

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

git checkout master
git push --force origin
Run Code Online (Sandbox Code Playgroud)

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

git push origin --delete tmp_master
git branch -D tmp_master
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*non 6

如何通过Sourcetree GUI 100% 做到这一点

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

设置完成后,从那时起您只需要执行步骤 7-13。

获取 > 结帐主分支 > 重置为他们的主分支 > 将更改推送到服务器

脚步

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

顶部菜单栏中突出显示的“存储库”

  1. “添加”

对话框底部的“添加”按钮

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

Github 网站上的“克隆或下载”按钮后跟 git url

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

“远程详细信息”对话框中突出显示的“远程名称”和“URL/路径”字段

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

“主”存储库添加到“存储库设置”对话框中的存储库列表中

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

“主”存储库在侧栏中的远程列表中突出显示

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

标题区域中的“获取”按钮

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

“获取”对话框中突出显示的“从所有遥控器获取”复选框

  1. 双击您的“主”分支以检查它是否尚未检出。

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

带有“master/master”标签的提交示例

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

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

“使用模式”字段在“重置为提交”对话框中突出显示。 它设置为“丢弃所有工作副本更改”

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

标题区域中的“按下”按钮

你完成了!