我完全搞砸了我的分叉git仓库的主分支。
我想完全重置使用上游主仓库的内容推送到我的分支的主分支。我没有兴趣保留任何主分支变更或历史记录。
最简单的方法是删除我的分叉仓库并从上游项目中重新编译。但是,我在其他推动的分支机构工作,我不想失去。
那么如何用上游主站重置推送的主分支?
git clone https://myrepo.git
cd myrepo
git remote add upstream https://upstream.git
git fetch upstream
我从哪里开始使用上游主站重置本地和远程主分支?
答案 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
到叉子,如其他答案所述。