ガイド

restore と reset の違い・使い分け

git restore と git reset は似ているようで目的が異なります。それぞれの役割と使い分けを解説

restore と reset の違い・使い分け diagram

根本的な違い

restore は「ファイルの状態を戻す」コマンドで、作業ディレクトリやステージングエリアのファイルを元に戻します。

reset は「HEAD(コミット履歴)を動かす」コマンドで、コミット自体を取り消したり、ブランチの先端を移動させます。

restore はファイルレベルの操作、reset はコミットレベルの操作と覚えましょう。

ステージングの取り消し

git add でステージした変更を取り消す場合、restore --staged と reset HEAD のどちらも使えます。

ただし restore --staged はファイル指定が必須で「ファイルのステージを外す」という意図が明確です。

reset HEAD はファイル指定なしで使うとすべてのステージが外れます。

Git 2.23 以降は restore --staged の使用が推奨されています。

bash
# ステージの取り消し(推奨: restore)
git restore --staged file.txt

# ステージの取り消し(従来の方法: reset)
git reset HEAD file.txt

# 全ファイルのステージを外す
git restore --staged .
git reset HEAD  # 同じ効果

作業ディレクトリの変更を元に戻す

編集中のファイルを最後のコミット状態に戻すには restore を使います。

reset ではこの操作はできません(reset --hard は全ファイルが対象になり、かつコミットも巻き戻します)。

restore は「特定ファイルだけ元に戻す」安全な操作です。

bash
# 特定ファイルの変更を破棄(restore)
git restore file.txt

# 全ファイルの変更を破棄(restore)
git restore .

# 注意: reset --hard は全ファイル + コミットも巻き戻す
git reset --hard HEAD  # ステージ + 作業ディレクトリ全てをリセット

コミットの取り消し

コミット自体を取り消したい場合は reset の出番です。

restore にはコミットを操作する機能はありません。

--soft でコミットだけ取り消し、--mixed でコミット+ステージを取り消し、--hard で全てを破棄します。

bash
# コミットを取り消す(reset のみ可能)
git reset --soft HEAD~1   # コミットだけ取り消し
git reset --mixed HEAD~1  # コミット+ステージ取り消し
git reset --hard HEAD~1   # 全て破棄

# restore ではコミットの取り消しはできない

注意点

  • プッシュ済みのコミット取り消しには git revert を使う

    reset は履歴を書き換えるため、プッシュ済みのコミットに対して使うと force push が必要になり、チーム全体に影響します。プッシュ済みのコミットを取り消す場合は、履歴を壊さない git revert を使いましょう。reset はまだプッシュしていないローカルのコミットに限定して使うのが安全です。

  • --hard は基本的に使わない

    --hard は未コミットの変更を完全に破棄します。一度消えた変更は復元できません。「一時的に不要」な変更は git stash で退避し、本当に不要だと確信してから git stash drop で消すほうが安全です。

  • restore で事足りないか確認する

    ファイルの変更を元に戻したいだけなら restore で十分です。reset を使う前に「本当にコミットレベルの操作が必要か」を考えましょう。

使い分けのまとめ

判断基準はシンプルです。

「ファイルを元に戻したい」→ restore。

「コミットを取り消したい」→ reset。

迷ったら restore を使えば安全です。

restore は作業ディレクトリやステージにしか影響せず、コミット履歴を壊すことがありません。

関連コマンド