はじめに
こちらはDMM.com #1 Advent Calendar 2017 19日目の記事です。
前日の記事は@rinnkisiさんの初心者が明日から使えるLinuxコマンド【簡易編】でした。
カレンダーのURLはコチラ
就職するまでGitを使ったことすらなかった新卒が、コミットログを気にするようになったので書くことにしました。
コミットログを綺麗にするとは
簡単に言うと無駄なコミットを作らないことです
無駄なコミットとは主にFIX lint
やFIX typo
のような実装後の修正にあたる部分です
またaddし忘れたファイルを追加するだけのコミットもなるべく避けるようにします
利点としては自己満足できることです
どのような変更がどこで起きたのか追いやすくなることです
どうやってやるの
コミットログを綺麗にする方法は大きく分けて2つあります
-
git commit --amend
を使用する -
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
と書かれている部分をreword
やedit
などに書き換えてコミットを整理していきます
今回は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を作ったお話です!