直前のコミットメッセージを直す:git commit --amendと、push済みのときの戻し方

push前の直前のコミットは、git commit --amend -mでメッセージだけを置き換えられます。ステージ済みの変更が入る点、HEAD@{1}で取り消す方法、作者の直し方、push済みで拒否されたときの選び方(--force-with-lease --force-if-includes)を実行例で掲載。

目次
  1. push前なら、git commit --amend -mで直前のメッセージを置き換える
  2. amendで変わるもの・変わらないもの
  3. 練習用フォルダーを作り、そこへ移動する
  4. 送信先と、メッセージを間違えたコミットを用意する
  5. メッセージだけを直す
  6. 入れ忘れたファイルを足すなら、addしてから--no-edit
  7. amendを取り消して、直前の状態に戻す
  8. 作者のメールアドレスを間違えたときは、--reset-author
  9. push済みのコミットをamendすると、pushが拒否される
  10. 他の人も使うブランチなら、amendを取り消してそのままにする
  11. 自分だけが使うブランチなら、--force-with-lease --force-if-includesで送る
  12. 関連する操作と、確認した環境
  13. 参考資料

push前なら、git commit --amend -mで直前のメッセージを置き換える

git commit --amendは、ブランチの先頭にある直前のコミットを、新しいコミットに置き換えるコマンドです。-mで新しいメッセージを指定すると、中身は同じでメッセージだけが違うコミットになります。直せるのは直前の1件だけで、2件以上前のコミットのメッセージはこの方法では直せません。

amendは、そのときステージ(インデックス)に入っている変更もコミットに加えます。先にgit status --shortを実行し、左の列に文字が付いた行(ステージ済みの変更)がないことを確かめてください。何も表示されないか、右の列だけの M(未ステージの変更)や??(未追跡ファイル)だけなら、メッセージ以外は変わりません。

pushする前のコミットが対象です。push済みのコミットをamendすると、そのままではpushが拒否されます(後の節)。

git status --short
git commit --amend -m 'Add second step'
git log --oneline -2

amendで変わるもの・変わらないもの

amendは元のコミットを書き換えるのではなく、新しいコミットを作ってブランチの先頭を付け替えます。そのためコミットIDが変わります。元のコミットはブランチから外れますが、すぐには消えず、reflogのHEAD@{1}から戻せます(後の節)。

作者と作者の日時は元のコミットから引き継がれます。下の表のコミット日時はgit log --format=%cdで表示される日時で、git logの既定の表示(Date:)は作者の日時です。

表は横にスクロールできます →

対象amendの後
コミットID変わる(新しいコミットに置き換わる)
メッセージ-mで指定したもの。--no-editなら元のまま
中身(ファイル)ステージ済みの変更があれば加わる。なければ元と同じ
作者・作者の日時元のまま。--reset-authorを付けると今の設定と時刻になる
コミット日時amendした時刻になる
元のコミットブランチから外れる。reflogのHEAD@{1}で戻せる
push済みの送信先変わらない。そのままpushすると拒否される

練習用フォルダーを作り、そこへ移動する

以下はGitが使えるBash(WSLやGit Bashなど)用です。PowerShellへそのまま貼る例ではありません。実務のリポジトリではなく、まだ存在しないgit-amend-practiceというフォルダーで試します。次の2行は1行ずつ実行し、mkdirとcdの両方が成功したことを確かめてから次へ進みます。エラーが出たらそこで止めてください。既に同名フォルダーがある場合は、別の新しい名前を選びます。

mkdir git-amend-practice
cd git-amend-practice

送信先と、メッセージを間違えたコミットを用意する

後でpush済みの場合も試すため、同じフォルダー内に送信先用のリポジトリremote.gitを作り、作業用のworkへ移動します。ネットワーク上のサービスには接続しません。名前とメールアドレスは、この練習用リポジトリ内だけに設定する例示値です。git init -bはGit 2.28以降で使えます。git init --bareの後に、初期ブランチ名についてのhint:が何行か表示されることがありますが、この練習には影響しません。

2件目のAdd secnd stepが、メッセージを打ち間違えたコミットという想定です。最後のgit log --onelineでは、新しい順にAdd secnd step、Add first stepの2件が表示されます。左端の7桁ほどの英数字がコミットIDで、環境ごとに値が変わります。

git init --bare remote.git
git init -b main work
cd work
git config user.name 'Practice'
git config user.email 'practice@example.invalid'
git remote add origin ../remote.git
printf 'step 1\n' > notes.txt
git add -- notes.txt
git commit -m 'Add first step'
printf 'step 2\n' >> notes.txt
git add -- notes.txt
git commit -m 'Add secnd step'
git log --oneline

メッセージだけを直す

git status --shortが何も表示しないことを確かめてから、amendします。git log --onelineの先頭はAdd second stepになり、左端のコミットIDは直す前と違う値に変わります。件数は2件のままです。

git reflog -2の1行目はHEAD@{0}: commit (amend): Add second step、2行目はHEAD@{1}: commit: Add secnd stepです。2行目が直す前のコミットで、ブランチから外れた後もここに記録が残っています。

-mを付けずにgit commit --amendだけを実行すると、元のメッセージが入った状態でエディターが開きます。開くエディターはGitの設定(core.editor)で決まります。書き換えて保存し、エディターを閉じるとamendされます。メッセージを全部消して保存すると、Aborting commit due to empty commit message.と表示されて中止され、コミットは変わりません。

git status --short
git commit --amend -m 'Add second step'
git log --oneline
git reflog -2

入れ忘れたファイルを足すなら、addしてから--no-edit

直前のコミットにファイルを入れ忘れた場合は、そのファイルをaddしてから--no-editでamendすると、メッセージを変えずに中身だけを足せます。git show --statでは、notes.txtとtodo.txtの2つが同じコミットに入っていることが分かります。

逆に言えば、メッセージだけを直すつもりでも、addしたままの変更があれば一緒に入ります。git reset --softでいったん取り消してから入れ直す方法は、関連記事「直前のコミットを取り消す:git reset --softで変更をステージに残す手順」で扱っています。

printf 'draft\n' > todo.txt
git add -- todo.txt
git status --short
git commit --amend --no-edit
git show --stat --format=%s HEAD

amendを取り消して、直前の状態に戻す

amendの直後なら、git reset --soft HEAD@{1}でブランチの先頭をamend前のコミットへ戻せます。--softなので、amendで加えた変更はステージに残ります。この練習では、git status --shortがA todo.txt(左の列のAはステージ済みの追加)を表示し、git log --oneline -1はtodo.txtを足す前のAdd second stepです。

ここでは、todo.txtを別のコミットとして記録し直します。最後のgit log --onelineは、Add todo list、Add second step、Add first stepの3件です。

HEAD@{1}は「HEADが1つ前に指していたコミット」です。amendの後に別のコミットやresetをすると、指す先が変わります。時間がたってから戻す場合は、git reflogの一覧でcommit (amend)の1つ下の行を探し、そのコミットIDを指定してください。reflogの読み方は関連記事「git reset --hardで消したコミットを戻す:git reflogで元の位置を探す手順」にあります。

git reset --soft HEAD@{1}
git status --short
git log --oneline -1
git commit -m 'Add todo list'
git log --oneline

作者のメールアドレスを間違えたときは、--reset-author

user.emailの設定を間違えたままコミットした場合を再現します。1つ目のgit logはPractice <wrong@example.invalid>です。設定を直してから--reset-authorを付けてamendすると、作者が今の設定に替わり、2つ目のgit logはPractice <practice@example.invalid>になります。

--reset-authorは作者の日時も今の時刻に変えます。--no-editを付けているので、メッセージはAdd third stepのままです。直せるのは直前のコミットだけで、それより前のコミットの作者はこの方法では変わりません。

git config user.email 'wrong@example.invalid'
printf 'step 3\n' >> notes.txt
git add -- notes.txt
git commit -m 'Add third step'
git log -1 --format='%an <%ae>'
git config user.email 'practice@example.invalid'
git commit --amend --no-edit --reset-author
git log -1 --format='%an <%ae>'

push済みのコミットをamendすると、pushが拒否される

ここまでの4件をpushしてから、直前のコミットをamendします。続くgit pushは ! [rejected] main -> main (non-fast-forward)と表示されて失敗しました。手元のmainと送信先のmainが、それぞれ別のコミットを先頭に持つ状態になったためです。git statusの2行目はYour branch and 'origin/main' have diverged,です。

エラーの下のhintはgit pullを勧めますが、amendが原因のときは従わないでください。この検証の設定(pull.rebaseなどを設定していない状態)では、git pullはfatal: Need to specify how to reconcile divergent branches.で止まりました。pull.rebaseにfalseが設定されている環境や、--no-rebaseを付けた場合は止まらず、直す前と直した後の両方を含むマージコミットができて、メッセージの直しが履歴に二重に残ります。メッセージだけをamendした後でこのマージをしてしまった場合は、その直後にgit reset --soft origin/mainを実行すると、送信先と同じ状態に戻ります。

ここから先は、そのブランチを自分以外の人も使っているかで分かれます。

git push -u origin HEAD
git commit --amend -m 'Add step 3'
git push
git status

他の人も使うブランチなら、amendを取り消してそのままにする

他の人がpullしているブランチ(チームのmainなど)では、push済みのコミットを置き換えないでください。他の人の手元にある古いコミットと食い違います。メッセージの誤字だけなら、amendを取り消して、送信先と同じ状態に戻すのが安全です。

git reset --soft HEAD@{1}の後、git statusの2行目はYour branch is up to date with 'origin/main'.になり、git log --oneline -1はAdd third stepに戻ります。中身の誤りを直したい場合は、新しいコミットを足すか、関連記事「push済みのコミットを打ち消す:git revertで履歴を残したまま元に戻す手順」の方法を使います。

git reset --soft HEAD@{1}
git status
git log --oneline -1

自分だけが使うブランチなら、--force-with-lease --force-if-includesで送る

自分しかpushしない作業用ブランチなら、amendしたコミットで送信先を置き換えられます。前の節でamendを取り消した場合は、もう一度amendしてから送ります。下のgit pushは + (古いID)...(新しいID) main -> main (forced update)と表示して成功し、git log --oneline -1 origin/mainはAdd step 3です。この練習ではmainで試していますが、実務の共有のmainでは行いません。

--forceだけだと、送信先に他の人が足したコミットがあっても確認なしに消します。--force-with-leaseは、送信先が手元の記録(origin/main)と同じときだけ置き換えます。検証用の別のcloneで他の人がpushしてから試すと、! [rejected] main -> main (stale info)と表示されて止まりました。ただしgit fetchで手元の記録を更新した後では、--force-with-leaseだけのpushが成功し、他の人のコミットが送信先から消えました。Git公式の説明も、裏でfetchが動く環境ではこの保護が効かないと注意しています。

--force-if-includesを一緒に付けると、fetchで更新された手元のorigin/mainの先頭が、mainのreflog(mainがこれまで指したコミットの記録)に含まれていない場合に止めます。同じ検証で、fetchの後でも ! [rejected] main -> main (remote ref updated since checkout)と表示されて止まりました。止まった場合は、git reset --soft HEAD@{1}でamendを取り消してからgit pullで取り込み、メッセージの直しはあきらめます。--force-if-includesはGit 2.30で追加されたオプションです。

git commit --amend -m 'Add step 3'
git push --force-with-lease --force-if-includes origin main
git log --oneline -1 origin/main

関連する操作と、確認した環境

コミットの中身ごと取り消して作り直したい場合は「直前のコミットを取り消す:git reset --softで変更をステージに残す手順」、push済みのコミットを履歴に残したまま打ち消す場合は「push済みのコミットを打ち消す:git revertで履歴を残したまま元に戻す手順」が対象です。2件以上前のコミットのメッセージを直す方法(git rebase -iなど)は、この記事では扱いません。

2026年10月26日、WSLのLinux・Git 2.53.0・非rootユーザーで掲載例を実行しました。amend前後のgit log・git reflogの表示、--no-editで足したファイル、git reset --soft HEAD@{1}で戻した後の状態、--reset-authorで替わる作者と日時、メッセージを空にしたときの中止、push済みのamendで拒否される表示とgit pullの結果(pull.rebaseを設定しない場合とfalseの場合)、マージ後のgit reset --soft origin/main、--force-with-lease・--force-if-includesの成功と、別のcloneで他の人がpushした場合(fetchの前後)の結果を照合しています。Git公式の説明は2026年10月26日時点の版(git-commit・git-pushは2.55.0、gitrevisionsは2.56.0で更新)と、Git 2.30.0のリリースノートを参照しました。Git for Windows(Git Bash)・コマンドプロンプト・PowerShellでは実行していません。

参考資料