症状

git reset でコミットを取り消したいが、--soft--hard のどちらを使うべきかわからない

結論:まずこれを確認

  • 変更を残してコミットだけ取り消すgit reset --soft
  • 変更も含めて完全に元に戻すgit reset --hard(⚠️ データ消失の可能性あり)
  • 迷ったら --soft を使う(安全)

操作フロー

    flowchart TD
    A[コミットを取り消したい] --> B{変更内容を残す?}
    B -->|残す| C[git reset --soft]
    B -->|消す| D{本当に消していい?}
    D -->|はい| E[git reset --hard]
    D -->|いいえ| C
    C --> F[変更がステージング状態に戻る]
    E --> G[⚠️ 変更が完全に消える]
    F --> H[git status で確認]
    G --> H
  

よくある原因

  • コミットメッセージを間違えた--soft で取り消して再コミット
  • コミットに含めるファイルを間違えた--soft で取り消してやり直し
  • 作業を完全にやり直したい--hard で指定位置まで戻す
  • 複数のコミットを1つにまとめたい--soft で取り消してまとめてコミット
  • 間違ったブランチにコミットした--soft で取り消し、正しいブランチで再コミット
  • 実験的な変更を完全に破棄したい--hard で戻す

操作手順

ステップ1: 現在の状態を確認する

    git status
git log --oneline -5
  

🔍 チェックポイント: 取り消したいコミットのハッシュ値を確認する

ステップ2: resetオプションの違いを理解する

オプション ステージング 作業ディレクトリ 用途
--soft 残る 残る コミットだけ取り消す
--mixed 消える 残る デフォルト動作
--hard 消える 消える 完全に戻す

ステップ3a: –soft でコミットを取り消す(変更を残す)

直前のコミットを取り消す場合:

    git reset --soft HEAD~1
  

特定のコミットまで戻す場合:

    git reset --soft <コミットハッシュ>
  

🔍 チェックポイント: git status で変更がステージング状態(緑色)になっていることを確認

    git status
# Changes to be committed: と表示される
  

ステップ3b: –hard でコミットを取り消す(変更も消す)

⚠️ 警告: このコマンドは変更を完全に消去する。実行前に本当に必要か確認すること。

    # 実行前に必ず確認
git stash  # 念のため退避(任意)

# 直前のコミットと変更を完全に消す
git reset --hard HEAD~1
  

🔍 チェックポイント: git status で「nothing to commit, working tree clean」と表示される

ステップ4: 結果を確認する

    git log --oneline -5
git status
  

NG行動(やってはいけないこと)

  • 確認せずに --hard を実行する → 変更が完全に消え、復旧が困難
  • push済みのコミットに対して reset する → 他の人の作業に影響する
  • --hard 後に「やっぱり戻したい」となるgit reflog で救出可能だが複雑
  • 共有ブランチで force push する → チームの作業が壊れる

よくある質問(FAQ)

Q1: –hard で消した変更は復旧できる?

A: git reflog でコミットハッシュを探し、git reset --hard <ハッシュ> で戻せる可能性がある。ただし、一度もコミットしていない変更は復旧できない。

    git reflog
# 戻りたい地点のハッシュを探す
git reset --hard <ハッシュ>
  

Q2: –mixed は –soft とどう違う?

A: --mixed(デフォルト)は変更を作業ディレクトリに残すが、ステージングは解除する。--soft は変更をステージング状態のまま残す。

    # これらは同じ動作
git reset HEAD~1
git reset --mixed HEAD~1
  

Q3: push済みのコミットを取り消したい場合は?

A: git revert を使う。reset ではなく、取り消すコミットを打ち消す新しいコミットを作成する。

    git revert <コミットハッシュ>
  

関連するトラブル

準備中

解決しない場合

  • 公式ドキュメント: git-reset
  • 確認すべきログ: git reflog で操作履歴を確認
  • 次に調べるキーワード: 「git reflog 復旧」「git revert 使い方」「git reset 取り消し」