マージされていないアップストリームプルリクエストを他のフォークから私のフォークに適用する方法は?


465

私がフォークしているGitHub上のプロジェクトには、作成者がまだプルしていない、自分のフォークにプルしたい新しいプルリクエストがあります。

他のフォークからのプルリクエストを私のフォークに適用する簡単な方法はありますか?ここに私が行方不明のものはありますか?



gitコマンドを使用して実行すると、これはGitHubのネットワークグラフに反映されますか?
ADTC、2014

すべてのブランチを見つけるのも興味深いかもしれません:stackoverflow.com/q/47798937/10245
Tim Abell

回答:


276

あなたはそれを手動で非常に簡単に行うことができます:

  • 他のフォークをリポジトリのリモートとして追加します。

    git remote add otherfork git://github.com/request-author/project.git
    
  • 彼のリポジトリのコミットを取得する

    git fetch otherfork
    
  • プルリクエストを適用するには、2つのオプションがあります(ピック1を選択しない場合)。

    1. オリジンとプルリクエストの間に追加された最終的なコミットも適用する必要がない場合は、プルリクエストが形成されたブランチをリベースすることができます

      git rebase master otherfork/pullrequest-branch
      
    2. プルリクエストでコミットのみが必要な場合は、それらのSHA1を特定し、

      git cherry-pick <first-SHA1> <second-SHA1> <etc.>
      

166
実際、cherry-pickは使用しないでください。新しいコミットが作成されます。プルリクエストをアップストリームに送信すると混乱を招きます。代わりに、プルリクエストが要求するようにマージする必要があります。リモートを追加する必要もありません。 git pull URL branchname
Tekkub、

3
@Tekkub:同意してください。新しく作成されたコミットとの混乱を避ける方が良いかもしれません。Mergeは、マージしているブランチから他の変更をもたらすことができるので、私の頭ではあまりエレガントではありません
CharlesB

8
はい、しかしこの場合、彼はプルリクエストを自分のフォークにプルする方法を具体的に尋ねました。プル==マージ。
Tekkub、

1
@ CharlesB、GitHubは同じブランチの新しいコミットをプルリクエストに自動的に追加するため、「その他の変更」を取得するのは難しくありません(リクエスタがベストプラクティスに従い、変更を継続的な開発とは別のブランチに置くと仮定すると、すべてのコミットが関連していることを確認してください)、プルリクエストの一部のみが必要な場合を除いて、
neverfox

4
私のメンタルグリッチを共有する人たちにとって、「otherfork」は元のレポを参照しているのではなく、プルリクエストを発行したフォークから元のレポへのコミットを参照しています。元のリポジトリを無視して、プルリクエストを作成したフォークに直接移動します。プルが参照していたコミットを手動でプルし、自分のコミットとマージしたい。
Michael Khalili 2014年

282

更新:ウェブページ経由

これはgithub Webページからも行うことができます。

私は、関心のあるフォーク()からの保留中のプル要求を持つMyFork共通リポジトリ(BaseRepo)のフォーク()をすでに持っているはずだと思いますOtherFork

  1. フォークに移動OtherForkしたいプルリクエストを開始したフォーク()に移動します(MyFork)に移動
  2. のプルリクエストページに移動します OtherFork
  3. 新しいプルリクエストをクリックします
  4. 保留中のプルリクエストが提供されます。適切なOtherForkブランチを選択することも忘れないでください。左側をベースフォークとして選択するyourフォーク(MyFork)(重要)。
  5. のオプションがにView pull request変わりますCreate pull request。こちらをクリックしてください。

これで、保留中のプルリクエストがフォーク(MyFork)にあり、単純に受け入れることができます。


6
美しく動作します。cmd行よりもはるかにシンプルで、変更を簡単に確認できます。ありがとうございました。
Alveoli

3
UIで「OtherFork」にアクセスする方法を見つけるのに苦労しました。簡単にアクセスするには、githubユーザー名でURLを変更します。ie github.com/userName/repoName
Charles

2
手順4に記載されている保留中のプルリクエストを確認できませんでした。代わりにOtherFork、右側の「比較」ドロップダウンから、によって行われたプルリクエストに対応するブランチを選択しました。次に、プルリクエストを作成できるため、上記のように左側をベースフォークとして選択しました。
seddonym

フォークがなければ動作します。例:github.com/OculusVR/RakNet/pull/61/files
MilanBabuškov16年

1
githubsサイトからの正確な単語は古くなっている可能性がありますが、プロセスは順調です。超シンプル-ありがとう!
kevnk 2016

73

以前にTekkubが言ったように、ブランチを直接プルすることができます。ほとんどの場合、GitHubの場合、ブランチはプロジェクトの要求側のユーザーフォークの単純な「マスター」です。

例: git pull https://github.com/USER/PROJECT/ BRANCH

そして実際的な例として:

safaribooksと呼ばれるgithubプロジェクトをフォークし、元のプロジェクトに次のプルリクエストがあり、フォークに入れたいとします。

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

次に、フォークのクローンプロジェクトフォルダーで、次を実行します。

git pull https://github.com/fermionic/safaribooks.git fix-str-decode

20
これの欠点は、ブランチ内にプル要求以外の他のものが含まれる可能性があることです。また、プルリクエストの作成者のフォークの適切なURLを検索する必要があります。ワンライナーを使用する場合は、git pull https://github.com/{upstream/project} refs/pull/{id}/head代わりに使用することをお勧めします。
jbyler 2014年

1
@jbylerブランチに他のものが含まれている場合、GitHubがそれらを使用してプルリクエストを更新すると確信しています。
Tim Malone、

22

プロジェクトのプルリクエストは多くの異なる作成者(フォーク)から送信される可能性があり、フォークごとに個別のリモートが必要になることはおそらくありません。また、プルリクエストを送信するときに作成者が使用したブランチや、作成者のマスターブランチにある可能性のあるブランチについて、何も想定しないでください。そのため、プルリクエストは、他のフォークに表示されるよりも、上流のリポジトリに表示されるように参照することをお勧めします。

ステップ1:

git remote add upstream <url>

おそらくすでにこの手順を実行しているでしょうが、そうでない場合は、上流プロジェクトにリモートを定義する必要があります。URLは、フォークしたプロジェクトのクローンURLです。詳細については、フォーク用のリモートの構成およびフォークの同期を参照してくださいupstreamリモコンに付ける名前です。何でもかまいませんが、 upstream付ける名前です。、従来の名前です。

ステップ2:

git pull upstream refs/pull/{id}/head

... {id}プルリクエスト番号です。 upstreamプルするリモートの名前です。つまり、手順1を正確に実行した場合は、単に「上流」になります。URLにすることもできます。その場合は、手順1をスキップできます。

ステップ3:

マージコミットのコミットメッセージを入力します。デフォルトのままにしておくこともできますが、プルリクエスト番号、それが修正する問題、および簡単な説明を含む1行の要約を提供することをお勧めします。

Merge PR#42, fixing VIM-652, support for mapping arbitrary IDEA actions

また、プルリクエストを含むローカルブランチを作成するバリアントの関連する回答もご覧ください。そして最後のバリアント:git pull upstream refs/pull/{id}/headコミットをローカルリポジトリに取得し、それらを次のように参照できますFETCH_HEAD(例:git log ..FETCH_HEAD何が入っているかを確認するためにgit merge FETCH_HEAD
jbyler

どのようにリベースするのですか?プルリクエストが先頭にあり、マージバブルを回避できますか?
マイケルジョンストン

1
プルリクエストの作成者がリポジトリを削除したため、これが私が必要としたソリューションでした。
jswetzen 2017

20

私のために働いたいくつかのより詳細な情報。

フォークしたリポジトリの.git / configファイルは次のようになります。

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = false
[remote "origin"]
        url = git@github.com:litzinger/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
        rebase = true
[remote "source"]
        url = git://github.com/revolunet/angular-carousel.git
        fetch = +refs/heads/*:refs/remotes/source/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

次に「git fetch source」を実行すると、フォークされたリポジトリからのすべてのプルリクエストがリストされます。

 * [new ref]         refs/pull/54/head -> origin/pr/54
 * [new ref]         refs/pull/67/head -> origin/pr/67
 * [new ref]         refs/pull/69/head -> origin/pr/69
 * [new ref]         refs/pull/71/head -> origin/pr/71

次に、特定のプルリクエストをマージするには、「git merge master origin / pr / 67」を実行します。


1
私は.git / configを編集して[remote "source"]行を追加しましたが、興味のあるプロジェクトのため、指示は完璧に機能しました。私はこの答えが大好きです。
フィロヴィヴェロ2014

3
優れた関連アドバイスは、news.ycombinator.com / item ?id = 9051220にあり、help.github.com / articles / checking - out - pull - requests - locallyは、この(素晴らしい)GitHub固有の読み取り専用リモートrefs/pull/名前空間を示唆しています。 。
フィリップダービン2015

Smartgitを使用している場合smartgit.branch.otherRefs=notes;pull、syntevo.com / doc / display / SG / System + Propertiesに従ってsmartgit.propertiesに追加すると、これらのプルリクエスト(およびクローズされたもの)がロググラフに表示されます。そこからマージすることもできます。 。
CADが16年

ところで、コマンドラインでgit fetch source + refs / heads / *:refs / remotes / upstream / * + refs / pull / * / head:refs / remotes / origin / pr / *
lib

9

私がすることは次のとおりです。

git checkout master
git remote add #NAME# #ADDRESS TO REPO#
git fetch #USERNAME#
git checkout -b test_fork
git rebase #NAME#/#BRANCH#

これで、変更をテストブランチにマージしました。 test_fork。そのため、変更によってツリーが汚れることはありません。

オプションで、上記のチェリーピックを使用して、より望ましい場合は特定のコミットを選択できます。

幸せの旅 :)


0

これには、便利なダンディスクリプトを使用します。次のように入力してスクリプトを実行します。

git prfetch upstream

そしてそれは上流のフォークからすべてのプルリクエストを取得します。

スクリプトを作成するには、ファイルを作成します~/bin/git-prfetch

ファイルには次のものが含まれている必要があります。

#!/bin/bash

if [ -z "$1" ]; then
    echo "Please supply the name of a remote to get pull requests from."
    exit 1
fi

git fetch $1 +refs/heads/\*:refs/remotes/$1/\* +refs/pull/\*/head:refs/remotes/$1/pr/\*

次のように設定して、パスにスクリプトが含まれていることを確認します。

export PATH="$HOME/bin:$PATH"

このファイルを~/.bashrcに追加して、変更を永続的にすることができます。

ここで、プルリクエストを取得するフォークを必ず追加してください。

git remote add upstream https://github.com/user/repo.git

その後

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