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

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


当前回答

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

remote: error: GH003:对不起,force-pushing to master是不允许的。

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

为了有效地重置你的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到他们的主>将更改推送到服务器

步骤

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

“添加”

回到GitHub并复制克隆URL。

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

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

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

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

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

双击你的“master”分支来签出它,如果它还没有签出的话。 找到你想要重置的提交,如果你调用repo“master”,你很可能会想要找到带有“master/master”标签的提交。

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

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

你完成了!

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

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

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

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

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

git fetch original

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

git checkout master

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

git reset --hard original/master

你就完成了:)

最简单的解决方案是(使用'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上保存你的提交,在当前的upstream/master上重放那些提交。 用一个git rebase upstream/master替换重置部分。然后你仍然需要用力推。 请参见“如果我处于糟糕的情况下,我应该做什么?”


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

参见“从原始GitHub存储库拉新更新到分叉的GitHub存储库”,以说明什么是“上游”。


注意:最近的GitHub回购确实保护主分支不受push -force的影响。 所以你必须先取消对master的保护(见下图),然后在强制推送后重新保护它)。


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

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

remote: error: GH003:对不起,force-pushing to master是不允许的。

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

为了有效地重置你的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

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

VonC的回答是

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

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

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

假设fork -from远程称为上游。

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

你将在一个新的分支上游/主/轨道

% 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或其他工具来选择性地比较和复制被放弃的工作。