他の誰かのリポジトリからリモートブランチをプルする方法


266

誰かがフォークしたGitHubでホストされているプロジェクトがあります。彼らのフォークで、彼らは新しいブランチ「foo」を作成し、いくつかの変更を加えました。彼らの「foo」を私のリポジトリの「foo」という名前の新しいブランチにプルするにはどうすればよいですか?

プルリクエストを送信できることは承知していますが、このプロセスを自分で開始したいと思います。

以下を想定します。

  1. 彼らは私のプロジェクトを分岐させたので、両方のリポジトリは同じ「歴史」を共有しています
  2. GitHubは、彼らのプロジェクトが私のプロジェクトから分岐したことを示していますが、私のローカルリポジトリには、この人のプロジェクトへの参照がありません。それらをリモートとして追加する必要がありますか?
  3. 「foo」というブランチはまだありません-最初に手動で作成する必要があるかどうかわかりません。
  4. 私はこれを私のマスターではなく、別のブランチに引き込んで欲しいです。

回答:


349
git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo

これにより、ローカルブランチがセットアップされfoo、リモートブランチが追跡されますcoworker/foo。したがって、同僚がいくつかの変更を加えたら、それらを簡単にプルできます。

git checkout foo
git pull

コメントへの応答:

クール:)そのブランチに独自の変更を加えたい場合、「foo」から2番目のローカルブランチ「bar」を作成し、「foo」を直接操作する代わりにそこで作業する必要がありますか?

私はそれをお勧めしますが、新しいブランチを作成する必要はありません。直接コミットしてfoo、同僚にブランチをプルさせることもできます。しかし、そのブランチはすでに存在しており、あなたのブランチfooはその上流のブランチとしてセットアップする必要があります:

git branch --set-upstream foo colin/foo

colin同様の方法で定義されたリポジトリ(同僚のリポジトリのリモート)を想定しています。

git remote add colin git://path/to/colins/repo.git

3
それは非常に高速でした:)あなたは彼がgit://他の人のGitHubリポジトリページからのURLをの代わりに使用するべきだと付け加えたいかもしれません//path/to/coworkers/repo.git。(それが私の答えを遅くしすぎた理由でした;))
マーク・ロングエアー

クール:)そのブランチに独自の変更を加えたい場合、「foo」から2番目のローカルブランチ「bar」を作成し、「foo」を直接操作する代わりにそこで作業する必要がありますか?
Colin O'Dell、

または、私の「foo」で直接作業して、後で彼の変更をプル/マージしても安全ですか?ここでのベストプラクティスはどれですか。
Colin O'Dell、

1
パーフェクト、それはまさに私が探していたものです:)あなたの助けに感謝します!!
Colin O'Dell、

1
3分でいい答え!
Tieme 2014年

103

いいえ、リモートとして追加する必要はありません。 それは面倒で毎回やるのが面倒です。

彼らのコミットをつかむ:

git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch

これにより、ローカルブランチが作成され、そのブランチとournameforbranchまったく同じ名前が付けられtheirbranchます。質問の例では、最後の引数はになりますfoo:foo

:ournameforbranch自分のブランチの1つと競合しない名前を考えるのが面倒な場合は、メモ部分をさらに省略することができます。その場合、呼ばれる参照FETCH_HEADが利用可能です。あなたはgit log FETCH_HEAD彼らのコミットを見て、そして彼らのコミットcherry-pickedをチェリーピックするようなことをすることができます。

それを彼らに押し戻す:

多くの場合、あなたは彼らの何かを修正してそれをすぐに押し戻したいです。それも可能です:

git fetch git@github.com:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git push git@github.com:theirusername/reponame.git HEAD:theirbranch

切り離された状態で作業することが心配な場合は、必ずを使用してブランチを作成し、それ以上をに:ournameforbranch置き換えてください。FETCH_HEADHEADournameforbranch


2
これをありがとう、あなたと他の人の両方が同じ名前のブランチ(デフォルトのmasterブランチなど)を持っている場合、他の回答は機能しません
ジョブ

2
それの価値は、あなたのgithubのアカウントに関連付けられたSSHキーのようなものを持っていない場合は、この方法は作業が、表示されないことに言及stackoverflow.com/questions/12940626
Przemek D

リポジトリにプッシュできるように、コラボレーターとして追加する必要はありませんか?
ハニー

@ハニー確かに!プッシュでは、リモートエンドでプッシュするために必要な権限があることを前提としています。同様に、フェッチはパスがアクセス可能であることを前提としています。
Antak 2017年

git branch -m newbranchこの切り離された状態で実行すると、gitは気を失い、リポジトリが有効ではなくなったと言い始めます。git init「newbranch」という名前のブランチで、それを修正して多かれ少なかれ以前の状態に戻したようです。
Ian Hickson

14

アンタクの答え:

git fetch git@github.com:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

あなたにあげる:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

次に(Przemek Dのアドバイスに従って)使用

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>

6

以下は、別のユーザーのフォークからPRブランチをチェックアウトするためにGitHubと連携する便利なソリューションです。プルリクエストID(GitHubがPRタイトルとともに表示される)を知っている必要があります。

例:

安全でないコードの修正#8
アリスは1つのコミットをyour_repo:masterfrom にマージしたいher_repo:branch

git checkout -b <branch>
git pull origin pull/8/head

と異なる場合は、リモコンを交換してくださいorigin
置き換えて8正しいプルリクエストIDと。


2
これにはより多くの賛成票が必要です。pe3rfectlyに動作し、トップ投票の回答で得ていた「致命的:リモート参照が見つかりませんでした」というエラーを回避しました。ありがとう!
Michael Romrell

2行の簡単なコード。これを共有してくれてありがとう!これよりも優れているのは、更新をプルリクエストに簡単にマージできることだけです。
klewis

4

GitHubには、前述の回答に関連する新しいオプションがあります。PRからコマンドラインをコピーして貼り付けます。

  1. PRの下部までスクロールして、MergeまたはSquash and mergeボタンを表示します
  2. 右側のリンクをクリックします。 view command line instructions
  3. 手順1の右側にあるコピーアイコンを押します。
  4. 端末にコマンドを貼り付けます

2

フォークされたリポジトリが保護されているため、直接プッシュできない場合、目的がfooに変更を加えることである場合は、次のようにブランチfooをリポジトリに取得する必要があります。

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/foo

これで、上流に関連付けられていないfooのローカルコピーができました。変更をコミット(またはコミットしない)してから、fooを独自のリモートリポジトリにプッシュできます。

git push --set-upstream origin foo

これでfooがGitHubのリポジトリにあり、ローカルfooがそれを追跡しています。彼らがfooに変更を加え続けるなら、あなたは彼らをフェッチしてあなたのfooにマージすることができます。

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