Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Gerritのコードレビューを複数に分割して実施する

More than 1 year has passed since last update.

Gerritは1コミット=1コードレビューを前提とするコードレビューシステムであり、実際に運用していると、コードレビューが乱立することを避けたい思いから、大きな修正内容でも1コミットにまとめてしまいがちになる場合がある

しかし以下を踏まえると、大きな修正内容は分割する方が良いと考えられる

  • 1つのコードレビューに過度(数百行程度)の変更が含まれていると、レビュアーの負担が大きい
  • 意味ある最小単位でコミットを残せない

本記事では、Gerritのコードレビューを複数に分割して実施する方法と、その具体的手順を紹介する

概要

以下2つの方法を紹介する

  1. 1つのブランチに複数コミットを行い、同時にプッシュすることで「連鎖」として関連付ける
  2. 複数ブランチに個別でコミット・プッシュしたのち、共通の「Topic」を付与することで関連付ける

前提とする環境

  • Gerrit 3.0.0
  • SourceTree 3.2

想定する読者

GerritのWebインタフェースとSourceTreeを利用して、以下を実施する手順を知っている

  • 1コミット単体のコードレビュー提出
  • 1コミット単体のコードレビューでNGとなった場合の修正と再提出

1つのブランチに複数コミットを行い、同時にプッシュすることで「連鎖」として関連付ける

この方法は、修正内容を「依存関係のある複数のコミット」に分割できる場合に取れる手段である
つまり、修正内容がA・Bの2つに分けられるとした場合、BはAのコミットが適用されていることを前提とする修正であるような場合に適した方法となる

修正内容を「依存関係のない複数のコミット」に分割できる場合は、後述の方法が適している可能性がある

この方法を用いると、Gerritのコードレビュー画面上で、分割した修正内容が「連鎖」として表示される
レビュアーはこのリストを下から順に辿ることで、コミットを親から子の順で確認できる
連鎖_Web上での見え方.png

SourceTreeでの具体的手順

新規にコードレビューを開始する

ローカルリポジトリにてブランチ(features/modify_funcとする)を作り1、修正内容を複数に分割してコミットする
連鎖_ローカルでコミット.png

Gerritのブランチ一覧画面上でリモートブランチを作る
連鎖_Gerritでブランチ作成.png
連鎖_Gerritでブランチ作成後.png

フェッチしてリモートブランチの情報を取り込み、ローカルブランチに追跡させる
連鎖_ブランチ追跡.png

以下のように複数コミットが先行していると表示されることを確認する
連鎖_ブランチ追跡後.png

ブランチをコードレビュー用のブランチ(refs/for/features/modify_func)にプッシュする 2
これにより、先行しているコミットのコードレビューが開始される
連鎖_PUSH.png

Gerritのコードレビュー画面上で、同時にプッシュしたコミットが一覧で連鎖として表示されることを確認する
連鎖_Web上での見え方.png

コードレビューの指摘を受けて修正する

複数ある中の最後のコミットの指摘に対しては、直前のコミットを上書き(amendコミット)にて修正すれば良いが、それ以外の場合は対話形式でリベース(インタラクティブなリベース)を利用する必要がある

例えば、以下のように3つのうち2番目のコミットに指摘が入り、修正を行う場合の手順を紹介する
連鎖_レビューNG.png

この場合SourceTreeにて、修正したいコミットの直前のコミットを選択し、対話形式でリベース(インタラクティブなリベース)を実施する
連鎖_インタラクティブなリベース.png

出てきた画面にて、修正したいコミットにチェックを入れたうえでOKを押下する
これにより、チェックを入れたコミットが適用された直後にリベース作業が一時停止し、手作業でコミットを修正する時間が設けられる
連鎖_インタラクティブなリベース選択画面.png

HEADが修正したいコミットを指していることを確認する
連鎖_インタラクティブなリベースHEAD確認.png

この状態でコードを修正し、直前のコミットを上書き(amendコミット)する
連鎖_インタラクティブなリベースamend選択.png

この際、コミットメッセージも適宜修正することができる
ただし、提出済みのコードレビューと紐づけできるよう、最後の行のChange-Idは編集せず維持しておく必要がある
連鎖_インタラクティブなリベースamendコミット.png

コミットしたのち、リベースを続行する
連鎖_インタラクティブなリベースを続ける.png

以下のように、HEADが最新コミットになればローカルでの修正完了となる
(リベースを続行でコンフリクトが発生する場合は、手動でコンフリクトを解消してリベースを続行を繰り返す)
連鎖_インタラクティブなリベース完了.png

この状態でプッシュすることで、以下のように新たなパッチセットがGerritにアップロードされて、リモートにおいても修正完了となる
連鎖_レビュー指摘反映後.png

複数ブランチに個別でコミット・プッシュしたのち、共通の「Topic」を付与することで関連付ける

この方法は、修正内容を「依存関係のない複数のコミット」に分割できる場合に取れる手段である
つまり、修正内容がA・Bの2つに分けられるとした場合、双方のコミットが順番を問わず独立して適用できるような場合に適した方法となる

この方法を用いると、Gerritのコードレビュー画面上で、分割した修正内容が共通の「Topic」を持ったもの一覧として表示される
共通Topic_Web上での見え方.png

SourceTreeでの具体的手順

新規にコードレビューを開始する

ローカルリポジトリにて複数ブランチを作り、各ブランチ上でコミットすることで、修正内容を分割する
共通Topic_ローカルでコミット.png

Gerritのブランチ一覧画面上でリモートブランチをそれぞれ作る
共通Topic_Gerritでブランチ作成01.png
共通Topic_Gerritでブランチ作成02.png

フェッチしてリモートブランチの情報を取り込み、対応するローカルブランチにそれぞれ追跡させる
共通Topic_ブランチ追跡.png

以下のように各ブランチでコミットが先行していると表示されることを確認する
共通Topic_ブランチ追跡後.png

各ブランチをコードレビュー用のブランチ(refs/for/features/modify_func_*)にプッシュする 2
これにより、先行しているコミットのコードレビューが開始される
共通Topic_PUSH.png

最後に、Gerritの各コードレビュー画面上で、共通Topicを作成する
共通Topic_Topic作成.png
共通Topic_Topic作成後.png

各コードレビュー画面上で、他の同じTopicを持ったコミットが一覧で表示されることを確認する
共通Topic_Web上での見え方.png

コードレビューの指摘を受けて修正する

各コミットは独立したブランチにあるため、1コミット単体のコードレビュー時と同じく直前のコミットを上書きを利用して実施すればよいため、本記事では割愛する


  1. 例として新しく作るブランチ上でコードレビューを行うパターンで紹介しているが、master/developなど既存のブランチ上でも実施可能である 

  2. Mac版のSourceTreeだと、適切なリモートブランチにプッシュされない不具合があるため、その場合はこちらを参照 

colomney
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away