【Git操作】レビューを受けたあとの修正テクニック
レビューを受けたあと、どうする?
コードレビューを受けたあとは、すでに行ったコミットを踏まえて適切に修正する必要があります。
適切な修正とは、一言で言えば、きれいなコミットログが残っている状態にするということです。
まずは、良くないコミットの例を示します。
例えば、以下のようなコミットログが残っていたとします。
良くないコミットの例
# ログを表示(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には、そうしたニーズに応えるための方法が用意されています。その内、rebase
とfixup
について紹介します。
rebaseについて
git rebase -iコマンド
まず、rebaseコマンドそのものについて説明します。
rebase
コマンドは、git merge(マージ)
コマンドと同じように、2つのブランチを1つに統合するコマンドです。merge
よりもrebase
の方が、きれいなコミットを残すことができます。
rebaseコマンドの方がきれいなコミットを残せるわけ
git merge
コマンドを使うと、あるブランチを元のブランチに統合する際マージコミットと呼ばれるコミットが生まれます。これは、「マージしました!」ということを伝えるコミットです。
それに対し、git rebase
コマンドは、マージコミットを残しません。「いつマージしたか」という情報はアプリケーションを作っていく上で重要ではないため、無い方がより良いと言えます。
git rebaseコマンドの使い方について
以下の記事を参考にしてください。他にも調べて、自分なりの言葉で説明できるようになっておきましょう。
続いて、git rebase -i
として、-i
オプションがついた場合について説明します。
-i
オプションをつけると、現在のブランチにおけるこれまでのコミットを操作することができます。
具体的には、以下のような操作が可能です。
・コミットメッセージの変更
・複数のコミットを1つにまとめる
・コミットの内容を改変する
具体的な使い方については、以下のブログ記事などが参考になります。
git rebase -i はやっぱりイケてる件【git】【rebase 】【iオプション】
開発途中でコミットの粒度が適切でないと感じた場合は、積極的に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