我已经分叉了一个存储库,然后我做了一些更改,看起来我把一切都搞砸了。
我希望重新开始,使用当前的上游/master作为我工作的基础 我应该重新建立我的存储库还是删除它?< / p >
最简单的解决方案是(使用'upstream'作为引用原始回购分叉的远程名称):
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
reset --hard
push --force
upstream/master
git rebase upstream/master
一个更完整的解决方案,备份你当前的工作(以防万一)在“清理git主分支并移动一些提交到新分支”中详细描述。
另见"从原始的GitHub存储库拉新的更新到分叉的GitHub存储库"以说明"upstream"是什么。
注意:最近的GitHub回购对push --force做保护master分支 所以你必须先取消保护master(见下图),然后是力推后重新保护)
注意:特别是在GitHub上,有现在(2019年2月)一个快捷方式来删除上游合并的pull请求的分叉回购。
喜欢VonC的答案。这里有一个适合初学者的简单版本。
有一个名为origin的git遥控器,我相信你们都知道。基本上,您可以向git repo中添加任意数量的遥控器。所以,我们能做的是引入一个新的远程,它是原始的repo,而不是fork。我喜欢称它为original
origin
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
其他关于丢失零钱的警告仍然适用,请小心。
(不是每个人都喜欢通过git命令行界面来做事)
一旦设置好了,从那时起你只需要执行步骤7-13。 获取> checkout主分支> reset到他们的主>将更改推送到服务器
一旦设置好了,从那时起你只需要执行步骤7-13。
获取> checkout主分支> reset到他们的主>将更改推送到服务器
.
< / >
. quot
双击你的“master”分支来签出它,如果它还没有签出的话。
找到你想要重置的提交,如果你调用repo“master”,你很可能会想要找到带有“master/master”标签的提交。
右键单击提交>“重置当前分支到此提交”。
在对话框中,将“Using mode:”字段设置为“Hard - discard all working copy changes”,然后按“OK”(确保先将不想丢失的更改放到单独的分支上)。
你完成了!
VonC的回答是
请注意,您可能会丢失在主分支上所做的更改(包括本地的,因为复位—困难,以及远程的,因为推送—力量)。
因此,我将介绍如何在现有的fork中创建一个新分支,该分支跟踪最初派生的repo的main分支。
main
为什么这很重要:假设你已经从同一个fork提交了另一个不同特性的pull请求。或者有人用过你的叉子。那么硬复位就不好了。
假设fork -from远程被称为upstream。
git fetch upstream main git switch -c upstreamb/main/track upstream/main
你将在一个新的分支upstreamb/main/track
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,以表明它是一个本地分支。
/
b
现在你可以从track中创建一个新的特性分支,如果需要的话,你可以使用git difftool或任何东西来选择性地比较和复制被放弃的工作。
git difftool