如何在派生存储库中将git master分支重置为上游分支?


103

我已经完全弄乱了我的git repo的master分支。

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

最简单的方法是从上游项目中删除我的分叉的仓库和仓库。但是,我在其他不想输的分支机构都有工作。

因此,如何用上游主服务器重置推送的主分支?


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

我应该从哪里去重置上游主服务器的本地和远程主服务器分支?

Answers:


189

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

假设“上游”是原始存储库,而“起源”是您的fork:

# 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。)


1
也可能应该git reset --hard upstream/master重设工作目录。但是您的答案仍然是正确的。
j6t

在保留本地更改的同时,不使用“ --hard”也可以。我将分步进行硬重置,以可能检查差异。
Johannes Barop '17

1
这非常有帮助。
Aleem S

4
需要调用git fetch upstream第一
亨利·ê

3
正如@HenryE所指出的那样,未能首先获取上游更改git fetch upstream通常会产生以下非人类可读错误:"fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree."
Cecil Curry '18

5

这会将您的master分支重置为上游master分支,并且如果自从分支以来该分支已被更新,它也会拉出这些更改。

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

PS:假设上游是原始回购,而原点是您的副本。


好像您是从其他提交创建分支一样。进行基础调整的主要原因是保持线性的项目历史记录。就是说,一旦提交已发布到公共存储库中,就永远不要重新设置提交的基准,因为这会将旧的提交替换为新的提交。有关详细信息,请参见atlassian.com/git/tutorials/rewriting-history/git-rebase
user8128167

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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.