これは何
僕は開発作業をしているとき、PRをあげるまでの開発途中はwip
コミットに変更を記録していき、最後にコミットを仕上げていくような作業をよくします。
初めからコミットを綺麗に書きながら開発ができれば良いのですが、
にあるようなコミットログを仕上げていこうと思うとどうしても最後にコミットログを整理したくなります。
この記事はこのようにgitを使うと綺麗なコミットログを作れるよ、というTipsです。
具体的にこういうコミットを作ると良いよ、みたいな話はこの記事ではしません。
僕はこのような工程でPRを出す前にコミットログを作っています。
-
git rebase -i
で作業中のコミットを全て一つのコミットにsquashする -
git reset HEAD~
で一度コミットを取り消す -
git add -p
で作りたいコミットごとに変更をstageにあげていく - コミットを作成する
git rebase -i
で作業中のコミットを全て一つのコミットにsquashする
まずは作業をしたときに作ってしまったコミットを一旦整理していきます。
作業中にwipコミットをだらだら作っていると、こんな感じのコミットログができていたりすると思います。
commit 166f51a3fead14e70b3e73a98646edb9088d2351 (HEAD -> hoge)
Author: getty104 <>
Date: Sat Jun 19 17:18:50 2021 +0900
wip
commit 78be54733b9e9deaeb7a553c8297b2088dc59ea0
Author: getty104 <>
Date: Sat Jun 19 17:18:40 2021 +0900
wip
このようなコミットを、git rebase -i
で一つのコミットにsquashしていきます。
rebase -i
についてはこちらをご覧ください。
以下のようにはじめのコミット以外をfixup
で一つにまとめていきます。
pick 78be547 wip
fixup 166f51a wip
# Rebase 1ee1d37..166f51a onto 1ee1d37 (2 commands)
git reset HEAD~
で一度コミットを取り消す
前の項目でまとめ上げたコミットを、一度取り消します。
git reset HEAD~
を実行すれば取り消しができます。
git add -p
で作りたいコミットごとに変更をstageにあげていく
おそらく変更をstageにあげていく際、git add ファイル名
でファイルごとあげていくことが多いと思います。
しかし、綺麗なコミットを作り上げたいとなると、ファイル単位ではなく、行単位でコミットログを作っていきたい場合が多いです。
そこでgit add -p
を用います。この記事の山場です。
git add -p
とは、unstageの変更に対して対話形式でstageに上げるかどうかを選んでいけるオプションです。
git add -p
を実行すると、このような表示がされます。
diff --git a/foo b/foo
index e69de29..a5e2a02 100644
--- a/foo
+++ b/foo
@@ -0,0 +1,3 @@
+foo
+hoge
+bar
(1/1) Stage this hunk [y,n,q,a,d,e,?]?
このような感じでstageに上げるかどうかをいくつかのコマンドで決定していくことができます。
細かいオプションについてはこちらをご覧ください。
ここでは一旦 s
、y
、e
コマンドについて説明していきます。
s
コマンドは、差分を行単位で切り分けてより細かいレベルでステージに上げるかどうかを決められるコマンドです。
これを用いることで、ファイル内の行ごとに差分をstageにあげていくことができます。
そしてy
コマンドは表示された差分をそのままstageに上げるコマンドです。変更をそのままstageにあげてしまって問題ない場合はy
を選択しましょう。
そして一番便利なのがe
コマンドです。e
コマンドはstageに上げる変更を自分で指定できる方法です。
上の差分の中で、foo
とbar
だけをstageにあげたい場合、どのようにすると良いでしょうか?s
差分を行の境界で切離分けるので、今回のように間のhoge
だけは入れたくない、みたいな場合は利用できません。こんなときにまさにe
コマンドは真価を発揮します。
上の変更でe
を選択すると、エディタが開きます。そこで差分として取り込みたい行のみ残し、取り込みたくない行は消し、保存をすることでstageにあげたい差分だけを取り込めます。この際エディタで差分を変更しても実際のファイルが書き変わるわけではないのでご安心ください。
# Manual hunk edit mode -- see bottom for a quick guide.
@@ -0,0 +1,3 @@
+fuga
+hoge <-ここを消す
+baz
# ---
# To remove '-' lines, make them ' ' lines (context).
# To remove '+' lines, delete them.
# Lines starting with # will be removed.
#
# If the patch applies cleanly, the edited hunk will immediately be
# marked for staging.
# If it does not apply cleanly, you will be given an opportunity to
# edit again. If all lines of the hunk are removed, then the edit is
# aborted and the hunk is left unchanged.
コミットを作成する
stageにあげ終わったら最後はコミットを作成するだけです。適切なコミットメッセージを書きましょう。