章 ▾ 第2版

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

プロジェクトへの貢献

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

プロジェクトのフォーク

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

注記

歴史的に、「フォーク」という用語は、オープンソースプロジェクトを別の方向へ進め、時に競合するプロジェクトを生み出し、コントリビューターを分裂させるという意味合いで、ある程度ネガティブな文脈で使われてきました。GitHubでは、「フォーク」は単にあなた自身の名前空間にある同じプロジェクトであり、よりオープンな方法で貢献するために、プロジェクトに変更を加えて公開することを可能にします。

このようにすることで、プロジェクトはユーザーをコラボレーターとして追加し、プッシュアクセスを与えることを心配する必要がなくなります。人々はプロジェクトをフォークし、そこにプッシュし、「プルリクエスト」と呼ばれるものを作成して、変更を元のリポジリトに貢献することができます。これはコードレビューを伴う議論スレッドを開き、プロジェクトオーナーとコントリビューターは、オーナーが変更に満足するまでコミュニケーションを取り、その後オーナーはそれをマージすることができます。

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

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

数秒後、あなたの新しいプロジェクトページに移動し、コードの書き込み可能なコピーが表示されます。

GitHubフロー

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

一般的な流れは次のとおりです

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

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

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

  4. このブランチをあなたのGitHubプロジェクトにプッシュします。

  5. GitHubでプルリクエストを開きます。

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

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

  8. 更新されたmasterをあなたのフォークに同期します。

これは基本的に、統合マネージャーワークフローで説明されている統合マネージャーワークフローですが、変更の連絡やレビューにメールを使用する代わりに、GitHubのウェブベースツールを使用します。

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

ヒント

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

プルリクエストの作成

Tonyは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. プルリクエスト作成ページ

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

注記

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

プルリクエストの反復

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

分散Gitで示されているワークフローではこの会話がメールで行われる可能性がありますが、GitHubではこれがオンラインで行われます。プロジェクトオーナーは統合差分を確認し、任意の行をクリックしてコメントを残すことができます。

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

メンテナーがこのコメントをすると、プルリクエストを開いた人(およびリポジトリを監視している他の誰もが)通知を受け取ります。これについては後でカスタマイズ方法を説明しますが、もしTonyがメール通知をオンにしていれば、次のようなメールを受け取ります。

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

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

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

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

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

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

興味深い点として、このプルリクエストの「Files Changed」タブをクリックすると、「統合」差分、つまりこのトピックブランチがマージされた場合にメインブランチに導入される総計の差分が表示されます。git diffの用語で言えば、このプルリクエストが基づいているブランチに対して、基本的にgit diff master…​<branch>が自動的に表示されます。この種の差分の詳細については、何が導入されるかを確認するを参照してください。

もう一つ気づくこととして、GitHubはプルリクエストがクリーンにマージできるかどうかをチェックし、サーバー上でマージを実行するためのボタンを提供します。このボタンは、リポジトリへの書き込みアクセス権があり、かつ簡単なマージが可能な場合にのみ表示されます。これをクリックすると、GitHubは「ノンファストフォワード」マージを実行します。これは、マージがファストフォワード可能であったとしても、マージコミットが作成されることを意味します。

よろしければ、ブランチをプルしてローカルでマージすることもできます。このブランチを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 を同時に持つことはできません。他のプルリクエストやイシューから参照したい場合は、コメントや説明の中に単に#<num>と記述するだけで済みます。イシューやプルリクエストが別の場所にある場合は、より具体的に指定することもできます。現在のリポジトリのフォーク内のイシューやプルリクエストを参照する場合はusername#<num>、別のリポジトリのものを参照する場合はusername/repo#<num>と記述します。

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

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

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

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

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

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

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

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

GitHubフレーバーのMarkdown

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

コメントやテキストがMarkdownを使ってどのように書かれ、そしてレンダリングされるかの例については、記述されたGitHubフレーバーのMarkdownとレンダリングされたものを参照してください。

An example of GitHub Flavored Markdown as written and as rendered
図101. 記述されたGitHubフレーバーの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. 動作中の絵文字オートコンプリート

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

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. 絵文字を多用したコメント

これが非常に役立つというわけではありませんが、感情を伝えるのが難しい媒体に、楽しさや感情の要素を追加することは確かです。

注記

最近では、絵文字を使用するウェブサービスが非常に多く存在します。言いたいことを表現する絵文字を見つけるのに役立つ素晴らしいチートシートは、次のURLで確認できます。

画像

これは厳密にはGitHubフレーバーの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によって自動的に更新されることはありません。これはあなたが自分で行う必要があります。幸いなことに、これは非常に簡単です。

これを行う一つの方法は設定を必要としません。例えば、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ブランチは実質的にアップストリームリポジトリに属するため、masterに直接コミットしないように注意が必要です。

scroll-to-top