😺

Git Commitの各種オプションとその使い道

2025/01/07に公開

概要

  • git commitする際にmオプションくらいしか使ってなくない?
  • 公式ドキュメントを読んでもっと効率の良い使い方がないかを調べて紹介します
    https://git-scm.com/docs/git-commit

各種オプション 利用ケースを添えて

git commit -a でまとめてaddしてコミット

変更差分があるファイルを個別でaddせずともコミットしてくれます。自動フォーマットをコミットしたい場面で修正が担保されている場合にはこのコマンドを使うのがおすすめ。

git commit -p のパッチオプションつきで部分的にコミットする

git add -pと同じ動作で、コマンドを叩くとインタラクティブにコミットする部分を選択することが可能になります。複数の作業をやっている際にコミットわけしたり、仮コードを追加しないようにする際に便利。コミット粒度を適切にするために使ったことない人は使ってみましょう。

git commit --amend で直前コミットを修正

直前のコミットを修正します、例えば以下のような操作を考えます。

# 間違ったコミットメッセージ
git commit -m "wrong message"
# 直前コミット取り消し
git reset --soft HEAD^
# 修正コミット
git commit -m "correct message"

このような修正を行いたいときに--amendオプションが使えます。以下のように修正を一括で実施します。

# 間違ったコミットメッセージ
git commit -m "wrong message"

# 追加したい操作
git add hoge
# ammendで先ほどのコミットを修正
git commit --amend "correct message"

※ 当然ですがamendはコミット修正、Push済みの場合はremoteとのコミットとズレますので注意しましょう。

git commit --amend --no-edit で内容だけ修正

先ほどの--amendでコミットメッセージはそのままにする場合は--no-editをつけましょう。

# 間違ったコミットメッセージ
git commit -m "message"

# 追加したい操作
git add hoge
# ammendで先ほどのコミットを修正, コミットメッセージはそのまま
git commit --amend --no-edit

git commit --allow-empty で差分なしコミット

--allow-emptyオプションでは差分がない場合でもコミットできます。初期のinitial commitで差分がないときにコミットしたいケースが多いかと思います。

またCIでGit操作をする場合に差分がない場合でもコミットして処理を正常終了したいというケースもあります。

git commit --allow-empty-message -m "" で空メッセージ

コミットを空メッセージで投げられる機能ですが……あまり使わないほうがいいです。よっぽどの都合でメッセージなしにしたい場合は使いましょう。

git commit --dry-run で事前チェック

git commit自動化したい、というケースでローカルで動作チェックをする場合は積極的にdry-runを使ってみましょう。特に自動化する際に予期しないケースで失敗することがあるので、手元やリモート環境でdry-runしてみるのがおすすめです。

またエラーが出た場合は-v, --verboseで詳しくログを見てみるのも推奨です。

git commit --fix-upであとでコミットをまとめる

自分で作業をしているときについつい変更差分が大きくなってあとからコミットを修正したいケースがあると思います。

自分のコミットについていくつかの変更をまとめて1つのコミットにするため、チェックをつけることができます。

具体的な手順をコマンドで書いてみます。

# 今までの履歴とハッシュ値を確認します
git log --oneline

次にfixup用のコメントを作成します

# a1b2c3d のコミットを修正するための fixup 用コミットを作成
git commit --fixup=a1b2c3d

そうすると対象のコミットが置き換わって、コメントが置き換わります。

"This is commit message"
→
"fixup! This is commit message"

コメントの頭にfixup!のメッセージがつきますがこれがチェックをつけた状態です。

更新したいコミットすべてにメッセージをつけた状態でまとめるコマンドを実行します

git rebase -i --autosquash 

これで対話的にコミットを1つにsquashしてくれます。具体的なユースケースですが、プルリクエストにする前に複数のコミットをわかりやすいように1つにまとめる際に使うことが多いでしょう。

もちろん変更を1行ずつ git add しても最終的な変更は変わりません。ただしgitの機能を使いこなすことでローカルのgit環境で差分管理を使いこなした効率の良い作業ができるようになります。

Discussion