チャプター ▾ 第2版

6.2 GitHub - プロジェクトへの貢献

プロジェクトへの貢献

アカウントの設定が完了したので、既存のプロジェクトに貢献する際に役立つ詳細について見ていきましょう。

プロジェクトのフォーク

プッシュアクセスを持たない既存のプロジェクトに貢献したい場合、そのプロジェクトを「フォーク」することができます。プロジェクトを「フォーク」すると、GitHubは完全にあなた自身のプロジェクトのコピーを作成します。それはあなたの名前空間に存在し、あなたはそれにプッシュすることができます。

歴史的に、「フォーク」という用語は文脈上やや否定的で、誰かがオープンソースプロジェクトを異なる方向に進め、競合するプロジェクトを作成して貢献者を分裂させることを意味していました。GitHubでは、「フォーク」は単にあなた自身の名前空間にある同じプロジェクトであり、よりオープンな方法で貢献するために、プロジェクトに公開で変更を加えることを可能にします。

この方法により、プロジェクトはユーザーを共同作業者として追加してプッシュアクセスを与える心配をする必要がありません。人々はプロジェクトをフォークし、それにプッシュし、「プルリクエスト」と呼ばれるものを作成することで、変更を元のリポジトリに貢献することができます。これについては次に説明します。これにより、コードレビューを伴う議論スレッドが開始され、オーナーと貢献者は、オーナーが満足するまで変更についてコミュニケーションを取ることができ、その時点でオーナーはそれをマージすることができます。

プロジェクトをフォークするには、プロジェクトページにアクセスし、ページの右上にある「Fork」ボタンをクリックします。

The “Fork” button
図 88. 「Fork」ボタン

数秒後、コードの書き込み可能な独自のコピーを持つ新しいプロジェクトページに移動します。

GitHubフロー

GitHubは、プルリクエストを中心とした特定のコラボレーションワークフローに基づいて設計されています。このフローは、単一の共有リポジトリで緊密なチームと共同作業している場合でも、数十のフォークを通じてプロジェクトに貢献している世界的に分散した企業や見知らぬ人々のネットワークと共同作業している場合でも機能します。これは、Git Branchingで説明されているトピックブランチワークフローを中心にしています。

一般的な仕組みは次のとおりです。

  1. プロジェクトをフォークする。

  2. masterからトピックブランチを作成する。

  3. プロジェクトを改善するためのコミットをいくつか作成する。

  4. このブランチをGitHubプロジェクトにプッシュする。

  5. GitHubでプルリクエストを開く。

  6. 議論し、必要に応じてコミットを続ける。

  7. プロジェクトオーナーがプルリクエストをマージまたはクローズする。

  8. 更新されたmasterをフォークに同期する。

これは基本的に、インテグレーションマネージャーワークフローで説明されているインテグレーションマネージャーワークフローですが、変更のコミュニケーションとレビューに電子メールを使用する代わりに、チームはGitHubのウェブベースのツールを使用します。

このフローを使用して、GitHubでホストされているオープンソースプロジェクトに変更を提案する例を見てみましょう。

ヒント

ほとんどの作業で、GitHubのウェブインターフェースの代わりに公式のGitHub CLIツールを使用できます。このツールは、Windows、macOS、およびLinuxシステムで使用できます。インストール手順とマニュアルについては、GitHub CLIのホームページにアクセスしてください。

プルリクエストの作成

トニーはArduinoプログラマブルマイクロコントローラーで実行するコードを探しており、GitHubでhttps://github.com/schacon/blinkという素晴らしいプログラムファイルを見つけました。

The project we want to contribute to
図 89. 貢献したいプロジェクト

唯一の問題は、点滅速度が速すぎることです。各状態変化の間で1秒ではなく3秒待つ方がはるかに良いと考えています。そこで、プログラムを改善し、提案された変更としてプロジェクトに提出し直しましょう。

まず、前述のように「Fork」ボタンをクリックして、プロジェクトの独自のコピーを取得します。ここでのユーザー名は「tonychacon」なので、このプロジェクトのコピーはhttps://github.com/tonychacon/blinkにあり、そこで編集できます。ローカルにクローンし、トピックブランチを作成し、コード変更を行い、最後にその変更をGitHubにプッシュし直します。

$ git clone https://github.com/tonychacon/blink (1)
Cloning into 'blink'...

$ cd blink
$ git checkout -b slow-blink (2)
Switched to a new branch 'slow-blink'

$ sed -i '' 's/1000/3000/' blink.ino (macOS) (3)
# If you're on a Linux system, do this instead:
# $ sed -i 's/1000/3000/' blink.ino (3)

$ git diff --word-diff (4)
diff --git a/blink.ino b/blink.ino
index 15b9911..a6cc5a5 100644
--- a/blink.ino
+++ b/blink.ino
@@ -18,7 +18,7 @@ void setup() {
// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  [-delay(1000);-]{+delay(3000);+}               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  [-delay(1000);-]{+delay(3000);+}               // wait for a second
}

$ git commit -a -m 'Change delay to 3 seconds' (5)
[slow-blink 5ca509d] Change delay to 3 seconds
 1 file changed, 2 insertions(+), 2 deletions(-)

$ git push origin slow-blink (6)
Username for 'https://github.com': tonychacon
Password for 'https://tonychacon@github.com':
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 340 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To https://github.com/tonychacon/blink
 * [new branch]      slow-blink -> slow-blink
  1. プロジェクトのフォークをローカルにクローンする。

  2. 分かりやすいトピックブランチを作成する。

  3. コードに変更を加える。

  4. 変更が良いことを確認する。

  5. トピックブランチに変更をコミットする。

  6. 新しいトピックブランチをGitHubフォークにプッシュし直す。

GitHubのフォークに戻ると、GitHubが新しいトピックブランチをプッシュしたことを検知し、変更を確認して元のプロジェクトへのプルリクエストを開くための大きな緑色のボタンが表示されます。

代わりに、https://github.com/<user>/<project>/branchesの「Branches」ページに移動して、ブランチを見つけ、そこから新しいプルリクエストを開くこともできます。

Pull Request button
図 90. プルリクエストボタン

その緑色のボタンをクリックすると、プルリクエストにタイトルと説明を付けるよう求める画面が表示されます。優れた説明は、元のプロジェクトのオーナーが何を行おうとしているのか、提案された変更が正しいか、変更を受け入れることで元のプロジェクトが改善されるかどうかを判断するのに役立つため、これにいくらかの努力を費やす価値はほとんど常にあります。

また、トピックブランチのコミットのリストがmasterブランチよりも「進んでいる」(この場合は1つだけ)こと、およびこのブランチがプロジェクトオーナーによってマージされた場合に適用されるすべての変更の統一差分も表示されます。

Pull Request creation page
図 91. プルリクエスト作成ページ

この画面で「プルリクエストを作成」ボタンを押すと、フォークしたプロジェクトのオーナーに、誰かが変更を提案しているという通知が届き、このすべての情報が記載されたページへのリンクが提供されます。

プルリクエストは、このように貢献者が完全な変更を準備している場合、公開プロジェクトで一般的に使用されますが、開発サイクルの最初に内部プロジェクトでよく使用されることもあります。プルリクエストが作成された後でもトピックブランチにプッシュし続けることができるため、プロセスの最後に開かれるのではなく、チームとして文脈内で作業を繰り返す方法として早く開かれることがよくあります。

プルリクエストのイテレーション

この時点で、プロジェクトオーナーは提案された変更を確認し、マージするか、拒否するか、コメントすることができます。彼がそのアイデアを気に入ったが、ライトがオフになっている時間をオンになっている時間よりも少し長くしたいとしましょう。

分散Gitで提示されているワークフローでは、この会話は電子メールで行われるかもしれませんが、GitHubではオンラインで行われます。プロジェクトオーナーは統一差分をレビューし、任意の行をクリックしてコメントを残すことができます。

Comment on a specific line of code in a Pull Request
図 92. プルリクエストの特定のコード行にコメントする

メンテナがこのコメントをすると、プルリクエストを開いた人(そして、実際にはリポジトリを監視している他の誰でも)に通知が届きます。これについては後でカスタマイズしますが、彼が電子メール通知をオンにしていた場合、トニーは次のような電子メールを受け取るでしょう。

Comments sent as email notifications
図 93. 電子メール通知として送信されたコメント

誰でもプルリクエストに一般的なコメントを残すこともできます。プルリクエストのディスカッションページでは、プロジェクトオーナーがコードの行にコメントし、その後ディスカッションセクションに一般的なコメントを残す例を見ることができます。コードコメントも会話に取り込まれていることがわかります。

Pull Request discussion page
図 94. プルリクエストのディスカッションページ

これで、貢献者は自分の変更が承認されるために何をする必要があるかを確認できます。幸いなことに、これは非常に簡単です。電子メールでは、シリーズを再ロールしてメーリングリストに再送信する必要があるかもしれませんが、GitHubでは、トピックブランチに再度コミットしてプッシュするだけで、プルリクエストが自動的に更新されます。プルリクエストの最終では、古いコードコメントが更新されたプルリクエストで折りたたまれていることも確認できます。これは、それが変更された行に対して行われたためです。

既存のプルリクエストにコミットを追加しても通知はトリガーされないため、トニーは修正をプッシュした後、プロジェクトオーナーに要求された変更を行ったことを知らせるためにコメントを残すことにしました。

Pull Request final
図 95. プルリクエストの最終

興味深いことの1つは、このプルリクエストの「Files Changed」タブをクリックすると、「統一された」差分、つまり、このトピックブランチがマージされた場合、メインブランチに導入される合計の集計差分が表示されることです。git diffの観点から言えば、基本的にこのプルリクエストが基づいているブランチに対してgit diff master...が自動的に表示されます。このタイプの差分の詳細については、導入されるものの決定を参照してください。

もう1つ注目すべき点は、GitHubがプルリクエストがクリーンにマージされるかどうかをチェックし、サーバー上でマージを実行するためのボタンを提供することです。このボタンは、リポジトリへの書き込みアクセスがあり、簡単なマージが可能な場合にのみ表示されます。これをクリックすると、GitHubは「非fast-forward」マージを実行します。つまり、マージがfast-forwardであったとしても、マージコミットが作成されます。

必要であれば、ブランチをプルダウンしてローカルでマージすることもできます。このブランチをmasterブランチにマージしてGitHubにプッシュすると、プルリクエストは自動的に閉じられます。

これが、ほとんどのGitHubプロジェクトが使用する基本的なワークフローです。トピックブランチが作成され、それに対してプルリクエストがオープンされ、議論が続き、場合によってはブランチでさらに作業が行われ、最終的にリクエストは閉じられるかマージされます。

フォークだけではない

同じリポジトリ内の2つのブランチ間でプルリクエストを開くこともできることに注意することが重要です。誰かと機能に取り組んでいて、両方がプロジェクトへの書き込みアクセスを持っている場合、トピックブランチをリポジトリにプッシュし、同じプロジェクトのmasterブランチに対してそれに対するプルリクエストを開いて、コードレビューと議論のプロセスを開始できます。フォークは必要ありません。

高度なプルリクエスト

GitHubでプロジェクトに貢献するための基本を説明したので、プルリクエストをより効果的に使用するためのいくつかの興味深いヒントとトリックについて説明します。

パッチとしてのプルリクエスト

多くのプロジェクトが、プルリクエストを、ほとんどのメーリングリストベースのプロジェクトがパッチシリーズの貢献を考えるように、順序良くクリーンに適用されるべき完璧なパッチのキューとして考えていないことを理解することが重要です。ほとんどのGitHubプロジェクトは、プルリクエストのブランチを、提案された変更に関する反復的な会話と見なし、マージによって適用される統一された差分で終わると考えています。

これは重要な区別です。なぜなら、一般的に、変更はコードが完璧であると考える前に提案されるからです。これは、メーリングリストベースのパッチシリーズの貢献でははるかにまれです。これにより、メンテナとの早期の会話が可能になり、適切な解決策に到達することがよりコミュニティの努力となります。プルリクエストでコードが提案され、メンテナまたはコミュニティが変更を提案した場合、パッチシリーズは通常再ロールされず、代わりに差分が新しいコミットとしてブランチにプッシュされ、以前の作業のコンテキストを維持しながら会話が進みます。

たとえば、プルリクエストの最終に再度戻って見てみると、貢献者は自分のコミットをリベースして別のプルリクエストを送信しなかったことがわかります。代わりに、新しいコミットを追加し、それらを既存のブランチにプッシュしました。この方法で、将来このプルリクエストに戻って見た場合、意思決定がなぜ行われたかというすべてのコンテキストを簡単に見つけることができます。サイトの「Merge」ボタンを意図的にクリックすると、プルリクエストを参照するマージコミットが作成され、必要に応じて元の会話に戻って調査することが容易になります。

アップストリームに追いつく

プルリクエストが古くなったり、クリーンにマージされなかったりした場合は、メンテナが簡単にマージできるように修正する必要があります。GitHubはこれをテストし、すべてのプルリクエストの下部でマージが簡単かどうかを知らせます。

Pull Request does not merge cleanly
図 96. プルリクエストがクリーンにマージされない

プルリクエストがクリーンにマージされないのようなものを見た場合は、ブランチを修正して緑色になり、メンテナが余分な作業をする必要がないようにする必要があります。

これを行うには、主に2つのオプションがあります。ターゲットブランチ(通常はフォークしたリポジトリのmasterブランチ)の上にブランチをリベースするか、ターゲットブランチをブランチにマージするかのどちらかです。

GitHubのほとんどの開発者は、前のセクションで説明したのと同じ理由で、後者を選択します。重要なのは履歴と最終的なマージなので、リベースは少しきれいな履歴以外にはほとんど得られず、その見返りにはるかに困難でエラーが発生しやすいです。

プルリクエストをマージ可能にするためにターゲットブランチをマージしたい場合は、元のリポジトリを新しいリモートとして追加し、そこからフェッチし、そのリポジトリのメインブランチをトピックブランチにマージし、問題を修正し、最後にプルリクエストを開いたのと同じブランチにプッシュし直します。

たとえば、以前使用していた「tonychacon」の例で、元の作者がプルリクエストで競合を引き起こす変更を行ったとしましょう。これらの手順を見てみましょう。

$ git remote add upstream https://github.com/schacon/blink (1)

$ git fetch upstream (2)
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
From https://github.com/schacon/blink
 * [new branch]      master     -> upstream/master

$ git merge upstream/master (3)
Auto-merging blink.ino
CONFLICT (content): Merge conflict in blink.ino
Automatic merge failed; fix conflicts and then commit the result.

$ vim blink.ino (4)
$ git add blink.ino
$ git commit
[slow-blink 3c8d735] Merge remote-tracking branch 'upstream/master' \
    into slower-blink

$ git push origin slow-blink (5)
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 682 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To https://github.com/tonychacon/blink
   ef4725c..3c8d735  slower-blink -> slow-blink
  1. 元のリポジトリをupstreamという名前のリモートとして追加する。

  2. そのリモートから最新の作業をフェッチする。

  3. そのリポジトリのメインブランチをトピックブランチにマージする。

  4. 発生した競合を修正する。

  5. 同じトピックブランチにプッシュし直す。

これを実行すると、プルリクエストは自動的に更新され、クリーンにマージされるかどうかが再チェックされます。

Pull Request now merges cleanly
図 97. プルリクエストがクリーンにマージされる

Gitの素晴らしい点の1つは、これを継続的に行えることです。非常に長く続くプロジェクトがある場合、ターゲットブランチから繰り返しマージすることができ、最後にマージしてから発生した競合のみに対処すればよいため、プロセスを非常に管理しやすくできます。

ブランチをリベースしてクリーンアップすることを強く希望する場合は、もちろんそうすることもできますが、プルリクエストがすでに開かれているブランチに強制プッシュすることは強く推奨されません。他の人がそれをプルしてさらに作業を行っている場合、リベースの危険性で概説されているすべての問題が発生します。代わりに、リベースされたブランチをGitHubの新しいブランチにプッシュし、古いものを参照する新しいプルリクエストを開き、元のものを閉じます。

参照

次の質問は「古いプルリクエストをどう参照するのか?」かもしれません。GitHubで書き込めるほとんどどこでも、他のものを参照する方法はたくさんあります。

まず、別のプルリクエストやイシューを相互参照する方法から始めましょう。すべてのプルリクエストとイシューには番号が割り当てられており、それらはプロジェクト内で一意です。たとえば、プルリクエスト #3 とイシュー #3 を同時に持つことはできません。他のどのプルリクエストやイシューからでも参照したい場合は、コメントや説明に単に#と入力するだけです。イシューやプルリクエストが他の場所に存在する場合は、より具体的にすることもできます。現在のリポジトリのフォーク内のイシューやプルリクエストを参照する場合はusername#と書き、別のリポジトリのものを参照する場合はusername/repo#と書きます。

例を見てみましょう。前の例でブランチをリベースし、それに対して新しいプルリクエストを作成し、新しいプルリクエストから古いプルリクエストを参照したいとします。また、リポジトリのフォーク内のイシューと、まったく異なるプロジェクト内のイシューも参照したいとします。説明はプルリクエスト内の相互参照のように記入できます。

Cross references in a Pull Request
図 98. プルリクエスト内の相互参照

このプルリクエストを送信すると、プルリクエスト内でレンダリングされた相互参照のようにすべてがレンダリングされます。

Cross references rendered in a Pull Request
図 99. プルリクエスト内でレンダリングされた相互参照

そこに入力した完全なGitHub URLが、必要な情報のみに短縮されていることに注目してください。

トニーが戻って元のプルリクエストを閉じると、新しいプルリクエストでそれを言及することで、GitHubがプルリクエストのタイムラインに自動的にトラックバックイベントを作成したことがわかります。これは、このプルリクエストを訪れて閉じられていることを確認した人は誰でも、それが置き換えられたプルリクエストに簡単にリンクバックできることを意味します。リンクはクローズされたプルリクエストのタイムラインでの新しいプルリクエストへのリンクのようになります。

Link back to the new Pull Request in the closed Pull Request timeline
図 100. クローズされたプルリクエストのタイムラインでの新しいプルリクエストへのリンク

イシュー番号に加えて、SHA-1で特定のコミットを参照することもできます。40文字の完全なSHA-1を指定する必要がありますが、GitHubがコメントでそれを見つけると、コミットに直接リンクします。ここでも、イシューの場合と同じ方法で、フォークまたは他のリポジトリのコミットを参照できます。

GitHub Flavored Markdown

他のイシューへのリンクは、GitHubのほとんどすべてのテキストボックスでできる興味深いことの始まりにすぎません。イシューやプルリクエストの説明、コメント、コードコメントなどで、「GitHub Flavored Markdown」と呼ばれるものを使用できます。Markdownは、プレーンテキストで書くように書きますが、豊かにレンダリングされます。

コメントやテキストがMarkdownを使用してどのように書かれ、その後レンダリングされるかの例については、書かれた状態とレンダリングされた状態のGitHub Flavored Markdownの例を参照してください。

An example of GitHub Flavored Markdown as written and as rendered
図 101. 書かれた状態とレンダリングされた状態のGitHub Flavored Markdownの例

GitHub版のMarkdownには、基本的なMarkdown構文を超えてできることが追加されています。これらはすべて、役立つプルリクエストやイシューのコメントや説明を作成する際に非常に役立ちます。

タスクリスト

最初の本当に便利なGitHub固有のMarkdown機能、特にプルリクエストで使用されるのはタスクリストです。タスクリストは、実行したいことのチェックボックスのリストです。これらをイシューまたはプルリクエストに入れることは、通常、項目が完了と見なされる前に実行したいことを示します。

次のようにタスクリストを作成できます。

- [X] Write the code
- [ ] Write all the tests
- [ ] Document the code

これをプルリクエストまたはイシューの説明に含めると、Markdownコメントでレンダリングされたタスクリストのようにレンダリングされます。

Task lists rendered in a Markdown comment
図 102. Markdownコメントでレンダリングされたタスクリスト

これは、プルリクエストで、プルリクエストをマージする準備が整う前にブランチで完了させたいことをすべて示すためによく使用されます。本当にクールな点は、チェックボックスをクリックするだけでコメントを更新できることです。タスクをチェックオフするためにMarkdownを直接編集する必要はありません。

さらに、GitHubはイシューとプルリクエストのタスクリストを検索し、それらを一覧表示するページにメタデータとして表示します。たとえば、タスクを含むプルリクエストがあり、すべてのプルリクエストの概要ページを見ると、それがどこまで完了しているかを確認できます。これは、人々がプルリクエストをサブタスクに分解し、他の人々がブランチの進捗を追跡するのに役立ちます。これの例はプルリクエストリストのタスクリスト概要で見ることができます。

Task list summary in the Pull Request list
図 103. プルリクエストリストのタスクリスト概要

これらは、プルリクエストを早期に開き、機能の実装を通じて進捗を追跡するために使用する場合に非常に役立ちます。

コードスニペット

コメントにコードスニペットを追加することもできます。これは、実際にブランチにコミットとして実装する前に、試すことができるものを提示したい場合に特に便利です。これは、機能しないもののコード例や、このプルリクエストが実装できるものを追加するためにもよく使用されます。

コードスニペットを追加するには、バックティックで「囲む」必要があります。

```java
for(int i=0 ; i < 5 ; i++)
{
   System.out.println("i is : " + i);
}
```

上記のように「java」で言語名を追加すると、GitHubはスニペットのシンタックスハイライトも試みます。上記の例の場合、最終的にはレンダリングされたフェンスで囲まれたコード例のようにレンダリングされます。

Rendered fenced code example
図 104. レンダリングされたフェンスで囲まれたコード例

引用

長いコメントの一部に返信する場合、>文字を行の前に付けて、他のコメントから選択的に引用できます。実際、これは非常に一般的で非常に便利なので、ショートカットキーがあります。直接返信したいコメントのテキストをハイライトしてrキーを押すと、そのテキストがコメントボックスに引用されます。

引用は次のようなものです

> Whether 'tis Nobler in the mind to suffer
> The Slings and Arrows of outrageous Fortune,

How big are these slings and in particular, these arrows?

レンダリングされると、コメントはレンダリングされた引用例のようになります。

Rendered quoting example
図 105. レンダリングされた引用例

絵文字

最後に、コメントに絵文字を使用することもできます。これは、多くのGitHubのイシューやプルリクエストのコメントで非常に広範に使用されています。GitHubには絵文字ヘルパーもあります。コメントを入力していて、:文字で始めると、オートコンプリーターが探しているものを見つけるのに役立ちます。

Emoji autocompleter in action
図 106. 動作中の絵文字オートコンプリーター

絵文字は、コメントのどこでも::の形式を取ります。たとえば、次のように書くことができます

I :eyes: that :bug: and I :cold_sweat:.

:trophy: for :microscope: it.

:+1: and :sparkles: on this :ship:, it's :fire::poop:!

:clap::tada::panda_face:

レンダリングされると、大量の絵文字コメントのようになります。

Heavy emoji commenting
図 107. 大量の絵文字コメント

これは信じられないほど便利だというわけではありませんが、感情を伝えるのが難しい媒体に、楽しさと感情の要素を加えます。

最近では、絵文字文字を利用するWebサービスが実際にはかなり多くあります。言いたいことを表現する絵文字を見つけるのに役立つ優れたチートシートは、次の場所にあります。

画像

これは厳密にはGitHub Flavored Markdownではありませんが、非常に便利です。コメントにMarkdown画像リンクを追加するだけでなく(URLを見つけて埋め込むのは難しい場合があります)、GitHubでは画像をテキストエリアにドラッグアンドドロップして埋め込むことができます。

Drag and drop images to upload them and auto-embed them
図 108. 画像をドラッグアンドドロップしてアップロードし、自動埋め込みする

画像をドラッグアンドドロップしてアップロードし、自動埋め込みするを見ると、テキストエリアの上に「Parsed as Markdown」という小さなヒントが表示されています。それをクリックすると、GitHubでMarkdownを使ってできるすべてのことの完全なチートシートが表示されます。

GitHub公開リポジトリを最新の状態に保つ

GitHubリポジトリをフォークすると、あなたのリポジトリ(あなたの「フォーク」)はオリジナルとは独立して存在します。特に、オリジナルリポジトリに新しいコミットがある場合、GitHubは次のようなメッセージで通知します。

This branch is 5 commits behind progit:master.

ただし、あなたのGitHubリポジトリはGitHubによって自動的に更新されることはありません。これはあなた自身が行う必要があります。幸いなことに、これは非常に簡単です。

これを行う1つの可能性は、設定を必要としません。たとえば、https://github.com/progit/progit2.gitからフォークした場合、次のようにmasterブランチを最新の状態に保つことができます。

$ git checkout master (1)
$ git pull https://github.com/progit/progit2.git (2)
$ git push origin master (3)
  1. 別のブランチにいた場合は、masterに戻る。

  2. https://github.com/progit/progit2.gitから変更をフェッチし、それらをmasterにマージする。

  3. masterブランチをoriginにプッシュする。

これは機能しますが、毎回フェッチURLを明示的に指定するのは少し面倒です。いくつかの設定でこの作業を自動化できます。

$ git remote add progit https://github.com/progit/progit2.git (1)
$ git fetch progit (2)
$ git branch --set-upstream-to=progit/master master (3)
$ git config --local remote.pushDefault origin (4)
  1. ソースリポジトリを追加し、名前を付けます。ここでは、progitと呼ぶことにしました。

  2. progitのブランチ、特にmasterへの参照を取得します。

  3. masterブランチがprogitリモートからフェッチするように設定します。

  4. デフォルトのプッシュリポジトリをoriginに定義します。

これが完了すると、ワークフローははるかに単純になります。

$ git checkout master (1)
$ git pull (2)
$ git push (3)
  1. 別のブランチにいた場合は、masterに戻る。

  2. progitから変更をフェッチし、変更をmasterにマージする。

  3. masterブランチをoriginにプッシュする。

このアプローチは便利ですが、欠点がないわけではありません。Gitは黙ってこの作業を行ってくれますが、masterにコミットし、progitからプルし、その後originにプッシュした場合でも警告しません。これらの操作はすべてこの設定で有効です。したがって、masterブランチは実質的にアップストリームリポジトリに属するため、直接コミットしないように注意する必要があります。

scroll-to-top