Gerritは1コミット=1コードレビューを前提とするコードレビューシステムであり、実際に運用していると、コードレビューが乱立することを避けたい思いから、大きな修正内容でも1コミットにまとめてしまいがちになる場合がある
しかし以下を踏まえると、大きな修正内容は分割する方が良いと考えられる
- 1つのコードレビューに過度(数百行程度)の変更が含まれていると、レビュアーの負担が大きい
- 意味ある最小単位でコミットを残せない
本記事では、Gerritのコードレビューを複数に分割して実施する方法と、その具体的手順を紹介する
概要
以下2つの方法を紹介する
- 1つのブランチに複数コミットを行い、同時にプッシュすることで「連鎖」として関連付ける
- 複数ブランチに個別でコミット・プッシュしたのち、共通の「Topic」を付与することで関連付ける
前提とする環境
- Gerrit 3.0.0
- SourceTree 3.2
想定する読者
GerritのWebインタフェースとSourceTreeを利用して、以下を実施する手順を知っている
- 1コミット単体のコードレビュー提出
- 1コミット単体のコードレビューでNGとなった場合の修正と再提出
1つのブランチに複数コミットを行い、同時にプッシュすることで「連鎖」として関連付ける
この方法は、修正内容を「依存関係のある複数のコミット」に分割できる場合に取れる手段である
つまり、修正内容がA・Bの2つに分けられるとした場合、BはAのコミットが適用されていることを前提とする修正であるような場合に適した方法となる
修正内容を「依存関係のない複数のコミット」に分割できる場合は、後述の方法が適している可能性がある
この方法を用いると、Gerritのコードレビュー画面上で、分割した修正内容が「連鎖」として表示される
レビュアーはこのリストを下から順に辿ることで、コミットを親から子の順で確認できる
SourceTreeでの具体的手順
新規にコードレビューを開始する
ローカルリポジトリにてブランチ(features/modify_func
とする)を作り1、修正内容を複数に分割してコミットする
フェッチしてリモートブランチの情報を取り込み、ローカルブランチに追跡させる
以下のように複数コミットが先行していると表示されることを確認する
ブランチをコードレビュー用のブランチ(refs/for/features/modify_func
)にプッシュする 2
これにより、先行しているコミットのコードレビューが開始される
Gerritのコードレビュー画面上で、同時にプッシュしたコミットが一覧で連鎖として表示されることを確認する
コードレビューの指摘を受けて修正する
複数ある中の最後のコミットの指摘に対しては、直前のコミットを上書き(amendコミット)にて修正すれば良いが、それ以外の場合は対話形式でリベース(インタラクティブなリベース)を利用する必要がある
例えば、以下のように3つのうち2番目のコミットに指摘が入り、修正を行う場合の手順を紹介する
この場合SourceTreeにて、修正したいコミットの直前のコミットを選択し、対話形式でリベース(インタラクティブなリベース)を実施する
出てきた画面にて、修正したいコミットにチェックを入れたうえでOKを押下する
これにより、チェックを入れたコミットが適用された直後にリベース作業が一時停止し、手作業でコミットを修正する時間が設けられる
この状態でコードを修正し、直前のコミットを上書き(amendコミット)する
この際、コミットメッセージも適宜修正することができる
ただし、提出済みのコードレビューと紐づけできるよう、最後の行のChange-Idは編集せず維持しておく必要がある
以下のように、HEADが最新コミットになればローカルでの修正完了となる
(リベースを続行でコンフリクトが発生する場合は、手動でコンフリクトを解消してリベースを続行を繰り返す)
この状態でプッシュすることで、以下のように新たなパッチセットがGerritにアップロードされて、リモートにおいても修正完了となる
複数ブランチに個別でコミット・プッシュしたのち、共通の「Topic」を付与することで関連付ける
この方法は、修正内容を「依存関係のない複数のコミット」に分割できる場合に取れる手段である
つまり、修正内容がA・Bの2つに分けられるとした場合、双方のコミットが順番を問わず独立して適用できるような場合に適した方法となる
この方法を用いると、Gerritのコードレビュー画面上で、分割した修正内容が共通の「Topic」を持ったもの一覧として表示される
SourceTreeでの具体的手順
新規にコードレビューを開始する
ローカルリポジトリにて複数ブランチを作り、各ブランチ上でコミットすることで、修正内容を分割する
Gerritのブランチ一覧画面上でリモートブランチをそれぞれ作る
フェッチしてリモートブランチの情報を取り込み、対応するローカルブランチにそれぞれ追跡させる
以下のように各ブランチでコミットが先行していると表示されることを確認する
各ブランチをコードレビュー用のブランチ(refs/for/features/modify_func_*
)にプッシュする 2
これにより、先行しているコミットのコードレビューが開始される
最後に、Gerritの各コードレビュー画面上で、共通Topicを作成する
各コードレビュー画面上で、他の同じTopicを持ったコミットが一覧で表示されることを確認する
コードレビューの指摘を受けて修正する
各コミットは独立したブランチにあるため、1コミット単体のコードレビュー時と同じく直前のコミットを上書きを利用して実施すればよいため、本記事では割愛する