フォークされたリポジトリのgit masterブランチを上流のブランチにリセットするにはどうすればよいですか?


103

フォークしたgitリポジトリのmasterブランチを完全にめちゃくちゃにしました。

私のフォークにプッシュされたマスターブランチを、アップストリームのマスターリポジトリの内容で完全にリセットしたいと思います。マスターブランチの変更や履歴を保持することに関心はありません。

最も単純なアプローチは、私のフォークされたリポジトリを削除して、上流プロジェクトからreforkすることでした。ただし、他のプッシュされたブランチで、失いたくない作業があります。

したがって、プッシュされたマスターブランチをアップストリームマスターでリセットするにはどうすればよいですか?


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

ローカルおよびリモートのマスターブランチをアップストリームマスターでリセットするには、ここからどこに行けばよいですか?

回答:


189

ローカルマスターブランチをアップストリームバージョンにリセットし、リポジトリにプッシュできます。

「upstream」が元のリポジトリであり、「origin」がフォークであると仮定します。

# 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 2017

1
これはとても役に立ちました。
Aleem S 2017

4
git fetch upstream最初に電話する必要がある
Henry E

3
@HenryEノートとして、上流の取得に失敗することで最初の変更git fetch upstream:一般的に以下の非人間が読めるエラーを生成する"fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree."
セシルカレー

5

これにより、マスターブランチがアップストリームマスターでリセットされ、分岐がブランチ以降に更新された場合、それらの変更もプルされます。

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

PS:Originがあなたのコピーである一方で、Upstreamが元のリポジトリであると仮定します。


別のコミットからブランチを作成したように見えます。リベースの主な理由は、線形のプロジェクト履歴を維持するためです。つまり、パブリックリポジトリに公開されたコミットをリベースしないでください。これにより、古いコミットが新しいコミットに置き換えられるためです。詳細については、atlassian.com
git / tutorials / rewriting

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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.