取り消し

git reset

HEAD の位置を移動し、ステージングエリアや作業ツリーを指定した状態に戻します。主に個人ブランチでの履歴修正に使います。

構文 git reset [mode] <commit>

オプション

フラグ 説明
--soft HEAD の位置だけを移動します。ステージングエリアと作業ツリーはそのまま保持します。
--mixed HEAD を移動しステージングエリアをリセットします(デフォルト)。作業ツリーの変更は保持します。
--hard HEAD・ステージングエリア・作業ツリーをすべてリセットします。変更内容は完全に失われます。
--keep HEAD を移動しますが、作業ツリーのローカル変更(未コミット)が保持できない場合は失敗します。
-p, --patch インデックスに含まれる変更を部分的に選択してリセットします。

git reset は、現在のブランチの HEAD が指すコミットを変更するコマンドです。オプションにより、ステージングエリアや作業ツリーへの影響が変わります。

3つのモードの違い

モードHEADステージング作業ツリー
--soft移動するそのままそのまま
--mixed(省略時)移動するリセットそのまま
--hard移動するリセットリセット

—soft:コミットだけを取り消す

# 直前のコミットを取り消すが、変更内容はステージングに残す
git reset --soft HEAD~1

# 使いどころ:コミットメッセージを間違えたとき
git reset --soft HEAD~1
git commit -m "正しいコミットメッセージ"

—mixed:ステージングも取り消す(デフォルト)

# 直前のコミットを取り消し、ステージングも解除する
git reset HEAD~1
# または
git reset --mixed HEAD~1

# 使いどころ:git add の取り消し
git reset HEAD README.md    # 特定ファイルのステージング解除

—hard:完全にリセットする

# 直前のコミットを取り消し、変更内容もすべて削除する
git reset --hard HEAD~1

# リモートの状態に完全に戻す(ローカルの変更をすべて捨てる)
git reset --hard origin/main

警告: --hard で失われた変更は git reflog を使わない限り復元できません。実行前に git stashgit diff で変更内容を確認することを強く推奨します。

ステージングの取り消し

# 特定ファイルのステージングを取り消す(--mixed の省略形)
git reset HEAD src/index.js

# すべてのステージングを取り消す
git reset HEAD

git revert との使い分け

ブランチの種類推奨コマンド理由
個人ブランチ(未プッシュ)git reset履歴を綺麗に修正できる
個人ブランチ(プッシュ済み)要注意force push が必要になる
共有ブランチ(main など)git revert履歴を書き換えないため安全

共有ブランチへの git reset + git push --force は絶対に避けましょう。 チームメンバーのリポジトリに深刻な問題を引き起こします。