元のGitHubリポジトリから分岐したGitHubリポジトリに新しい更新をプルする


615

私はGitHubで誰かのリポジトリをフォークし、元のリポジトリで行われたコミットと更新で私のバージョンを更新したいと考えています。これらは私が私のコピーをフォークした後に作られました。

オリジンで行われた変更を取得してリポジトリに組み込むにはどうすればよいですか?


1
重複の可能性、またはおそらく単に関連:GitHubのフォーク間のマージ

同期したい追加のタグがある場合はgit push --force origin --tags、提案されたソリューションの後に実行してください!
MediaVince 2017

回答:


716

元のリポジトリ(フォークしたもの)をリモートとして追加する必要があります。

GitHubのフォークのmanページ

フォーク

クローンが完了すると、リポジトリにはoriginGitHub上のフォークを指す「」という名前のリモートが作成されます。
名前を混乱させないでください。これは、分岐した元のレポを指すものではありません。そのレポを追跡しやすくするために、「upstream」という名前の別のリモートを追加します。

$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

また、GitHubの操作を容易にするルビーの宝石もあります

分岐した

Gitフォークはgit cloneですか?」も参照してください。


14
要約については、bassistance.de / 2010/06/25 / git-fu-updating-your-github-forkも参照してください。
VonC

2
@syedrakib私はを好みgit rebase upstream/masterますが、答えに2つの可能性を追加しました。
VonC 2013年

1
@PaBLoXあなたがレポをフォークした場合、あなたは上で作業しているあなたに、レポあなたのブランチ:リベースとプッシュ強制:いいえ混乱関与すること。進行中のプルリクエストでも正しく更新されます。
VonC 2014年

2
@PaBLoXあなたは混乱を作成しません:あなたgit push --force、GitHub上のブランチの履歴を、リベースしたローカルブランチに置き換えます。あなただけが悲しいブランチを使っているので、混乱はありません。
VonC、2014年

2
わかります。私は今でも、それは難しく、自明ではなく、直感的ではないと思います。それでも、実際には以前に行われたものですが、私の変更が常に一番上(最後)になるのは奇妙です。以前に投稿したソリューションは、見栄えがよくなっています(それでも簡単ではありません)。問題は、コミットハッシュの変更(明らかに、新しい親が存在するため)で、問題が呼び出されたときにgithub内で多くのノイズを生成することです。それでも、無意味なマージコミットを作成したり、履歴について「嘘」を付けたりせずに、アップストリームの更新を維持して独自のフォークを管理する方法がないことに驚きます。
パブロオルモスデアギレラC.

99

VonCの回答に加えて、さらに好みに合わせて調整することもできます。

リモートブランチからフェッチした後も、コミットをマージする必要があります。私は交換します

$ git fetch upstream

$ git pull upstream master

git pullは基本的にgit fetch + git mergeであるためです。


上流のブランチで既存のファイルに変更がなく、追加されたリソースファイルが少ないことを知っている場合はどうなりますか?それでもマージが必要ですか?
azec-pdx

4
確かにその場合は早送りします
Domness 2013年

どのようにして作るん、上流マスター、我々はそれを100%信頼してすべてのローカルファイル(なしマージの競合そう)上流のマスター上書きこれを行うために管理している...この場合はコードでリードして
snh_nl

1
@snh_nl git rebase upstream masterは、から十分に逸脱している場合は競合がないことに注意してくださいupstream/mastergit-scm.com/docs/git-rebaseを参照してください(tl; dr:これはローカルマスターをアップストリームのマスターにハードリセットし、その後、分岐点からすべてのローカルコミットを再マージしようとします)
cowbert

68

このビデオ、GitHubから直接フォークを更新する方法を示しています

手順:

  1. GitHubでフォークを開きます。
  2. をクリックしPull Requestsます。
  3. をクリックしNew Pull Requestます。デフォルトでは、GitHubはオリジナルをフォークと比較します。変更を行わなかった場合、比較するものはありません。
  4. をクリックしswitching the baseます。これでGitHubがフォークをオリジナルと比較し、最新の変更がすべて表示されるはずです。
  5. Create a pull requestこの比較をクリックして、予測可能な名前をプルリクエストに割り当てます(たとえば、オリジナルからの更新)。
  6. をクリックしCreate pull requestます。
  7. 下にスクロールしてクリックしMerge pull request、最後にConfirmマージします。フォークに変更がない場合は、自動的にマージできます。

3
残念ながら、この素晴らしいグラフィカルな方法では、受け入れられた回答のコメントで前述したように、フォークにノイズが追加されます。したがって、コマンドラインによる方法が推奨されます。help.github.com
Jonathan Cross

私はswitching the baseオプションを見つけることができませんでした
いつも

64

使用する:

git remote add upstream ORIGINAL_REPOSITORY_URL

これにより、上流がフォーク元のリポジトリに設定されます。次にこれを行います:

git fetch upstream      

これにより、マスターを含むすべてのブランチが元のリポジトリからフェッチされます。

このデータをローカルマスターブランチにマージします。

git merge upstream/master

フォークしたリポジトリ、つまりoriginに変更をプッシュします。

git push origin master

出来上がり!元のリポジトリの同期が完了しました。


どのように一つは、我々はそれを100%信頼してすべてのローカルファイル(なしマージの競合そう)上流マスター上書き上流マスターがこれを行うために管理している...この場合はコードでリードして作るん
snh_nl

1つの方法は、単にローカルコピーを削除して、新しいクローンを作成することです:)
ARK

1

GitHubデスクトップアプリケーションを使用している場合は、右上隅に同期ボタンがあります。Update from <original repo>左上の近くをクリックしてください。

同期する変更がない場合、これは非アクティブになります。

ここにあるいくつかのスクリーンショットこれを容易にするには。


1

失うものが何もない場合は、単に設定に移動してフォークを削除することもできます...下の危険ゾーンセクションに移動し、[リポジトリの削除]をクリックします。その後、リポジトリ名とパスワードを入力するように求められます。その後、元のファイルをフォークします。


1

CLIなしで実行したい場合は、Github Webサイトで完全に実行できます。

  1. フォークリポジトリに移動します。
  2. をクリックしNew pull requestます。
  3. 必ずフォークをベースリポジトリとして設定し、元の(アップストリーム)リポジトリをヘッドリポジトリとして設定してください。通常は、マスターブランチのみを同期します。
  4. Create new pull request
  5. マージボタンの右側にある矢印を選択し、マージではなくリベースを選択してください。次に、ボタンをクリックします。この方法では、不要なマージコミットが生成されません。
  6. できました。

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