プルリクエストを作成する

プルリクエストとは?

プルリクエストとは、Gitでブランチをマージする前に、他の開発者に変更内容を確認してもらうためのリクエストです。
GitHubやGitLabなどのプラットフォームでは、プルリクエストを作成することで、コードレビューを依頼したり、変更内容を共有したりすることができます。

プルリクエスト

GitHubでプルリクエストを作成すると次のような画面が作成されます。

Bump solid_cable from 3.0.8 to 3.0.10 by dependabot[bot] · Pull Request #7 · ihatov08/chat_gpt_clone_rails
Bumps solid_cable from 3.0.8 to 3.0.10. Release notes Sourced from solid_cable's releases. v3.0.10 What's Changed Update README.md by @​EpicureanHeron in rails/solid_cable#64 Prevent bro...
Bump solid_cable from 3.0.8 to 3.0.10 by dependabot[bot] · Pull Request #7 · ihatov08/chat_gpt_clone_rails favicon github.com
Bump solid_cable from 3.0.8 to 3.0.10 by dependabot[bot] · Pull Request #7 · ihatov08/chat_gpt_clone_rails

どのような変更を行ったか説明を書くことができて、File Changedのタブではどのような変更が行われたのかを確認することができます。
またFile Changedのタブでコード内にコメントを追加することができるので、
例えば「この部分はこうした方が良いのでは?」といったフィードバックを行うことができます。

そして、プルリクエストを作成した後に、他の開発者がそのプルリクエストを確認して、問題がなければマージすることができます。

エンジニアとして仕事をするうえで、必須のスキルとなるので、ぜひ覚えておきましょう。

プルリクエストを用いた開発の流れ

プルリクエストを用いた開発の流れは次のようになります。

プルリクエストの流れ

  1. ブランチを作成する: 新しい機能や修正を行うためのブランチを作成します。
  2. 変更を行う: 作成したブランチでコードの変更を行います。
  3. コミットする: 変更内容をコミットします。
  4. プルリクエストを作成する: 変更内容を他の開発者に確認してもらうために、プルリクエストを作成します。
  5. コードレビューを受ける: 他の開発者にプルリクエストをレビューしてもらい、フィードバックを受け取ります。
  6. 修正する: フィードバックを受けて、必要な修正を行います。
  7. マージする: プルリクエストが承認されたら、ブランチをmainブランチにマージします。
  8. ブランチを削除する: マージが完了したら、作業用のブランチを削除します。
  9. ローカルのリポジトリを更新する: mainブランチを最新の状態に更新します。

はじめはこの流れを理解するのが難しいかもしれませんが、実際に手を動かしてみることで徐々に慣れていくでしょう。

では、実際にプルリクエストを作成してみましょう。

ブランチを作成する

ではひとつづつ作業をしていきましょう。
今回はプルリクエストの流れを把握するのが目的なので、README.mdに文言を追加するだけの簡単な変更を行います。
まずは、プルリクエストを作成するためのブランチをローカルのGitリポジトリで作成します。
mainブランチから修正用のブランチを作成します。

git switchコマンドで-cオプションを使うと、ブランチを作成してそのブランチに切り替えることができます。

Terminal window
git switch -c mod_readme

プロンプトがmod_readmeブランチに切り替わったことを確認できたら、次のステップに進みます。

念のため、現在のブランチを確認しておきましょう。

Terminal window
git branch

* mod_readmeと表示されていれば、mod_readmeブランチに切り替わっています。

Terminal window
* mod_readme
main

ブランチの状態は次のようになります。

gitGraph
  commit
  branch mod_readme
  checkout mod_readme

変更を行う

README.mdファイルに変更を加えましょう。
テキストエディタでも構いませんが、今回はechoコマンドを使って、簡単に変更を加えます。

Terminal window
echo "プルリクエストのテストです。" >> README.md

変更を確認してみましょう。

Terminal window
git diff

変更内容が表示されるはずです。

diff --git a/README.md b/README.md
index c7f6076..a781134 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
# Git Practice
+プルリクエストのテストです。

変更をコミットする

変更をコミットします。

Terminal window
git add README.md
git commit -m "プルリクエストのテスト"

現在のブランチはmod_readmeブランチで、README.mdファイルに「プルリクエストのテスト」という変更が加えられた状態です。

    gitGraph
      commit id: "hello.txtを追加"
      commit id: "newfile.txtを追加"
      commit id: "あいさつを追加"
      commit id:"Add README.md"
       branch mod_readme
       commit id: "プルリクエストのテスト"

プルリクエストを作成する

次に、GitHub上でプルリクエストを作成します。
はじめにローカルリポジトリの変更をリモートリポジトリにプッシュします。
git pushコマンドを使って、mod_readmeブランチをリモートリポジトリにプッシュします。

Terminal window
git push origin mod_readme

なおmod_readmeというブランチ名の指定ではなく、HEADを指定しても同じ意味になります。

Terminal window
git push origin HEAD

HEADは現在のブランチの先頭を指す特別な名前です。
現在のブランチの変更をプッシュしたい場合は、ブランチ名を指定する必要がないHEADを使うことができます。

    gitGraph
      commit id: "hello.txtを追加"
      commit id: "newfile.txtを追加"
      commit id: "あいさつを追加"
      commit id:"Add README.md"
       branch mod_readme
       commit id: "HEAD"

ブランチをプッシュしたらGitHubのリポジトリにアクセスします。

Terminal window
gh browse

ブラウザが開き、GitHubのリポジトリが表示されます。
リポジトリのトップページでCompare & pull requestボタンが表示されるので、クリックします。

プルリクエストの作成

GitHubのプルリクエスト作成画面が表示されます。
ここで、プルリクエストのタイトルと説明を入力します。
今回は簡単な修正なので、簡易なタイトルと説明を入力していますが、
プルリクエストの内容がわかるように、具体的なタイトルと説明を入力することが重要です。

Open a pull request

また右のサイドバーではReviewersAssigneesLabelsなどを設定することができます。
これらは、プルリクエストのレビューを依頼する人や、
プルリクエストの担当者、ラベルなどを設定するためのものです。
必要に応じて設定しましょう。
プロジェクトごとに運用方法が異なるので、プロジェクトのルールに従って設定してください。

プルリクエストの設定

プルリクエストの内容を確認したら、Create pull requestボタンをクリックします。

Create a pull request

プルリクエストが作成されました。

レビュー

プルリクエストが作成されたら、他の開発者にレビューを依頼します。
Slackなどのチャットツールを使って、プルリクエストのURLを共有しましょう。
またReviewersにレビューを依頼する人を設定すると、依頼側が通知を受け取る設定をしていれば
通知が届くので、特に別途依頼をしなくてもよいケースもあります。
こちらもプロジェクトのルールに従って運用しましょう。

本来であれば、自分以外の開発者にレビューを依頼するのですが、
今回は他の開発者がいないので、自分でレビューを行います。

プルリクエストのページにアクセスして、Files changedタブをクリックします。

Files changed

マウスカーソルを変更行の左側に合わせると、+ボタンが表示されます。
このボタンをクリックすると、コメントを追加することができます。

レビュー依頼

コメント

レビューコメントを追加して、Add single commentボタンをクリックします。
Start a reviewボタンをクリックすると、レビューコメントをまとめて送信することができます。

コメントの送信

レビューコメントはスレッド形式になっているので、他の開発者がコメントに返信することもできます。

alt text

Start a reviewにした場合は、右上のReview changesボタンをクリックするとポップアップが開きます。

Review changes

CommentもしくはRequest changesを選択して、Submit reviewボタンをクリックします。
もしプルリクエストの変更に問題がない場合はApproveを選択します。

自分が作成したプルリクエストなので、ApproveRequest changesは選択不可になっていますが、
他の開発者がレビューを行う場合は選択可能です。

Submit Review

プルリクエストの修正

レビューを受けて、必要な修正を行います。
今回はレビューコメントの通り、プルリクエストを英語に直しましょう。

ローカルのリポジトリでREADME.mdファイルを修正します。
お好きなテキストエディタで開いて、プルリクエストPull Requestに変更するか、
次のコマンドを実行して修正します。

Terminal window
sed -i 's/プルリクエスト/Pull Request/g' README.md

変更を確認しましょう。

Terminal window
git diff

変更内容が表示されるはずです。

diff --git a/README.md b/README.md
index a781134..dd55c3e 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,2 @@
# Git Practice
-プルリクエストのテストです。
+Pull Requestのテストです。

変更をコミットします。

Terminal window
git add README.md
git commit -m "Fix pull request text"

現在のコミットは以下の状態です。

    gitGraph
      commit id: "hello.txtを追加"
      commit id: "newfile.txtを追加"
      commit id: "あいさつを追加"
      commit id:"Add README.md"
       branch mod_readme
       commit id: "プルリクエストのテスト"
       commit id: "Fix pull request text"

変更をリモートリポジトリにプッシュします。

Terminal window
git push origin HEAD

再度レビューをする

変更をリモートリポジトリにプッシュしたら、GitHubのリポジトリを開いて変更を確認しましょう。
また、他の開発者にレビューを依頼します。
ここではレビューが問題なかったと仮定します。

マージする

プルリクエストの変更が問題なく、Approveをもらったら、プルリクエストをマージします。
GitHubのプルリクエストの画面で、Merge pull requestボタンをクリックします。

Merge pull request

次に、Confirm mergeボタンをクリックします。

Confirm merge

これでプルリクエストがマージされたので、リモートリポジトリの状態は次のようになります。

    gitGraph
      commit id: "hello.txtを追加"
      commit id: "newfile.txtを追加"
      commit id: "あいさつを追加"
      commit id:"Add README.md"
       branch mod_readme
       commit id: "プルリクエストのテスト"
       commit id: "Fix pull request text"
      checkout main
      merge mod_readme

ブランチを削除する

プルリクエストをマージしたら、ブランチが不要の場合は削除します。
GitHubのプルリクエストの画面で、Delete branchボタンをクリックします。

Delete branch

ローカルリポジトリを更新する

リモートリポジトリはmod_readmeブランチがマージされている状態ですが、
ローカルリポジトリはまだmod_readmeブランチが存在し、
mainブランチにはマージされていません。

    gitGraph
      commit id: "hello.txtを追加"
      commit id: "newfile.txtを追加"
      commit id: "あいさつを追加"
      commit id:"Add README.md"
       branch mod_readme
       commit id: "プルリクエストのテスト"
       commit id: "Fix pull request text"

ローカルリポジトリのmainブランチの状態を最新に更新しましょう。
mainブランチに切り替えます。

Terminal window
git switch main

次に、リモートリポジトリの最新の状態を取得して、mainブランチを更新します。
pullとはリモートリポジトリの最新の状態を取得して、ローカルリポジトリに反映する操作です。
--rebaseオプションをつけることで、不要なコミット履歴(マージコミット)を作成せずに、ローカルの変更をリモートの最新の状態に適用します。

Terminal window
git pull origin main --rebase

これでローカルのmainブランチとリモートのmainブランチが同期されました。

    gitGraph
      commit id: "hello.txtを追加"
      commit id: "newfile.txtを追加"
      commit id: "あいさつを追加"
      commit id:"Add README.md"
       branch mod_readme
       commit id: "プルリクエストのテスト"
       commit id: "Fix pull request text"
      checkout main
      merge mod_readme

ローカルのmod_readmeブランチは不要であれば削除します。

Terminal window
git branch -d mod_readme

まとめ

プルリクエストの作成からマージまでの流れを学びました。
次の開発を進める場合は、同様の手順でプルリクエストを作成、レビュー、マージ、ローカルリポジトリの更新を行います。
何回も繰り返すことで、プルリクエストの流れに慣れていくでしょう。