Gitの取り消し操作には、restore、reset、revert があります。名前が似ていますが、影響する場所と安全性が違います。
一言でいうと
未コミットの変更を戻すならrestore、履歴の位置を動かすならreset、公開済みcommitを打ち消すならrevertを使います。
ざっくり比較
| コマンド | 主な用途 | 安全性 |
|---|---|---|
git restore | 作業中の変更を戻す | 比較的安全だが変更は消える |
git reset | ステージや履歴位置を戻す | 使い方次第で危険 |
git revert | commitを打ち消すcommitを作る | 共有済み履歴で安全 |
git restore
git restore は、作業ツリーやステージの変更を戻すときに使います。
git restore README.md
これは、README.md の未コミット変更を戻します。
ステージから外す場合は次です。
git restore --staged README.md
git reset
git reset は、ステージを戻したり、ブランチの位置を戻したりします。
ステージだけ外す例です。
git reset HEAD README.md
履歴を戻す場合は注意が必要です。
git reset --hard HEAD~1
これは、直前のcommitに戻るだけでなく、作業ツリーの変更も消します。
reset --hard は未保存の作業を失う可能性があるため、初心者は慎重に扱います。
git revert
git revert は、過去のcommitを打ち消す新しいcommitを作ります。
git revert <commit-hash>
共有済みのcommitを取り消す場合は、履歴を書き換えない revert が安全です。
判断表
| やりたいこと | 使う候補 |
|---|---|
| 未コミットのファイル変更を戻す | git restore |
| addしたファイルをステージから外す | git restore --staged |
| 直前のcommitをまだpushしていない状態でやり直す | git reset --soft など |
| push済みcommitを取り消す | git revert |
| 作業を全部消して戻す | 原則避ける。必要なら reset --hard |
よくある誤解
| 誤解 | 実際 |
|---|---|
| 取り消しは全部resetでよい | 目的によりrestore/revertを使い分けます |
| revertは履歴を消す | 打ち消す新しいcommitを作ります |
| reset —hardは安全 | 未コミット変更が消えます |
| push後もresetで戻せばよい | 共有済み履歴を書き換える危険があります |
まとめ
未コミットの変更を戻すなら git restore、ステージや履歴位置を戻すなら git reset、共有済みcommitを安全に打ち消すなら git revert を使います。特に reset --hard は作業を失う可能性があるため、実行前に git status と git diff を確認します。