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 -2amendで変わるもの・変わらないもの
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 HEADamendを取り消して、直前の状態に戻す
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では実行していません。