git reset
HEAD の位置を移動し、ステージングエリアや作業ツリーを指定した状態に戻します。主に個人ブランチでの履歴修正に使います。
構文
git reset [mode] <commit> 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 stashやgit 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は絶対に避けましょう。 チームメンバーのリポジトリに深刻な問題を引き起こします。