push前の直近1件なら --soft HEAD~1
まだpushしていない直近のコミットを取り消し、その変更をステージ済みのまま残すなら、git reset --soft HEAD~1を使います。ブランチの先頭が1つ前のコミットへ戻り、作業ファイルとインデックス(ステージ)は変わりません。Git公式のresetの説明に基づく操作です。
実行前にgit log --oneline -2で、取り消すコミットとその1つ前を確かめます。実行後はgit log --oneline -2で先頭が1つ前に戻ったこと、git status --shortで変更がステージ済みとして残ったことを見ます。
HEAD~1は1つ前のコミットを指すため、履歴が最初の1件しかないリポジトリでは使えません。マージコミットの取り消しや、複数件をまとめる操作もこの記事では扱いません。
git log --oneline -2
git reset --soft HEAD~1
git log --oneline -2
git status --short--soft・--mixed・--hardで残るもの
3つとも、ブランチの先頭は1つ前のコミットへ戻ります。違いはインデックスと作業ファイルに何が残るかです。
オプションを付けないgit reset HEAD~1は--mixedと同じ動作で、変更は作業ファイルに残りますが、ステージからは外れます。--hardは作業ファイルも戻すため、コミットしていない編集まで消えます。変更を残したい場面で--hardに置き換えないでください。
表は横にスクロールできます →
| 指定 | インデックス | 作業ファイル |
|---|---|---|
| --soft | そのまま(ステージ済みで残る) | そのまま |
| --mixed(省略時) | 1つ前のコミットと同じ(未ステージになる) | そのまま |
| --hard | 1つ前のコミットと同じ | 1つ前のコミットで上書き |
練習用フォルダーを作り、そこへ移動する
以下はGitが使えるBash(WSLやGit Bashなど)用です。PowerShellへそのまま貼る例ではありません。実務のリポジトリではなく、まだ存在しないgit-reset-practiceというフォルダーで試します。次の2行は1行ずつ実行し、エラーが出たらそこで止めてください。既に同名フォルダーがある場合は、別の新しい名前を選びます。
mkdirとcdの両方が成功したことを確かめてから、次の「2件のコミットを用意する」へ進みます。
mkdir git-reset-practice
cd git-reset-practice2件のコミットを用意する
1件目はbaseの1行だけのnote.txtです。2件目でnote.txtにstep 1の行を足してコミットしますが、同じコミットに入れるはずだったsteps.txtは作っただけでaddしていない、という状況を作ります。名前とメールアドレスは、この練習リポジトリ内だけに設定する例示値です。リモートへの接続や送信は行いません。
最後のgit status --shortでは?? steps.txtと表示され、steps.txtが未追跡のまま残っていることが分かります。
git init
git config user.name 'Practice'
git config user.email 'practice@example.invalid'
printf 'base\n' > note.txt
git add -- note.txt
git commit -m 'Base file'
printf 'step 1\n' >> note.txt
printf 'check steps\n' > steps.txt
git add -- note.txt
git commit -m 'Add first step'
git status --short直前のコミットを取り消し、残った変更を確かめる
git reset --soft HEAD~1を実行すると、git log --oneline上の先頭はBase fileに戻り、Add first stepは一覧から消えます。note.txtの2行はファイルに残り、step 1の追加はステージ済みのままです。
git reset --soft HEAD~1
git log --oneline
cat note.txt
git status --short
git diff --cached -- note.txt表は横にスクロールできます →
| 取り消し後に見るもの | この練習での結果 |
|---|---|
| git log --oneline | Base fileの1件だけ |
| cat note.txt | baseとstep 1の2行が残る |
| git status --short | note.txtは左列にM、右列は空白(ステージ済み)。steps.txtは?? steps.txt |
| git diff --cached -- note.txt | step 1の1行が追加として出る |
入れ忘れたファイルを足し、同じメッセージでコミットし直す
steps.txtをaddしてから、git commit -C ORIG_HEADでコミットします。resetは実行前のブランチの先頭をORIG_HEADに記録するため、取り消したコミットのメッセージAdd first stepをそのまま使えます。-Cはメッセージに加えて作成者と作成日時も元のコミットから引き継ぎます。メッセージを編集したい場合は-Cの代わりに-cを指定すると、エディターが開きます。
ORIG_HEADは後で別のresetやmergeなどを実行すると書き換わります。取り消しの直後に使ってください。作り直したコミットはnote.txtとsteps.txtの両方を含み、内容が違うため、取り消す前とはコミットIDが変わります。この練習では、git log --onelineが2件、git show --statがnote.txtとsteps.txtの2ファイル、git status --shortが出力なしになります。
git add -- steps.txt
git commit -C ORIG_HEAD
git log --oneline
git show --stat --format=%s HEAD
git status --shortpush済みのコミットには使わない
reset --softもブランチの先頭を1つ前へ戻すため、取り消したコミットを既に受け取ったリモートや他の人の環境とは、履歴が食い違います。Git公式のresetの説明では、コミットを完全に取り消す--hardの例に、他の人へ渡したコミットにはこの操作をしないよう注記があります。push済みのコミットを打ち消す場合は、打ち消し用の新しいコミットを追加するgit revertの説明を参照してください。この記事ではrevertの手順は扱いません。
コミットの前にステージから外す場合は、関連記事「git addを取り消す:編集内容を残してステージから外す手順」を参照してください。
2026年9月28日、WSLのLinux・Git 2.53.0・非rootユーザーで掲載例を実行しました。取り消し後の履歴・作業ファイル・インデックス、作り直したコミットのメッセージと含まれるファイルを照合しています。ホスティングサービスへの送信や実務リポジトリでの動作は、この検証に含みません。