restore と reset の違い・使い分け
git restore と git reset は似ているようで目的が異なります。それぞれの役割と使い分けを解説
根本的な違い
restore は「ファイルの状態を戻す」コマンドで、作業ディレクトリやステージングエリアのファイルを元に戻します。
reset は「HEAD(コミット履歴)を動かす」コマンドで、コミット自体を取り消したり、ブランチの先端を移動させます。
restore はファイルレベルの操作、reset はコミットレベルの操作と覚えましょう。
ステージングの取り消し
git add でステージした変更を取り消す場合、restore --staged と reset HEAD のどちらも使えます。
ただし restore --staged はファイル指定が必須で「ファイルのステージを外す」という意図が明確です。
reset HEAD はファイル指定なしで使うとすべてのステージが外れます。
Git 2.23 以降は restore --staged の使用が推奨されています。
# ステージの取り消し(推奨: restore)
git restore --staged file.txt
# ステージの取り消し(従来の方法: reset)
git reset HEAD file.txt
# 全ファイルのステージを外す
git restore --staged .
git reset HEAD # 同じ効果作業ディレクトリの変更を元に戻す
編集中のファイルを最後のコミット状態に戻すには restore を使います。
reset ではこの操作はできません(reset --hard は全ファイルが対象になり、かつコミットも巻き戻します)。
restore は「特定ファイルだけ元に戻す」安全な操作です。
# 特定ファイルの変更を破棄(restore)
git restore file.txt
# 全ファイルの変更を破棄(restore)
git restore .
# 注意: reset --hard は全ファイル + コミットも巻き戻す
git reset --hard HEAD # ステージ + 作業ディレクトリ全てをリセットコミットの取り消し
コミット自体を取り消したい場合は reset の出番です。
restore にはコミットを操作する機能はありません。
--soft でコミットだけ取り消し、--mixed でコミット+ステージを取り消し、--hard で全てを破棄します。
# コミットを取り消す(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 は作業ディレクトリやステージにしか影響せず、コミット履歴を壊すことがありません。
Git Ready