我已经分叉了一个存储库,然后我做了一些更改,看起来我把一切都搞砸了。
我希望重新开始,使用当前的上游/master作为我工作的基础。 我应该重新建立我的存储库还是删除它?
我已经分叉了一个存储库,然后我做了一些更改,看起来我把一切都搞砸了。
我希望重新开始,使用当前的上游/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的答案。这里有一个适合初学者的简单版本。
有一个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
你就完成了:)
@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的回答是
请注意,您可能会丢失在主分支上所做的更改(包括本地的,因为复位—困难,以及远程的,因为推送—力量)。
因此,我将介绍如何在现有的分支中创建一个新分支,该分支跟踪最初派生的回购的主分支。
为什么这很重要:假设你已经从同一个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或其他工具来选择性地比较和复制被放弃的工作。