清理fork并从上游重新启动它

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

我希望重新开始,使用当前的上游/master作为我工作的基础 我应该重新建立我的存储库还是删除它?< / p >

195146 次浏览

最简单的解决方案是(使用'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上的提交,在当前的upstream/master上重放那些提交 将重置部分替换为git rebase upstream/master。你仍然需要强制push。
另见"如果我的处境不好,我该怎么办?"


一个更完整的解决方案,备份你当前的工作(以防万一)在“清理git主分支并移动一些提交到新分支”中详细描述。

另见"从原始的GitHub存储库拉新的更新到分叉的GitHub存储库"以说明"upstream"是什么。

upstream


注意:最近的GitHub回购对push --force保护master分支 所以你必须先取消保护master(见下图),然后是力推后重新保护)

enter image description here


注意:特别是在GitHub上,有现在(2019年2月)一个快捷方式来删除上游合并的pull请求的分叉回购。

喜欢VonC的答案。这里有一个适合初学者的简单版本。

有一个名为origin的git遥控器,我相信你们都知道。基本上,您可以向git repo中添加任意数量的遥控器。所以,我们能做的是引入一个新的远程,它是原始的repo,而不是fork。我喜欢称它为original

让我们将原始的回购添加到我们的fork作为一个遥控器。

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

现在让我们获取原始的回购,以确保我们有最新的编码

git fetch original

正如VonC建议的,确保我们在主服务器上。

git checkout master

现在,为了使我们的分支跟上原始回购的最新代码,我们所要做的就是根据原始远程硬重置我们的主分支。

git reset --hard original/master

你就完成了:)

@VonC的回答很棒。你的GitHub公司政策可能不允许“强制推送”master。

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

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

为了有效地重置你的fork,你需要遵循以下步骤:

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

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

git checkout master
git push --force origin

然后你必须将'master'设置回GitHub设置中的默认分支。删除“tmp_master”。

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

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

如何通过Sourcetree GUI实现100%

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

一旦设置好了,从那时起你只需要执行步骤7-13。

获取> checkout主分支> reset到他们的主>将更改推送到服务器

步骤

  1. 在屏幕顶部的菜单工具栏中:"Repository" > "Repository settings"

.

  1. “添加”

.

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

.

  1. 将url粘贴到“url / Path”字段,然后给它一个有意义的名字。我叫它“主人”。不勾选“默认远程”复选框。您将无法直接推送到此存储库。

< / >

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

< / >

  1. 再次按“OK”,你应该会看到它出现在你的“Remotes”列表中。

.

  1. 点击“Fetch”按钮(Source树头部区域的左上角)

. quot

  1. 确保选中“从所有远程获取”复选框并按“确定”

< / >

  1. 双击你的“master”分支来签出它,如果它还没有签出的话。

  2. 找到你想要重置的提交,如果你调用repo“master”,你很可能会想要找到带有“master/master”标签的提交。

提交 .

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

  2. 在对话框中,将“Using mode:”字段设置为“Hard - discard all working copy changes”,然后按“OK”(确保先将不想丢失的更改放到单独的分支上)。

< / >

  1. 单击“Push”按钮(Source树头区域的左上角),将更改上传到您的回购副本。

. quot

你完成了!

VonC的回答是

请注意,您可能会丢失在主分支上所做的更改(包括本地的,因为复位—困难,以及远程的,因为推送—力量)。

因此,我将介绍如何在现有的fork中创建一个新分支,该分支跟踪最初派生的repo的main分支。

为什么这很重要:假设你已经从同一个fork提交了另一个不同特性的pull请求。或者有人用过你的叉子。那么硬复位就不好了。

假设fork -from远程被称为upstream

git fetch upstream main
git switch -c upstreamb/main/track upstream/main

你将在一个新的分支upstreamb/main/track

% git branch
...
* upstreamb/main/track
% git pull upstream main
From github.com:XXXX/YYYY
* branch                  main       -> FETCH_HEAD
Already up to date.

注意,分支名中的/是允许的。为了避免混淆和歧义,我在upstream中添加了b,以表明它是一个本地分支。

现在你可以从track中创建一个新的特性分支,如果需要的话,你可以使用git difftool或任何东西来选择性地比较和复制被放弃的工作。