Git - 直前の コミット を 取り消す

誤って git commit してしまった場合、git reset コマンドでコミット前の状態に戻すことができます。

コミット を 取り消すコマンド

直前のコミットを取り消し、git add された状態に戻す
git reset --soft HEAD^

直前のコミットを取り消し、変更内容もすべて元に戻す

git reset --hard HEAD^

誤って git reset --hard HEAD^ してしまった場合

git reflog コマンドと git reset コマンドを使用すると元に戻すことができます。
  1. 失敗したときに元に戻せるよう、該当のフォルダをコピーしておきます。
  2. git reflog コマンドを実行し、戻したい地点のハッシュ値を調べます。
    $git reflog
    66708b4 (HEAD -> main) HEAD@{0}: reset: moving to HEAD^
    b1a99c2 HEAD@{1}: commit: commit-2
    66708b4 (HEAD -> main) HEAD@{2}: commit (initial): commit-1
    
    • 1行目: git reflog コマンドを実行しています。
    • 2行目: 間違って実行した git reset --hard のログです。
    • 3行目: 消してしまった コミットです。この地点に戻したいので、このハッシュを使用します。
  3. git reset コマンドを実行し、コミットを復元します。

    git reset に渡す ハッシュ値に誤りが無ければ、この操作で git reset --hard 前の状態に戻ります。

    $git reset b1a99c2
    Unstaged changes after reset:
    D       test2.txt
    
    • 1行目: git reflog で調べたハッシュ値を指定し、 git reset を実行しています。

コミットの取り消し例 (git reset --soft HEAD^)

git reset --soft
$git log --oneline
6c9ebdb (HEAD -> main) commit-2
5c3fc00 commit-1

$git reset --soft HEAD^

$git log --oneline
5c3fc00 (HEAD -> main) commit-1

$git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   test2.txt

コミットの取り消し例 (git reset --hard HEAD^)

git reset --hard
$git log --oneline
01c24f2 (HEAD -> main) commit-2
ebc964a commit-1

$git reset --hard HEAD^
HEAD is now at ebc964a commit-1

$git log --oneline
ebc964a (HEAD -> main) commit-1

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

git reset --hard HEAD^ の取り消し例

git reset
$git log --oneline
ebc964a (HEAD -> main) commit-1

$git reflog
ebc964a (HEAD -> main) HEAD@{0}: reset: moving to HEAD^
01c24f2 HEAD@{1}: commit: commit-2
ebc964a (HEAD -> main) HEAD@{2}: commit (initial): commit-1

$git reset 01c24f2
Unstaged changes after reset:
D       test2.txt

$git log --oneline
01c24f2 (HEAD -> main) commit-2
ebc964a commit-1

検証環境

関連ページ