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

我已经完全搞砸了我的分叉 git 回购的主分支。

我想完全重置被推到我的分叉与上游主回购的内容的主分支。我没有兴趣保留任何主分支的变化或历史。

最简单的方法是从上游项目中删除我的分叉回购和重新分叉。然而,我在其他被推动的分支工作,我不想失去。

因此,我如何重置我的推主分支与上游主机?


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

我从这里去哪里重置我的本地和远程主分支与上游主机?

121347 次浏览

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

假设“上游”是最初的存储库,“起源”是您的分支:

# ensures current branch is master
git checkout master


# pulls all new commits made to upstream/master
git pull upstream 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将原始回购定义为“上游”。)

这将重置您的主分支与上游主机,如果分支已被更新,因为您分叉它将拉这些变化。

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

PS: 假设上游是原始回购,而原产地是你的副本。

我试过这样的方法:

$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.
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到你的叉子上,就像其他答案中解释的那样。