Gitのコミットログを綺麗にする


はじめに

こちらはDMM.com #1 Advent Calendar 2017 19日目の記事です。
前日の記事は@rinnkisiさんの初心者が明日から使えるLinuxコマンド【簡易編】でした。
カレンダーのURLはコチラ
- DMM.com #1 Advent Calendar 2017
- DMM.com #2 Advent Calendar 2017

就職するまでGitを使ったことすらなかった新卒が、コミットログを気にするようになったので書くことにしました。

コミットログを綺麗にするとは

簡単に言うと無駄なコミットを作らないことです

無駄なコミットとは主にFIX lintFIX typoのような実装後の修正にあたる部分です
またaddし忘れたファイルを追加するだけのコミットもなるべく避けるようにします

利点としては自己満足できることです
どのような変更がどこで起きたのか追いやすくなることです

どうやってやるの

コミットログを綺麗にする方法は大きく分けて2つあります

  1. git commit --amendを使用する
  2. git rebase -iを使用する

それぞれ例を出しながら紹介していきます

git commit --amendを使用する

このコマンドは直前のコミットを上書きするコマンドです
直前のコミットメッセージの修正時にも使用します

ここではhogeという機能の実装時にaddし忘れたファイルがある場合を例にします

$ git add aaa.php
$ git commit -m 'hogeを実装'
$ git log --oneline
f1e76na hogeを実装

ここでaddし忘れたbbb.phpをaddします

$ git add bbb.php
$ git commit --amend --no-edit
$ git log --oneline
g2mt37a hogeを実装

直前のコミットの書き換えが成功しました
--no-editを使用して--amend時に立ち上がるエディターを立ち上げないようにしています
コミットメッセージを書き換える必要のないときには付けておくといいです

逆にコミットメッセージだけを書き換えたい場合は
$ git commit --amend -m 'fugaを実装'
とします

git rebase -iを使用する

git commit --amendで直前のコミットが書き換えられるようになりました
しかし、2つ以上前のコミットの書き換えるにはどうするのか?
そこで使用するのがgit rebase -iです

git rebase -iを実行するとエディタが立ち上がり対話的にコミットを整理することができます
基本的な構文はgit rebase -i <commit-ish>です

ここではブランチでの作業が終わりプルリクを出す前にコミットログをまとめる場合を例にします

$ git log --oneline
c45aa0f (HEAD -> aaa) fooの実装
258dcd3 FIX:typo
d17250a fugaの実装
099e3b1 (master) hogeを実装

$ git rebase -i master
pick d17250a fugaの実装
pick 258dcd3 FIX:typo
pick c45aa0f fooの実装

# Rebase 099e3b1..c45aa0f onto 099e3b1 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#                (以下略)

git rebase -iを実行すると上記のようになります
Commands:以下に書かれていることが重要です
それぞれのコミットの左にpickと書かれている部分をrewordeditなどに書き換えてコミットを整理していきます

今回はFIX:typoというコミットをその前のコミットにまとめます
コミットメッセージを変える必要はないのでfixupを使用します

$ git rebase -i master
pick d17250a fugaの実装
fixup 258dcd3 FIX:typo  # ⬅️ここをfixupに
pick c45aa0f fooの実装

書き換えたらエディタを閉じます

$ git log --oneline
684fcf4 (HEAD -> aaa) fooの実装
158530a fugaの実装
099e3b1 (master) hogeを実装

無駄なコミットがなくなりました

これで皆さんもレビュアーが喜んでくれるプルリクを作れると思います

明日は@szynさんのTable definition as Codeを実現するflagonを作ったお話です!