如何将git master分支重置为分叉存储库中的上游分支?

时间:2017-02-19 20:55:25

标签: git

我完全搞砸了我的分叉git仓库的主分支。

我想完全重置使用上游主仓库的内容推送到我的分支的主分支。我没有兴趣保留任何主分支变更或历史记录。

最简单的方法是删除我的分叉仓库并从上游项目中重新编译。但是,我在其他推动的分支机构工作,我不想失去。

那么如何用上游主站重置推送的主分支?

git clone https://myrepo.git
cd myrepo
git remote add upstream https://upstream.git
git fetch upstream

我从哪里开始使用上游主站重置本地和远程主分支?

4 个答案:

答案 0 :(得分:81)

您可以将本地主分支重置为上游版本并将其推送到您的存储库。

假设“upstream”是原始存储库而“origin”是你的fork:

git checkout master
# this will delete all your local changes to master
git reset --hard upstream/master
# take care, this will delete all your changes on your forked master
git push origin master --force

(您可以使用git remote add upstream /url/to/original/repo将原始仓库定义为“上游”。)

答案 1 :(得分:4)

这将使用上游主服务器重置您的主分支,如果分支已经更新,因为您的分支也会提取这些更改。

git checkout master 
git reset upstream/master
git pull --rebase upstream master
git push origin master --force

PS:假设Upstream是原始回购,而原产地是您的副本。

答案 2 :(得分:0)

我尝试过这种方法:

$REPO=<repo>
$ORIGIN=<user>/$REPO
$UPSTREAM=<upstream>/$REPO

$ git clone git@github.com:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream git@github.com:$UPSTREAM.git
$ git reset --hard upstream/master
$ git pull --rebase upstream master
$ git push origin master --force

输出将显示警告:

fatal: ambiguous argument 'upstream/master': 
unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

因此正确的方法是将git pull放在git reset之前:

$ git clone git@github.com:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream git@github.com:$UPSTREAM.git
$ git pull --rebase upstream master
$ git reset --hard upstream/master
$ git push origin master --force

然后输出将如下所示:

From github.com:<upstream>/<repo>
 * branch                master     -> FETCH_HEAD
 * [new branch]          master     -> upstream/master
HEAD is now at 7a94b1790 Merge pull request #4237 from <upstream>/...
Current branch master is up to date.
Everything up-to-date.

答案 3 :(得分:0)

git reset --hard @{upstream}

或更短:

git reset --hard @{u}

或者您甚至可以更进一步,并设置一个别名,使您只需键入git scrub

git config --global alias.scrub 'reset --hard @{upstream}'

(这假设您的分支配置为跟踪相应的远程分支,除非您正在做一些特殊的事情。有关跟踪的更多详细信息,请参见git-branch(1),有关跟踪的详细信息请参见git-rev-parse(1)分支规范语法。)

然后,您只需git push --force到叉子,如其他答案所述。