web-dev-qa-db-ja.com

GitHubのforkしたリポジトリを更新するにはどうすればいいですか?

私は最近プロジェクトをフォークし、いくつかの修正を加えました。私はその後プルリクエストを作成し、それはその後受け入れられました。

数日後、別の貢献者によって別の変更が加えられました。だから私のフォークはその変更を含んでいません。

その変更をどうやったらフォークに反映させることができますか?貢献するためのさらなる変更があるとき、私は私のフォークを削除して作り直す必要がありますか?または更新ボタンがありますか?

3171
Lea Hayes

フォークしたリポジトリのローカルクローンでは、元のGitHubリポジトリを「リモート」として追加できます。 ( "Remotes"はリポジトリのURLのニックネームのようなものです。たとえばOriginはその1つです。)その後、そのアップストリームリポジトリからすべてのブランチを取得し、アップストリームバージョンで作業を続けるために作業をリベースできます。次のようなコマンドに関しては、

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches,
# such as upstream/master:

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

あなたがあなたのマスターブランチの履歴を書き換えたくないのなら(例えば他の人がそれをクローンしているかもしれないので)、あなたは最後のコマンドをgit merge upstream/masterで置き換えるべきです。ただし、できるだけクリーンなプル要求をさらに作成するには、おそらくリベースすることをお勧めします。


ブランチをupstream/masterにリベースした場合は、GitHubの自分のフォークリポジトリにプッシュするためにプッシュを強制する必要があるかもしれません。次のようにします。

git Push -f Origin master

あなたがリベースした後初めて-fを使う必要があります。

3470
Mark Longair

2014年5月から、GitHubから直接forkを更新することが可能です。これはまだ2017年9月現在で動作しています、しかしそれはダーティコミット履歴につながるでしょう。

  1. GitHubでフォークを開きます。
  2. クリック Pull Requests
  3. クリック New Pull Request。デフォルトでは、GitHubはオリジナルをあなたのフォークと比較します、そしてもしあなたが何も変更をしなければ比較するものは何もないはずです。
  4. クリック switching the base あなたがそのリンクを見れば。それ以外の場合は、手動で base fork あなたのフォークに降りて head fork 上流へ。今すぐGitHubはあなたのフォークをオリジナルのものと比較するでしょう、そしてあなたはすべての最新の変更を見るはずです。 enter image description here
  5. Create pull request そしてプルリクエストに予測可能な名前を付けます(例:Update from original)。
  6. 下にスクロール Merge pull requestしかし、まだ何もクリックしないでください。

今、あなたは3つのオプションを持っています、しかし、それぞれは、クリーンではないコミット履歴につながります。

  1. デフォルトは醜いマージコミットを作成します。
  2. ドロップダウンをクリックして[Squash and merge]を選択すると、途中のコミットはすべて1つにまとめられます。これはほとんどの場合あなたが望まないものです。
  3. クリックした場合 Rebase and merge全てのコミットはあなたと "一緒に"行われ、元のPRはあなたのPRにリンクし、GitHubはThis branch is X commits ahead, Y commits behind <original fork>を表示します。

そのため、GitHub Web UIを使用してレポをアップストリームで更新し続けることができますが、そうすることでコミット履歴が確実に失われます。代わりに コマンドライン に固執する - それは簡単です。

689
lobzik

GitHubの公式文書は フォークの同期

フォークを同期する

セットアップ

同期する前に、上流のリポジトリを指すリモートを追加する必要があります。あなたが最初にフォークしたときにこれをしたかもしれません。

ヒント:フォークを同期しても、リポジトリのローカルコピーのみが更新されます。 GitHub上のリポジトリは更新されません。

$ git remote -v
# List the current remotes
Origin  https://github.com/user/repo.git (fetch)
Origin  https://github.com/user/repo.git (Push)

$ git remote add upstream https://github.com/otheruser/repo.git
# Set a new remote

$ git remote -v
# Verify new remote
Origin    https://github.com/user/repo.git (fetch)
Origin    https://github.com/user/repo.git (Push)
upstream  https://github.com/otheruser/repo.git (fetch)
upstream  https://github.com/otheruser/repo.git (Push)

同期中

リポジトリをアップストリームと同期させるには、2つのステップが必要です。最初にリモートからフェッチし、次に目的のブランチをローカルブランチにマージする必要があります。

フェッチ

リモートリポジトリから取得すると、そのブランチとそれぞれのコミットが反映されます。これらはあなたのローカルリポジトリの特別なブランチの下に保存されています。

$ git fetch upstream
# Grab the upstream remote's branches
remote: Counting objects: 75, done.
remote: Compressing objects: 100% (53/53), done.
remote: Total 62 (delta 27), reused 44 (delta 9)
Unpacking objects: 100% (62/62), done.
From https://github.com/otheruser/repo
 * [new branch]      master     -> upstream/master

これで、アップストリームのマスターブランチはローカルブランチ、upstream/masterに格納されました。

$ git branch -va
# List all local and remote-tracking branches
* master                  a422352 My local commit
  remotes/Origin/HEAD     -> Origin/master
  remotes/Origin/master   a422352 My local commit
  remotes/upstream/master 5fdff0f Some upstream commit

マージ

上流のリポジトリを取得したので、その変更をローカルブランチにマージしたいと思います。これにより、ローカルの変更を失うことなく、そのブランチをアップストリームと同期させることができます。

$ git checkout master
# Check out our local master branch
Switched to branch 'master'

$ git merge upstream/master
# Merge upstream's master into our own
Updating a422352..5fdff0f
Fast-forward
 README                    |    9 -------
 README.md                 |    7 ++++++
 2 files changed, 7 insertions(+), 9 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md

もしあなたのローカルブランチがユニークなコミットをしていなければ、gitは代わりに "早送り"を実行します。

$ git merge upstream/master
Updating 34e91da..16c56ad
Fast-forward
 README.md                 |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

ヒント:GitHubでリポジトリを更新したい場合は、 ここの指示に従ってください。

408
jumpnett

多くの答えは、あなたのフォークを親リポジトリの1コミット先に移動することになります。この回答は、見つかった手順を要約します here これは、フォークを親と同じコミットに移動します

  1. ディレクトリをローカルリポジトリに変更します。

    • git checkout masterでない場合は、masterブランチに切り替えます
  2. 親をリモートリポジトリとして追加しますgit remote add upstream <repo-location>

  3. 問題git fetch upstream
  4. 問題git rebase upstream/master

    • この段階で、git statusと入力して、マージされる内容をコミットすることを確認します
  5. 問題git Push Origin master

これらのコマンドの詳細については、 手順 を参照してください。

91
Sahar Rabinoviz

2013年11月以降、GitHubに公開されているローカルフォークとアップストリームの同期を保つための非常に単純で直感的な方法を追加するよう求める非公式の機能要求がありました。

https://github.com/isaacs/github/issues/121

注:機能の要求は非公式なので、実装するためにこのような機能に対するサポートを追加するために[email protected]に連絡することをお勧めします。上記の非公式の機能要求は、これが実行されていることに対する関心の量の証拠として使用することができます。

43
isedwards

はじめに: あなたのフォークは "Origin"であり、あなたがフォークしたリポジトリは "upstream"です。

次のようなコマンドを使って、すでに自分のフォークを自分のコンピュータにクローンしたとしましょう。

git clone [email protected]:your_name/project_name.git
cd project_name

それが与えられているなら、あなたはこの順番で続ける必要があります:

  1. クローンリポジトリ( "Origin")に "upstream"を追加します。

    git remote add upstream [email protected]:original_author/project_name.git
    
  2. 「アップストリーム」からコミット(およびブランチ)を取得します。

    git fetch upstream
    
  3. フォークの "master"ブランチ( "Origin")に切り替えます。

    git checkout master
    
  4. あなたの "master"ブランチの変更を隠します。

    git stash
    
  5. "上流"の "マスター"ブランチから "オリジン"の "マスター"ブランチへの変更をマージします。

    git merge upstream/master
    
  6. マージの競合があれば解決し、マージをコミットします。

    git commit -am "Merged from upstream"
    
  7. フォークへの変更をプッシュする

    git Push
    
  8. (もしあれば)あなたの隠した変更を取り戻す

    git stash pop
    
  9. これで終わりです!おめでとうございます。

GitHubはまたこのトピックのための指示を提供します: フォークの同期

39

私のように、あなたが直接マスターに直接コミットすることは絶対にしないでくださいであれば、それはあなたが本当にすべきことですが、あなたは次のことができます。

あなたのフォークのローカルクローンから、あなたのアップストリームリモートを作成します。あなたは一度だけそれをする必要があります:

git remote add upstream https://github.com/whoever/whatever.git

それから、上流のリポジトリマスターブランチに追いついたいときはいつでも、あなたはする必要があります:

git checkout master
git pull upstream master

あなたが自分自身をマスターすることに何もコミットしていないと仮定すれば、あなたはすでに終わっているはずです。これでローカルマスターをOriginのリモートGitHubフォークにプッシュできます。開発ブランチを最新のローカルマスターにリベースすることもできます。

最初のアップストリームセットアップとマスターチェックアウトを過ぎて、あなたのマスターをアップストリームと同期させるために次のコマンドを実行するだけです:git pull upstream master

37
Slion

この回答の時点で、GitHubはウェブインターフェースにこの機能を持っていません( もう言わないでしょうか? )。ただし、[email protected]に投票を追加するよう依頼することはできます。

それまでの間、GitHubユーザーbardiharborowはこれを行うためのツールを作成しました。 https://upriver.github.io/

ソースはここにあります: https://github.com/upriver/upriver.github.io

22
Lucero

Windows用のGitHubを使用している場合は、ワンクリックでフォークを更新できます。

  1. UIでリポジトリを選択してください。
  2. 上部の[ユーザー/支店から更新]ボタンをクリックします。
15
Shital Shah

実際には、ブラウザのアップストリームのコミットからフォークにブランチを作成することが可能です。

  • https://github.com/<repo>/commits/<hash>を開きます。ここでrepoはあなたのフォークで、hashはフルハッシュです。上流のWebインターフェースで見つけることができるコミットの。たとえば、 https://github.com/max630/linux/commits/0aa0313f9d576affd7747cc3f179feb097d2899 を開くことができます。これは、執筆時点でlinuxmasterを指しています。
  • "Tree:...."ボタンをクリックしてください。
  • 新しいブランチの名前を入力してを押します Enter

Enter image description here

その後、そのブランチをローカルクローンに取得することができます。そのコミットの上で編集をプッシュするときに、そのすべてのデータをGitHubにプッシュバックする必要はありません。あるいはWebインターフェースを使用して、そのブランチの何かを変更してください。

それがどのように動作するか(推測ではありません、GitHubがそれを正確に行う方法はわかりません):フォークはオブジェクトストレージを共有し、 名前空間 を使用してユーザーの参照を分離します。そのため、フォークするまでにそれらが存在していなくても、あなたはあなたのフォークを通してすべてのコミットにアクセスすることができます。

9
max630

以下の手順に従ってください。私はそれらを試してみました、そしてそれは私を助けました。

あなたのブランチへのチェックアウト

構文: git branch yourDevelopmentBranch
例: gitチェックアウトマスター

最新のコードを取得するためのソースリポジトリブランチを取得する

構文: git pull https://github.com/tastejs/awesome-app-ideas master
例: git pull https://github.com/ORIGINAL_OWNER/ORIGINAL_REPO.git BRANCH_NAME

8
Venkat.R

この答えを補足するものとして、私はクローンリポジトリのすべてのリモートブランチ( Origin )を upstream branchesから一度に更新する方法を探していました。これが私のやり方です。

これは、ソースリポジトリを指す upstream リモートがすでに設定されていて( Origin が分岐している)、git fetch upstreamと同期していることを前提としています。

次に実行します。

for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git Push Origin refs/remotes/upstream/$branch:refs/heads/$branch; done

このコマンドの最初の部分は、 upstream remoteリポジトリ内のすべてのヘッドを一覧表示し、SHA-1とそれに続くrefs/heads/ブランチ名プレフィックスを削除します。

次に、これらの各ブランチに対して、 upstream リモートトラッキングブランチ(ローカル側のrefs/remotes/upstream/<branch>)のローカルコピーを Origin (リモート側のrefs/heads/<branch>)のリモートブランチに直接プッシュします。

これらのいずれかのbranch syncコマンドは、次の2つのうちの1つの理由で失敗する可能性があります。 upstream ブランチが書き直されたか、またはそのブランチでコミットをコミットしました。あなたがあなたのフォークのブランチに何もコミットしていない最初のケースでは、それは強制的にプッシュするのが安全です( -f スイッチを追加します;すなわち上記のコマンドでgit Push -f)。それ以外の場合は、forkブランチが分岐していてコミットが upstream にマージされるまでsyncコマンドが機能することを期待できないため、これは正常です。

フォークしたリポジトリを次の1行で更新します。

git pull https://github.com/forkuser/forkedrepo.git branch

他のソリューションがここに掲載されているように、あなたのプロジェクトに別のリモートエンドポイントを追加したくない場合はこれを使用してください。

5
R.Bravo

Android StudioはGitHubのforkリポジトリと連携するようになりました(コンソールコマンドで "上流"のリモートリポジトリを追加する必要すらありません)。

メニューを開く _ vcs _ Git

そして最後の2つのポップアップメニュー項目に注意してください。

  • GitHubフォークを元に戻します

  • プルリクエストを作成

試してみてください。最初のものを使って私のローカルリポジトリを同期させます。とにかく親のリモートリポジトリ( "upstream")からのブランチは "Rebase my GitHub fork"をクリックした後にAndroid Studioでアクセス可能になり、あなたはそれらを簡単に操作できるようになります。

(私はAndroid Studio 3.0を "Git integration"と "GitHub"プラグインと共に使っています。)

Enter image description here

3
alexshr

フォークしたリポジトリのクローンを作成したら、クローンが存在するディレクトリパスとGit Bashターミナルの数行に移動します。

$ cd project-name

$ git remote add upstream https://github.com/user-name/project-name.git
 # Adding the upstream -> the main repo with which you wanna sync

$ git remote -v # you will see the upstream here 

$ git checkout master # see if you are already on master branch

$ git fetch upstream

そしてそこに行くのは良いことです。メインリポジトリで更新されたすべての変更はあなたのフォークリポジトリにプッシュされます。

"fetch"コマンドは、プロジェクトを最新の状態に保つために不可欠です。 "git fetch"を実行した場合にのみ、同僚がリモートサーバーにプッシュした変更について通知されます。

あなたはまだ ここ にさらなる問い合わせのために訪れることができます

3
Prateek Chanda

それはあなたのリポジトリのサイズとあなたがそれをどのようにフォークしたかに依存します。

もしそれが非常に大きなリポジトリであるなら、あなたは特別な方法でそれを管理したいと思うかもしれません(例えばドロップ履歴)。基本的には、現在のバージョンと上流のバージョンとの間で違いを確認し、それらをコミットしてからチェリーをマスターに戻すことができます。

これを読んでみてください 。ここでは、大きなGitリポジトリをどのように扱うか、そしてそれらを最新の変更でアップストリームする方法について説明します。

1
s0nicYouth

アップストリームを設定する場合。 git remote -vで確認すると、これで十分です。

git fetch upstream
git checkout master
git merge --no-edit upstream/master
git Push
1
prosti

フォークされたリポジトリを常に最新の状態に保つには、2つの主なものがあります。

1.分岐マスターを作成しますフォークマスターからそこで変更を行います

したがって、Pull Requestが受け入れられると、ブランチを安全に削除できます。アップストリームで更新すると、寄贈されたコードがフォークされたリポジトリのマスターに反映されます。これにより、マスターは常にクリーンな状態になり、新しいブランチを作成して別の変更を行うことができます。

2.スケジュールされたジョブを作成しますfork masterに対して自動的に更新を行います

これはcronで実行できます。 Linuxで実行する場合のサンプルコードを次に示します。

$ crontab -e

このコードをcrontab fileに配置して、ジョブを1時間ごとに実行します。

0 * * * * sh ~/cron.sh

次に、cron.shスクリプトファイルとgit interactwithssh-agent を作成します=および/またはexpect以下のように

#!/bin/sh
WORKDIR=/path/to/your/dir   
REPOSITORY=<name of your repo>
MASTER="[email protected]:<username>/$REPOSITORY.git"   
[email protected]:<upstream>/<name of the repo>.git  

cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent` && expect ~/.ssh/agent && ssh-add -l
git clone $MASTER && cd $REPOSITORY && git checkout master
git remote add upstream $UPSTREAM && git fetch --Prune upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
    echo "all the same, do nothing"
else
    echo "update exist, do rebase!"
    git reset --hard upstream/master
    git Push Origin master --force
fi
cd $WORKDIR && rm -rf $REPOSITORY
eval `ssh-agent -k`

分岐したリポジトリを確認します。時々この通知が表示されます:

このブランチは<upstream>:masterでもあります。

enter image description here

0
Chetabahana