git reset

ブランチの先頭を、前のコミットへ戻す。ファイルの扱いは 3 つの形から選ぶ。

実行前の状態

README.md を 1 回コミットしたあと、README.md に 1 行足して 2 回目のコミットをした場面です。まだ push していない 2 回目のコミットを、取り消したいときに打ちます。

この状態を手元で作るなら、次の順に打ちます。

ターミナル

git init -q -b main hello
cd hello
echo "# hello" > README.md
git add README.md
git commit -q -m "README を作る"
echo "start" >> README.md
git commit -q -a -m "README に説明を足す"

最小の例と結果

--soft は、コミットだけを取り消します。HEAD~1 は 1 つ前のコミットを指します。

ターミナル

git reset --soft HEAD~1
git log --oneline
a1b2c3d README を作る

ターミナル

git status -s
M  README.md
  • git reset は、うまくいくと何も表示しません。
  • 履歴から 2 回目のコミットが消えました。
  • M README.md の左の M は、書き足した 1 行がステージに載ったままという意味です。変更そのものは残っています。

reset には、取り消す範囲の違う 3 つの形があります。

書き方消えるもの
--soft履歴のコミットだけが消える。ステージも作業中のファイルも、そのまま残る
--mixed (何も付けないとこれ)履歴のコミットとステージが消える。作業中のファイルは、そのまま残る
--hard履歴のコミットも、ステージも、作業中のファイルの変更も消える

続けて、何も付けない形で打つと、ステージだけが空になります。Unstaged changes after reset の下に出るのは、ステージから下りたファイルです。変更は作業中のファイルに残ります。

ターミナル

git reset
Unstaged changes after reset:
M	README.md

ターミナル

git status -s
 M README.md

最後に --hard を付けると、作業中のファイルの変更まで消えます。

ターミナル

git reset --hard
HEAD is now at a1b2c3d README を作る

ターミナル

cat README.md
# hello

start と書き足した行が、作業中のファイルから消えました。この例では、消えた変更が元のコミットに入っていたので、git reflog で探せば戻せます (戻し方は失敗時の節に書きました)。まだコミットしていない変更だったら、同じ打ち方で消えたあと、通常は戻せません。

成功の確認

git log --oneline で、取り消したコミットが履歴から消えていれば戻っています。git status に変更のファイルが出なければ、作業中のファイルも元のとおりです。

ターミナル

git status
On branch main
nothing to commit, working tree clean

構文と主要オプション

書き方すること
git reset --soft HEAD~1直前のコミットだけを取り消す。変更はステージに残る
git reset HEAD~1直前のコミットとステージを取り消す。変更は作業中のファイルに残る
git reset --hard HEAD~1直前のコミットも、作業中のファイルの変更も消す
git reset <ファイル>そのファイルだけをステージから下ろす。履歴は動かない
git reset --hard <コミットの番号>指定したコミットの時点まで、全部を戻す

失敗時の戻し方

--hard で消えたもの

--hard は、コミットしていない変更を消します。この変更は通常、元に戻せません。add 済みの内容は Git の中に残っていることがあり、git fsck --lost-found で探せる場合がありますが、確実ではありません。add もしていない変更は戻せません。打つ前に git status を見て、変更が残っていないかを確かめます。取っておきたい変更は、先にコミットします。

コミットだけを消したとき

コミットは、reset のあとも少しの間、Git の中に残っています。git reflog で、動かす前の位置の番号を探します。

ターミナル

git reflog
a1b2c3d HEAD@{0}: reset: moving to HEAD~1
9f8e7d6 HEAD@{1}: commit: README に説明を足す
a1b2c3d HEAD@{2}: commit (initial): README を作る

消したコミットの番号 (この例では 9f8e7d6) へ戻します。

ターミナル

git reset --hard 9f8e7d6

もう push したとき

push したコミットを reset で消すと、ほかの人の手元の履歴と食い違います。代わりに、git revert で打ち消すコミットを足します。

よくある疑問

reset と revert はどう使い分けますか

まだ push していないコミットを消すなら reset です。履歴から無くなります。push したコミットを取り消すなら revert です。打ち消すコミットを足すので、ほかの人の履歴と食い違いません。

ステージから下ろしたいだけなら、どれを使いますか

git restore --staged <ファイル> を使います。git reset <ファイル> でも同じことができますが、restore のほうが名前から意味が読めます。

間違えて git reset --hard を打ってしまいました

消えたものがコミット済みの変更なら、git reflog で動かす前の番号を探し、git reset --hard <番号> で戻せます。コミットしていない変更は、通常は戻せません。add 済みの内容だけは、git fsck --lost-found で探せる場合があります。

確かめた Git の版 2.50.1 (Apple Git-155)確認日 2026年10月17日正本は Git 公式マニュアル (英語)

Git コマンド辞典の索引へ戻る