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


395

我分叉了一个存储库,然后进行了一些更改,看来我已经弄乱了所有东西。

我希望以当前的上游/母版作为我的工作基础,从头开始。
我应该重新配置存储库还是将其删除?


4
一个简单问题的答案非常复杂。只需删除所有内容,然后再次克隆存储库即可。
Yaza

1
@Yaza,不,在某些情况下,这可能会给您带来更多麻烦。
Shimmy Weitzhandler,

@shimmy,而不是是否要像OP一样从头开始。
Yaza

Answers:


795

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

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页面,“如果我处境不好,应该怎么办?”一节

请注意,您可能会丢失master分支上所做的更改(由于是reset --hard,在本地,而由于,则在远程push --force)。

如果您要保留提交,则可以选择一种方法,master即在current之上重播这些提交upstream/master
用替换复位部分git rebase upstream/master。然后,您仍然需要强行推动。
另请参阅“ 如果我处境不好,应该怎么办?


清理git master分支并将一些提交移动到新分支 ”中详细介绍了一种更完整的解决方案,用于备份当前的工作(以防万一)。

另请参阅“将新的更新从原始GitHub存储库中提取到派生的GitHub存储库中 ”以说明“ upstream”是什么。

上游的


注意:最近的GitHub仓库确实保护master分支免受攻击push --force
因此,您必须先取消保护master(请参见下图),然后在强行推动后重新保护它)。

在此处输入图片说明


注意:特别是在GitHub上,现在(2019年2月)有一个快捷方式可以删除已合并到上游的请求请求的分叉存储库。


4
嗨,效果很好!顺便说一句,正确的重置语法是git reset --hard upstream/master
tampe125

1
@ tampe125太好了。我已经固定git reset了答案中的语法。
VonC 2012年

致命:“上游”似乎不是git存储库
Benubird 2014年

@Benubird,它是引用原始存储库(您分叉的存储库)的远程服务器的名称:请参见图和stackoverflow.com/a/3903835/6309中的git remote命令。
VonC

是的,但是您的问题尚不清楚如何设置,因为默认情况下,“上游”未在命令行中定义,因为我是通过github分叉的。
Benubird 2014年

31

喜欢VonC的答案。这是初学者的简单版本。

origin我相信大家都知道有一个git remote 。基本上,您可以根据需要向git repo添加任意数量的远程对象。因此,我们可以做的是引入一个新的遥控器,它是原始的仓库而不是叉子。我喜欢称呼它original

让我们将原始仓库添加到我们的分叉中作为遥控器。

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

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

git fetch original

正如VonC建议的那样,请确保我们已掌握。

git checkout master

现在,要使我们的分支与原始存储库上的最新代码同步起来,我们要做的就是按照原始遥控器硬重置主分支。

git reset --hard original/master

你完成了:)


2
我正在fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.最后一步。有什么建议吗?
TomNorway

看来,这只是使您有库存在原始远程分支上。我认为这缺少将您的前叉重置回正确遥控器的步骤吗?
Ray Suelzer '17

1
originalupstream(Github文档使用的)更好,就像origin/master本地的“上游”一样master。减少歧义。不知道这是为什么要使用它?
vaughan

1
这就是我使用它的原因!
艾哈迈德·阿威斯

2
我按照这些说明进行操作,现在git status表示:在分支主服务器上您的分支和'origin / master'已经分开,分别有52和5个不同的提交。(使用“ git pull”将远程分支合并到您的分支中)-但是我想放弃5个提交。下一步是什么?
user3562927

6

以下@VonC很好的答案。您的GitHub公司政策可能不允许在主服务器上进行“强制推送”。

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'作为新的默认分支。现在,您可以强制按下“ 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。

获取>检出master分支>重置为其主master>将更改推送到服务器

脚步

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

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

  1. “加”

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

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

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

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

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

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

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

  1. 再次按“确定”,您应该看到它出现在“远程”列表中。

侧栏中的遥控器列表中突出显示的“主”存储库

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

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

  1. 确保已选中“从所有远程获取”复选框,然后按“确定”

“获取”对话框中突出显示的“从所有远程获取”复选框

  1. 双击您的“ master”分支,以检查是否尚未签出。

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

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

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

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

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

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

标题区域中的“推送”按钮

完成了!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.