📜

【Git操作】レビューを受けたあとの修正テクニック

2024/02/03に公開

レビューを受けたあと、どうする?

コードレビューを受けたあとは、すでに行ったコミットを踏まえて適切に修正する必要があります。
適切な修正とは、一言で言えば、きれいなコミットログが残っている状態にするということです。

まずは、良くないコミットの例を示します。
例えば、以下のようなコミットログが残っていたとします。

良くないコミットの例

ターミナル

# ログを表示(git logコマンドにオプションをつけることでログを見やすくしています)
git log --graph --all 

| *     Tue Oct 3 18:00:29 2017 +0900   28e76bb eichann 不要なファイルを削除  (origin/apply_to_design) (5 months ago)
| *     Tue Oct 3 18:00:10 2017 +0900   7612e69 eichann エラーを解消
| *     Tue Oct 3 17:45:28 2017 +0900   4c1efff eichann 投稿機能を作成
| *     Tue Oct 3 17:41:29 2017 +0900   fc8d52e eichann bootstrapを導入する為の記述
| *     Tue Oct 3 17:40:35 2017 +0900   2021dd0 eichann jsでbootstrapが適用されるように追記
| *     Tue Oct 3 17:39:04 2017 +0900   57cf022 eichann 必要なルーティングを追記
| *     Tue Oct 3 17:38:37 2017 +0900   7a02ce0 eichann 必要なviewファイルを追加
| *     Tue Oct 3 17:34:03 2017 +0900   ecdbbca eichann 必要な画像を追加
| *     Tue Oct 3 17:33:23 2017 +0900   1426e47 eichann bootstrap用のgemの導入


5,6行目に注目してください。「エラーを解消」「不要なファイルを削除」というコミットは、投稿機能作成についてレビューをもらい発覚した修正をするためのものだったとしましょう。

こうしたコミットは本来、 コミットログに残さない方が適切です。 なぜなら、後から見返した際に邪魔な情報になってしまうからです。また、Pull Requestのレビュワーにとっても不親切です。不要なコミットがあるとレビューをしずらくなります。

きれいなコミットログにするには

このような良くないコミットを残さないことが、きれいなコミットログを作る第一歩です。
とはいえ、修正は必ず発生します。修正に伴うコミットをしたい場合は、どうすれば良いでしょうか?

Gitには、そうしたニーズに応えるための方法が用意されています。その内、rebasefixupについて紹介します。

rebaseについて

git rebase -iコマンド

まず、rebaseコマンドそのものについて説明します。
rebaseコマンドは、git merge(マージ)コマンドと同じように、2つのブランチを1つに統合するコマンドです。mergeよりもrebaseの方が、きれいなコミットを残すことができます。

rebaseコマンドの方がきれいなコミットを残せるわけ

git mergeコマンドを使うと、あるブランチを元のブランチに統合する際マージコミットと呼ばれるコミットが生まれます。これは、「マージしました!」ということを伝えるコミットです。
それに対し、git rebaseコマンドは、マージコミットを残しません。「いつマージしたか」という情報はアプリケーションを作っていく上で重要ではないため、無い方がより良いと言えます。

git rebaseコマンドの使い方について

以下の記事を参考にしてください。他にも調べて、自分なりの言葉で説明できるようになっておきましょう。

git rebaseと仲良くなろう~part1

Git のさまざまなツール - 歴史の書き換え

続いて、git rebase -iとして、-iオプションがついた場合について説明します。

-iオプションをつけると、現在のブランチにおけるこれまでのコミットを操作することができます。
具体的には、以下のような操作が可能です。

・コミットメッセージの変更
・複数のコミットを1つにまとめる
・コミットの内容を改変する

具体的な使い方については、以下のブログ記事などが参考になります。

git rebase -i はやっぱりイケてる件【git】【rebase 】【iオプション】

Git のさまざまなツール - 歴史の書き換え

開発途中でコミットの粒度が適切でないと感じた場合は、積極的にgit rebase -iコマンドを利用しましょう。

rebaseの使いどころ

ここまで、rebaseについての基礎知識を学んできました。こちらでは、実際にrebaseをどう活用してほしいかについて書きます。
rebaseは、自分のローカルでの開発におけるコミットを綺麗に整える目的で利用しましょう。git mergeコマンドの代わりに使うことは推奨しません。git rebase -iという形は良いですが、git mergeの代わりにgit rebaseを利用するのはやめておきましょう。

なぜなら、git rebaseを使用すると、リベース対象の各コミットに対して個別にコンフリクトを解決する必要が出てくる場合があるためです。これは、特に多くのコミットがある場合や複雑な変更が含まれる場合に、手間がかかりエラーを引き起こす可能性が高くなるので大変です。

git commit --fixupについて

git commit --fixup

以下のように利用します。

ターミナル
git commit --fixup コミット番号

こちらは、レビューを受けたあと修正を行う際に役に立つコマンドです。--fixupを指定したコミットは、git rebase -iコマンドと組み合わせることで最終的に別のコミットに統合されます。統合先のコミットは、git commit --fixup コミット番号のように予め指定します。
わかりづらいので、例を出します。本項の最初に示した、良くないコミットの例を思い出してください。

###良くないコミットの例

ターミナル

#ログを表示
git log --graph --all 

| *     Tue Oct 3 18:00:29 2017 +0900   28e76bb eichann 不要なファイルを削除  (origin/apply_to_design) (5 months ago)
| *     Tue Oct 3 18:00:10 2017 +0900   7612e69 eichann エラーを解消  (5 months ago)
| *     Tue Oct 3 17:45:28 2017 +0900   4c1efff eichann 投稿機能を作成  (5 months ago)
| *     Tue Oct 3 17:41:29 2017 +0900   fc8d52e eichann bootstrapを導入する為の記述  (5 months ago)
| *     Tue Oct 3 17:40:35 2017 +0900   2021dd0 eichann jsでbootstrapが適用されるように追記  (5 months ago)
| *     Tue Oct 3 17:39:04 2017 +0900   57cf022 eichann 必要なルーティングを追記  (5 months ago)
| *     Tue Oct 3 17:38:37 2017 +0900   7a02ce0 eichann 必要なviewファイルを追加  (5 months ago)
| *     Tue Oct 3 17:34:03 2017 +0900   ecdbbca eichann 必要な画像を追加  (5 months ago)
| *     Tue Oct 3 17:33:23 2017 +0900   1426e47 eichann bootstrap用のgemの導入  (5 months ago)


「不要なファイルを削除」「エラーを解消」というメッセージがついたコミットは、「投稿機能を作成」というコミットに対するレビューを受けての変更内容のコミットです。

ということは、理想の状態は、レビューの内容を反映した「投稿機能を作成」というコミットが履歴として残ることですね。

git commit --fixupコマンドは、まさにこの理想を実現してくれるコマンドです。

git commit --fixupの使い方

先程の例から時間をさらに遡り、レビューをもらった直後であると過程してください。
すると、コミットの履歴は以下のようになるはずです。

###良くないコミットの例

ターミナル

#ログを表示
git log --graph --all 

| *     Tue Oct 3 17:45:28 2017 +0900   4c1efff eichann 投稿機能を作成  (5 months ago)
| *     Tue Oct 3 17:41:29 2017 +0900   fc8d52e eichann bootstrapを導入する為の記述  (5 months ago)
| *     Tue Oct 3 17:40:35 2017 +0900   2021dd0 eichann jsでbootstrapが適用されるように追記  (5 months ago)
| *     Tue Oct 3 17:39:04 2017 +0900   57cf022 eichann 必要なルーティングを追記  (5 months ago)
| *     Tue Oct 3 17:38:37 2017 +0900   7a02ce0 eichann 必要なviewファイルを追加  (5 months ago)
| *     Tue Oct 3 17:34:03 2017 +0900   ecdbbca eichann 必要な画像を追加  (5 months ago)
| *     Tue Oct 3 17:33:23 2017 +0900   1426e47 eichann bootstrap用のgemの導入  (5 months ago)


このあとレビューを受けて「不要なファイルを削除」「エラーを解消」の作業が完了したとしましょう。
この時、コミットの際に--fixupオプションを利用します。

ターミナル
#変更をadd
git add .
#fixupオプションを利用してコミット
git commit --fixup 4c1efff

最終的に統合したいコミットは「投稿機能を作成」のコミットなので、そのコミット番号を指定しています。

ここでログを見ると、以下のような形になります。

ターミナル

#ログを表示
git log --graph --all 
| *     Tue Oct 3 18:40:00 2017 +0900   geojsei eichann fixup! 投稿機能を作成 
| *     Tue Oct 3 17:45:28 2017 +0900   4c1efff eichann 投稿機能を作成
| *     Tue Oct 3 17:41:29 2017 +0900   fc8d52e eichann bootstrapを導入する為の記述
| *     Tue Oct 3 17:40:35 2017 +0900   2021dd0 eichann jsでbootstrapが適用されるように追記
| *     Tue Oct 3 17:39:04 2017 +0900   57cf022 eichann 必要なルーティングを追記
| *     Tue Oct 3 17:38:37 2017 +0900   7a02ce0 eichann 必要なviewファイルを追加
| *     Tue Oct 3 17:34:03 2017 +0900   ecdbbca eichann 必要な画像を追加
| *     Tue Oct 3 17:33:23 2017 +0900   1426e47 eichann bootstrap用のgemの導入


新たなコミットのメッセージは、統合したいコミットのメッセージに「fixup!」をつけたものになっています。この状態で、git rebase -iコマンドを利用します。その際、--autosquashというオプションを指定します。

ターミナル
#最新から4個前までのコミットについてをrebaseの対象とする
git rebase -i --autosquash HEAD~2

そのままrebase -iで必要な作業をせずにエディタを閉じ終了すれば、レビューを受けての変更は全て「投稿機能を作成」のコミットに統合されます。これにより、あたかもレビュー後の状態を最初から実現できていたかのようなコミットを残すことができます。

再度修正をしてレビューをもらう際にプルリクエストに反映させるコミットは、fixupを利用してコミットしましょう。

Discussion