450
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

綺麗なコミットログを作りたいときのgitテクニック

これは何

僕は開発作業をしているとき、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に上げるかどうかをいくつかのコマンドで決定していくことができます。
細かいオプションについてはこちらをご覧ください。

ここでは一旦 syeコマンドについて説明していきます。

sコマンドは、差分を行単位で切り分けてより細かいレベルでステージに上げるかどうかを決められるコマンドです。
これを用いることで、ファイル内の行ごとに差分をstageにあげていくことができます。

そしてyコマンドは表示された差分をそのままstageに上げるコマンドです。変更をそのままstageにあげてしまって問題ない場合はyを選択しましょう。

そして一番便利なのがeコマンドです。eコマンドはstageに上げる変更を自分で指定できる方法です。
上の差分の中で、foobarだけを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にあげ終わったら最後はコミットを作成するだけです。適切なコミットメッセージを書きましょう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
450
Help us understand the problem. What are the problem?