ファイルを変更していなくても、新しいコミットだけを作りたいことがあります。

Gitでは、--allow-emptyを付けると、親コミットと同じ内容を指す「空コミット」を作成できます。最短のコマンドは次のとおりです。

git commit --allow-empty -m "chore: create empty commit"

この記事では、空コミットの作り方、作成できたか確認する方法、GitHub Actionsやデプロイで使う場合の注意点をまとめます。

Gitで空コミットを作成する

変更がない状態で通常のgit commitを実行すると、Gitは新しいコミットを作成しません。--allow-emptyを付けると、この安全策を明示的に解除できます。

git status
git commit --allow-empty -m "ci: trigger deployment"

-mの後ろには、空コミットを作った理由が分かるメッセージを入れてください。empty commitだけではなく、ci: trigger deploymentchore: create initial commitのように目的まで残しておくと、後から履歴を読んだときに迷いません。

Gitの公式ドキュメントでは、--allow-emptyは親コミットとまったく同じツリーを持つコミットを許可するオプションとして説明されています。

空コミットを確認する

作成した直後は、次のコマンドで最新のコミットを確認できます。

git log -1 --oneline
git show --stat --oneline HEAD

git logには新しいコミットが表示されます。一方、空コミットにはファイル変更がないため、git show --statに変更ファイルは表示されません。

親コミットとの差分がないことを確認したい場合は、次のコマンドを使います。

git diff --stat HEAD^ HEAD

何も出力されなければ、2つのコミット間にファイル差分はありません。ただし、最初のコミットには親がないため、この確認方法は2つ目以降のコミットで使ってください。

この記事の更新時には、Git 2.50.1で空コミットを2つ作成しました。2つのコミットのツリーIDは同じで、git diff --stat HEAD^ HEADにも差分は表示されないことを確認しています。

空コミットをリモートへpushする

空コミットも通常のコミットと同じようにpushできます。先に現在のブランチを確認してから、対象のブランチ名を指定します。

git branch --show-current
git push origin your-branch

your-branchは、実際のブランチ名に置き換えてください。意図せずmainへpushしないよう、コマンドを実行する前にブランチ名を確認しておくと安全です。

空コミットを使う場面

pushを契機にCIやデプロイを動かす

pushをトリガーにしているCIやデプロイでは、空コミットをpushすると新しいコミットSHAが作られるため、処理をもう一度動かせます。

git commit --allow-empty -m "ci: retrigger deployment"
git push origin your-branch

ただし、GitHub Actionsを再実行する目的なら、毎回空コミットを作る必要はありません。既存のWorkflow RunはGitHubの画面から再実行できます。また、ワークフローにworkflow_dispatchが設定されていれば、Actions画面の「Run workflow」から手動実行できます。

同じコミットをそのまま再実行したい場合は再実行機能、pushイベントを含めて新しいコミットとして処理したい場合は空コミット、という使い分けが分かりやすいです。

ファイルを作る前に初期コミットを用意する

空のリポジトリに最初のコミットを作り、ブランチの起点を用意する用途でも使えます。

git init
git commit --allow-empty -m "chore: initial commit"
git branch -M main

このあとリモートリポジトリを登録してpushすれば、ファイルを追加する前でもmainブランチを作成できます。

作業の区切りを履歴に残す

検証開始などの区切りを、ファイル変更とは別のコミットとして残したい場合にも使えます。

git commit --allow-empty -m "test: start performance experiment"

空コミットが増えると履歴のノイズになるため、チーム開発では目的と運用ルールを決めてから使うのが安全です。単にメモを残したいだけなら、IssueやPull Requestのコメントの方が適している場合もあります。

VS Codeから空コミットを作る

VS Codeでは、メニューの「ターミナル」から新しいターミナルを開き、同じGitコマンドを実行できます。

git commit --allow-empty -m "chore: create empty commit from VS Code"

変更ファイルをステージする必要はありません。実行後はターミナルでgit log -1 --onelineを実行し、新しいコミットが追加されたことを確認してください。

--allow-empty-messageとの違い

--allow-empty--allow-empty-messageは別のオプションです。

オプション許可するもの
--allow-emptyファイル変更がないコミット
--allow-empty-messageコミットメッセージが空のコミット

変更のないコミットを作りたい場合に使うのは--allow-emptyです。履歴を追いやすくするため、コミットメッセージまで空にするのは避けた方がよいでしょう。

空コミットを使うときの注意点

  • 実行前にgit statusと現在のブランチを確認する。
  • コミットメッセージに、作成した目的を残す。
  • CIの再実行機能やworkflow_dispatchで代替できないか確認する。
  • 空コミットを自動生成するGit hookは、意図しない履歴を増やすため安易に追加しない。
  • チームのブランチ保護やコミット運用に従う。

空コミットを追加しても、過去のファイル内容は削除されません。誤ってAPIキーなどをコミットした場合は、空コミットではなく認証情報の失効・再発行と履歴への対応が必要です。検出手順はTruffleHog v3の使い方で確認できます。

まとめ

Gitで空コミットを作る基本コマンドは次の1行です。

git commit --allow-empty -m "目的が分かるメッセージ"

空コミットは、pushを契機にした処理を動かす場合や、リポジトリの初期コミットを用意する場合に使えます。便利な一方で、GitHub Actionsの再実行機能などで代替できることもあります。新しいコミットが本当に必要か確認して、目的が履歴に残るメッセージと一緒に使いましょう。