プルリクエストのフロー


自分の独立したブランチで機能に取り組んでいて、それが完成しました。プロジェクトは共有されています。他の人もコミットしているため、mainに直接プッシュして運を天に任せることはしません。変更をレビューしてもらい、必要に応じて議論を交わし、チーム全体が認識できるようにマージしたいのです。マシン上のブランチからmainにコードが統合されるまでの全体的なプロセスがプルリクエストのフロー(pull request flow)です。これはGitHubのほぼすべてのチームが変更を統合する方法です。このGit側の処理は、前の章のコマンドだけを使います。ブランチ、コミット、そしてプッシュです:
$ git switch -c add-five-day-forecast
Switched to a new branch 'add-five-day-forecast'
$ git add src/forecast.js
$ git commit -m "Add five-day forecast panel"
$ git push -u origin add-five-day-forecast
Branch 'add-five-day-forecast' set up to track 'origin/add-five-day-forecast'.このプッシュはあなたのブランチをGitHubに送信します。まだ何もマージされていませんし、レビューのための提案も出ていません。次のステップ(プルリクエストを開くこと)はGitHubのウェブサイトで行われます。
プルリクエストを開くと何が起こるか
GitHubでは、上記のようなプッシュの後、通常、新しいブランチをmainと比較するオプションを提供するバナーが表示されます。それをクリックして、変更内容とその理由の短い説明を書いて、作成されたページを開きます。そのページが**プルリクエスト**です。しばしばPRと略されます:1つのブランチを別のブランチにマージする要求であり、その周辺で実施される継続的な会話が添付されています。
プルリクエストはマージを提案し、承認を待ちます。誰か、あるいはあなた自身またはチームメイトが変更内容を読み、コメントを残し、それが正しく見えるまでマージしません。それまでの間、あなたのブランチとmainは、ページを開く前とまったく同じままです。
フォークとブランチ
ブランチからのプルリクエストを開くことは、リポジトリへの書き込みアクセス権がある場合に機能します。これは、自分のチームのプロジェクトでは通常のケースです。書き込みアクセス権がないプロジェクトに貢献するには、1つの追加ステップが必要です:フォーク(自分の GitHub アカウント下でのリポジトリの独自コピー)。
フォーク内でブランチ分けとコミットを行い、所有するプロジェクト内で行うのとまったく同じようにプッシュしてから、フォークのブランチから元のリポジトリへのプルリクエストを開きます。GitHubは2つのリポジトリ間で1つのリポジトリ内の2つのブランチを比較するのと同じ方法で比較するため、レビューとマージのフロー はどちらの方法でもまったく同じに見えます。
プルリクエストをレビュー完了まで進める
PRが開かれると、diffについての実行中の会話になります。レビュアーが変更を読み、特定の行にコメントを残し、承認または変更リクエストを行います。変更が要求されたら、同じブランチへのコミットとプッシュを続けます:すべてのプッシュは同じPRを更新し、新しいものは作成しません。レビュアーが承認し、必要なチェックがすべてパスしたら、PRはマージの準備ができています。
プルリクエストがマージできない理由
PR上のマージボタンが グレーアウトされることがあり、GitHubはその代わりにメッセージを表示します:「このブランチは解決する必要がある競合があります」または「このブランチはベースブランチより古い状態です」。両方のメッセージは通常の修正可能な状態を説明しています:ブランチを作成した後、mainが前に進みました。通常、それは誰か他のPRがその間にマージされたためです。あなたのブランチはGitHubが2つをクリーンに組み合わせることができる前に追いつく必要があります。これはプロジェクトが複数の貢献者を持つあらゆるプロジェクトで起こるので、それを恐れるのではなく予想してください。
ローカルで2つのブランチをまとめるのと同じ方法で修正してください:
$ git switch add-five-day-forecast
$ git fetch origin
From github.com:mara-chen/weather-app
9f8e7d6..b7c9e21 main -> origin/main
$ git merge origin/main重複がない場合、マージはそれ自体で完了し、プッシュして、PRは更新され、ボタンのロックが解除されます。同じ行が両側で変更された場合、Gitは競合をファイルにマークして、マージと競合で説明されているのと同じように正確に解決します。ファイルを開き、競合マーカーを希望の結果に編集してから、git addとgit commitでマージを終了し、再度プッシュします。
スタックされたプルリクエストは追いつくか、その競合を解決する必要があります。
mainの後ろにあるか、競合があることを意味します。何も破損していません。ブランチに切り替えて、フェッチして、mainをマージします。他の場所と同じように競合を解決してから、再度プッシュします。 プルリクエストの内部での仕組み
プルリクエストはGitオブジェクトではなく、そしてそれを作成する git コマンドはありません。GitとGitHubは同じものではありません:Gitはコミット、ブランチ、およびその他の refs(refはコミットを指す名前)についてのみ知っています。GitHubはPRページ全体、コメント、およびマージボタンを構築します。比較する2つのrefsの上に:あなたのブランチ(head)と、あなたがマージしているブランチ(base、通常はmain)。その比較が理由で、GitHubのウェブサイト(またはGitHub独自のコマンドラインツールやAPI経由)でプルリクエストを開き、平文gitコマンドでは開きません。

