マージ前にベースブランチの変更の取り込みを必須化することでコード品質を向上させる

2023/12/12に公開

ブランチ戦略

手ぶら登園では、GitHub を使って開発を行っています。
ブランチ戦略は Git-flow に近く、以下の流れで進めることが多いです。

  1. develop ブランチから feature ブランチを切る
  2. 開発する
  3. Pull Request を作成する
  4. レビューする
  5. develop ブランチにマージする

複数の feature ブランチで開発している時に、気をつけたいことの一つがベースブランチに加わった変更を自分の作業用ブランチに取り込むことです。
例えば、develop から featureA、featureB という 2 つのブランチを切って開発していて、featureA、featureB の順で develop にマージする場合を考えます。この時、featureB をマージする前に develop に加わった featureA の内容を featureB に取り込んでおきたいです。

ベースブランチに加わった変更を自分の作業用ブランチに取り込みたい理由

ベースブランチに加わった変更を自分の作業用ブランチに取り込みたい理由は 2 つあります。

  • コンフリクトを解消するため
  • 意図せぬデグレを防ぐため

前者はコンフリクトしているとそもそもマージできないので明らかです。
後者の「意図せぬデグレを防ぐため」がどういうことかですが、コンフリクトしていないからといって、マージ後に意図したように動作するとは限りません。featureA の内容を取り込まずにテストや動作確認をした featureB を develop にマージすると、featureA の変更の影響を受けて featureB の変更内容が意図しない挙動となる可能性があります。

そういうわけで、マージ前にベースブランチに加わった変更を自分の作業用ブランチに取り込みたいのですが、うっかり忘れてしまうことがあります。そこで GitHub の設定を探すと「マージ前にベースブランチの変更の取り込みを必須化する」設定があったので、試してみました。

マージ前にベースブランチの変更の取り込みを必須化する方法

repository の Settings → Branches → Branch protection rules から対象のブランチを選択して編集画面を開きます。「Require status checks to pass before merging」と「Require branches to be up to date before merging」にチェックを入れて、「Status checks that are required.」に必ずパスしたいステータスを入れます。
例えば、GitHub Actions で実行するジョブを選択した場合、そのジョブがこけているとマージできなくなります。(下記の画像では、test がそのジョブです。)

また、repository の Settings → General から「Always suggest updating pull request branches」を有効化しておきます。

上記の設定を行うと、ベースブランチの変更を取り込んでいない Pull Request でマージボタンが押せなくなります。
また、「Always suggest updating pull request branches」を有効化しているので、「update branch」ボタンが出現し、画面からブランチを更新できるようになります。

やってみてどうか

今回の設定のみで、意図せぬデグレを防げるわけではないですが、ブランチを更新することを意識しなくてもよくなった点は良かったです。ただ、「Status checks that are required.」で選択したジョブは特定条件では実行しないようにしており、そのジョブが実行されない場合にステータスチェックをパスできずにマージできなくなる問題が発生しました。その問題への対処法については、次の投稿で書こうと思います。

余談

GitHub では、対象のコミットを開き、view the diff を押すと取り込んだ変更内容を見ることができます。

BABYJOB テックブログ

Discussion