Git
チャプター ▾ 第2版

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

プロジェクトへの貢献

アカウントが設定できたので、既存のプロジェクトへの貢献に役立つ可能性のある詳細について説明します。

プロジェクトのフォーク

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

注意

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

このようにして、プロジェクトは、プッシュアクセス権を与えるためにユーザーを共同作業者として追加することを心配する必要がありません。人々はプロジェクトをフォークし、それにプッシュし、次のプルリクエストと呼ばれるものを介して変更を元のリポジトリに貢献することができます。これにより、コードレビュー付きのディスカッションスレッドが開かれ、オーナーと貢献者はオーナーがそれに満足するまで変更について話し合うことができ、その時点でオーナーはそれをマージできます。

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

The “Fork” button
図88. 「フォーク」ボタン

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

GitHubフロー

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

一般的にどのように機能するかを次に示します。

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

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

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

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

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

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

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

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

これは、統合マネージャーワークフローでカバーされているワークフローと基本的に同じですが、変更の連絡やレビューにメールを使用する代わりに、チームはGitHubのWebベースのツールを使用します。

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

ヒント

ほとんどの操作で、GitHubのウェブインターフェースの代わりに公式の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つだけ)と、プロジェクトの所有者によってこのブランチがマージされた場合に加えられるすべての変更の統一diffも表示されます。

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

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

注意

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

プルリクエストの反復

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

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

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」タブをクリックすると、「統一」diffが表示されることです。つまり、このトピックブランチがマージされた場合にメインブランチに導入される合計の集計差です。git diff用語では、基本的には、このプルリクエストのベースとなっているブランチに対してgit diff master…​<branch>を自動的に表示します。このタイプのdiffの詳細については、導入されたものの特定を参照してください。

もう1つ気づくことは、GitHubがプルリクエストがクリーンにマージされるかどうかを確認し、サーバーでマージするためのボタンを提供することです。このボタンは、リポジトリへの書き込みアクセス権があり、簡単なマージが可能である場合にのみ表示されます。それをクリックすると、GitHubは「非早送り」マージを実行します。つまり、マージが早送り可能な場合でも、マージコミットを作成します。

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

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

注意
フォークだけではない

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

高度なプルリクエスト

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

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

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

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

たとえば、戻ってプルリクエストの最終をもう一度見ると、コントリビューターがコミットをリベースして別のプルリクエストを送信していないことに気付くでしょう。代わりに、彼らは新しいコミットを追加し、既存のブランチにプッシュしました。このようにして、将来このプルリクエストに戻って調べると、決定が下された理由のすべてのコンテキストを簡単に見つけることができます。サイトで「マージ」ボタンを押すと、プルリクエストを参照するマージコミットが意図的に作成されるため、必要に応じて元の会話を簡単に調べて調べることができます。

アップストリームとの同期

プルリクエストが古くなったり、それ以外の場合はクリーンにマージされなくなったりした場合は、メンテナが簡単にマージできるように修正する必要があります。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. そのリポジトリの main ブランチをトピックブランチにマージします。

  4. 発生したコンフリクトを修正します。

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

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

Pull Request now merges cleanly
図97. プルリクエストはクリーンにマージできる状態になりました

Gitの素晴らしい点の1つは、これを継続的に実行できることです。非常に長期にわたるプロジェクトの場合、ターゲットブランチから何度もマージを繰り返すことができ、前回マージしたときから発生したコンフリクトのみに対処すれば済むため、プロセスが非常に管理しやすくなります。

ブランチをクリーンアップするためにリベースしたい場合は、そうしても構いませんが、プルリクエストがすでに開かれているブランチに force push しないことを強くお勧めします。他の人がそれをプルダウンしてさらに作業を進めている場合、リベースの危険性で概説されているすべての問題に直面することになります。代わりに、リベースしたブランチをGitHubの新しいブランチにプッシュし、古いプルリクエストを参照する新しいプルリクエストを開き、元のものを閉じます。

参照

次の疑問は、「古いプルリクエストをどのように参照すればよいのか?」ということかもしれません。実は、GitHubで記述できるほぼすべての場所で、他のものを参照する方法はたくさんあります。

まず、別のプルリクエストやIssueを相互参照する方法から始めましょう。すべてのプルリクエストとIssueには番号が割り当てられており、プロジェクト内で一意です。例えば、プルリクエスト#3Issue#3を両方持つことはできません。他のプルリクエストやIssueから任意のプルリクエストまたはIssueを参照したい場合は、コメントまたは説明に #<num> を記述するだけです。Issueまたはプルリクエストが別の場所にある場合は、より具体的にすることもできます。自分がいるリポジトリのフォークのIssueまたはプルリクエストを参照している場合は username#<num> を記述し、別のリポジトリのものを参照する場合は username/repo#<num> を記述します。

例を見てみましょう。前の例でブランチをリベースし、それに対する新しいプルリクエストを作成し、新しいプルリクエストから古いプルリクエストを参照したいとします。また、リポジトリのフォークにあるIssueと、完全に別のプロジェクトにあるIssueも参照したいとします。プルリクエストの相互参照のように、説明を記入することができます。

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. 閉じたプルリクエストのタイムラインでの新しいプルリクエストへのリンクバック

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

GitHub Flavored Markdown

他のIssueへのリンクは、GitHubのほぼすべてのテキストボックスでできる興味深いことの始まりにすぎません。Issueとプルリクエストの説明、コメント、コードコメントなどでは、「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構文を超えてできることがさらに追加されています。これらはすべて、有用なプルリクエストまたはIssueのコメントや説明を作成するときに非常に役立ちます。

タスクリスト

特にプルリクエストで使用する場合に非常に役立つ最初のGitHub固有のMarkdown機能は、タスクリストです。タスクリストは、実行したいことのチェックボックスのリストです。通常、Issueまたはプルリクエストに入れることは、アイテムが完了したと見なす前に実行したいことを示すものです。

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

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

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

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

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

さらに、GitHubはIssueとプルリクエストでタスクリストを探し、それらをリストするページにメタデータとして表示します。例えば、タスクを含むプルリクエストがあり、すべてのプルリクエストの概要ページを見ると、どれだけ完了しているかを確認できます。これにより、人々はプルリクエストをサブタスクに分割でき、他の人々はブランチの進行状況を追跡できます。プルリクエストリストでのタスクリストの概要でこれの例を見ることができます。

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 Issueとプルリクエストで見られるコメントで実際に非常に広く使用されています。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. 絵文字を多用したコメント

これが非常に役立つとは限りませんが、感情を伝えるのが難しいメディアに、楽しさと感情の要素を追加します。

注意

最近では、絵文字文字を使用するWebサービスが非常にたくさんあります。伝えたいことを表現する絵文字を見つけるのに役立つ素晴らしいチートシートは、次の場所にあります。

画像

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

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

画像をドラッグアンドドロップしてアップロードし、自動的に埋め込むを見ると、テキストエリアの上に「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