症状
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 取り消し」