フォークをクリーンアップし、上流から再起動します


396

リポジトリをforkした後、いくつかの変更を加えたところ、すべてをめちゃくちゃにしたようです。

現在のアップストリーム/マスターを作業のベースとして使用して、最初からやり直したいと思います。
リポジトリをリベースするか、削除する必要がありますか?


4
単純な質問に対する非常に複雑な答え。すべてを削除して、リポジトリのクローンを再度作成してください。
Yaza

1
@Yaza、いいえ、これはいくつかのシナリオでさらに問題を引き起こすかもしれません。
Shimmy Weitzhandler

@ shimmy、OPのように最初からやり直したい場合は。
Yaza

回答:


796

最も簡単な解決策は次のupstreamとおりです( ' 'を、フォークされた元のリポジトリを参照するリモート名として使用):

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(このGitHubページと同様に、「状況が悪い場合はどうすればよいですか?」セクション

masterブランチで行われた変更が失われる可能性があることに注意してください(両方のためにローカルでreset --hard、およびのためリモート側でpush --force)。

上のコミットを保持したい場合は、代わりmasterに、現在のの上でそれらのコミットを再生しupstream/masterます。
リセット部分をに交換してくださいgit rebase upstream/master。その後、まだプッシュを強制する必要があります。
状況が悪い場合はどうすればよいですか?」も参照してください


より完全な解決策、現在の作業のバックアップ(念のため)については、「git masterブランチをクリーンアップして、コミットを新しいブランチに移動する」で詳しく説明しています。

「」の説明については、「元のGitHubリポジトリから分岐したGitHubリポジトリに新しい更新をプルする」も参照してくださいupstream

上流の


注:最近のGitHubリポジトリはブランチをから保護masterpush --forceます。
したがって、master最初に保護を解除する必要があります(下の画像を参照)。次に、強制的に押した後再度保護する必要があります)。

ここに画像の説明を入力してください


注:特にGitHubには、(2019年2月)アップストリームにマージされたプルリクエストのフォークされたリポジトリを削除するショートカットがあります。


4
こんにちは、それはうまくいきました!正しいリセット構文は次のとおりですgit reset --hard upstream/master
tampe125

1
@ tampe125すばらしい。の構文を修正しgit resetました。
VonC 2012年

fatal: 'upstream'はgitリポジトリではないようです
Benubird

@Benubirdは、元のレポ(フォークしたもの)を参照するリモートの名前です。グラフとstackoverflow.com/a/3903835/6309の " git remote"コマンドを参照してください。
VonC 2014

そうです、しかしそれをどのように設定するかはあなたの質問から明らかではありません、なぜなら私がgithubを介してforkしたのでデフォルトでは 'upstream'はコマンドラインで定義されていないからです。
Benubird 2014

31

VonCの答えが大好きです。これが初心者向けの簡単なバージョンです。

origin皆さんが知っていると確信しているgitリモートがあります。基本的に、git repoには必要なだけリモートを追加できます。したがって、私たちにできることは、フォークではなく元のリポジトリである新しいリモートを導入することです。私はそれを呼ぶのが好きですoriginal

元のリポジトリをリモートとしてフォークに追加しましょう。

git remote add original https://git-repo/original/original.git

次に、元のリポジトリをフェッチして、最新のコードが作成されていることを確認します

git fetch original

VonCが提案したように、マスターであることを確認してください。

git checkout master

元のリポジトリの最新コードでフォークを高速化するには、元のリモートに従ってマスターブランチをハードリセットするだけです。

git reset --hard original/master

これで完了です:)


2
私はfatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.最後のステップに入っています。何かアドバイス?
TomNorway 2017

これにより、元のリモートブランチに在庫が残ったようです。私はあなたのフォークを正しいリモコンにリセットするためのステップが欠けていると思いますか?
Ray Suelzer、2017

1
originalローカルの "上流"であるupstreamように、(Githubのドキュメントが使用する)よりも優れています。あいまいさを減らします。これがあなたがそれを使う理由なのかしら?origin/mastermaster
ヴォーン

1
それがまさに私がそれを使う理由です!
Ahmad Awais 2017

2
私はこれらの指示に従いましたが、今ではgitステータスは次のようになります。(リモートブランチを自分のブランチにマージするには、「git pull」を使用します)-5つのコミットを破棄したいと思います。次のステップは何ですか?
user3562927 2017

6

@VonCの素晴らしい答えに続きます。GitHub会社のポリシーで、マスターの「強制プッシュ」が許可されていない可能性があります。

remote: error: GH003: Sorry, force-pushing to master is not allowed.

このようなエラーメッセージが表示された場合は、次の手順を試してください。

フォークを効果的にリセットするには、次の手順に従う必要があります。

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

GitHubでフォークを開き、「設定->ブランチ->デフォルトブランチ」で、新しいデフォルトブランチとして「new_master」を選択します。これで、 'master'ブランチを強制的にプッシュできます。

git checkout master
git push --force origin

次に、GitHub設定のデフォルトブランチとして「master」を設定し直す必要があります。「tmp_master」を削除するには:

git push origin --delete tmp_master
git branch -D tmp_master

変更を失うことについて警告するその他の回答は引き続き適用されますので、注意してください。


4

Sourcetree GUIで100%実行する方法

(誰もがgitコマンドラインインターフェースで物事を行うことを好むわけではありません)

これが設定されたら、それ以降は手順7〜13を実行するだけで済みます。

フェッチ>マスターブランチをチェックアウト>マスターにリセット>サーバーに変更をプッシュ

手順

  1. 画面上部のメニューツールバー:[リポジトリ]> [リポジトリ設定]

上部のメニューバーで強調表示された「リポジトリ」

  1. "追加"

ダイアログ下部の「追加」ボタン

  1. GitHubに戻り、クローンURLをコピーします。

Githubウェブサイトの「クローンまたはダウンロード」ボタンに続いてgit url

  1. URLを[URL /パス]フィールドに貼り付けて、わかりやすい名前を付けます。私はそれを「マスター」と呼んだ。[デフォルトのリモート]チェックボックスはオンにしないでください。このリポジトリに直接プッシュすることはできません。

「リモートの詳細」ダイアログで強調表示された「リモート名」および「URL /パス」フィールド

  1. [OK]を押すと、リポジトリのリストに表示されます。

「リポジトリ設定」ダイアログのリポジトリのリストに追加された「マスター」リポジトリ

  1. もう一度「OK」を押すと、「リモート」のリストに表示されます。

サイドバーのリモートリストでハイライトされた「マスター」リポジトリ

  1. [フェッチ]ボタンをクリックします(ソースツリーのヘッダー領域の左上)。

ヘッダー領域の「取得」ボタン

  1. [すべてのリモートから取得]チェックボックスがオンになっていることを確認して、[OK]を押します

「フェッチ」ダイアログでハイライトされた「すべてのリモートからフェッチ」チェックボックス

  1. 「マスター」ブランチをダブルクリックして、まだチェックアウトされていない場合はチェックアウトします。

  2. リセットしたいコミットを見つけます。リポジトリを「マスター」と呼んだ場合、「マスター/マスター」タグが付いたコミットを見つけたいと思うでしょう。

「master / master」タグが付いたコミットの例

  1. コミットを右クリックし、[現在のブランチをこのコミットにリセット]をクリックします。

  2. ダイアログで、[使用モード]フィールドを[ハード-すべての作業コピーの変更を破棄する]に設定し、[OK]をクリックします(失いたくない変更を最初に別のブランチに配置してください)。

「コミットにリセット」ダイアログで強調表示されている「使用モード」フィールド。 「すべての作業コピーの変更を破棄する」に設定されています

  1. [プッシュ]ボタン(ソースツリーのヘッダー領域の左上)をクリックして、変更をリポジトリのコピーにアップロードします。

ヘッダー領域の「プッシュ」ボタン

できました!

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