123
@getty104

綺麗なコミットログを作りたいときの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にあげ終わったら最後はコミットを作成するだけです。適切なコミットメッセージを書きましょう。

123
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
getty104
Rubyを書いています。最近はElixirに興味があります。設計が好きです。Qiitaの開発とプロダクトマネジメントをしています。
increments
「エンジニアを最高に幸せにする」ために Qiita、Qiita Team、Qiita Jobs を開発・運営しています。

コメント

git commit --fixupとgit rebase --autosquashもべんり!
https://reboooot.net//post/git-commit-fixup/

3

ちなみにVSCodeであればショートカットでgit.stageSelectedRangesと検索してキーを割り振っておけば、行選択して設定したショートカットキーを押すだけで選択した行をstageに上げることができますね。

1
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
エンジニアによるマネジメント - エンジニアだからこそ発信できるマネジメントの知識を発信しよう
~
3000文字Tips - 知ると便利なTipsをみんなへ届けよう
~