【初心者向け】git reset と git restore の違いと使い分けを整理する
はじめに
Gitで「変更を取り消したい」と思ったとき、
git reset
や git restore
というコマンドを使用します。
しかし、
「結局どちらを使えばいいのか?」
「reset
とrestore
の違いがわからない」
と迷ったことがある人も多いのではないでしょうか?
本記事では、初心者の方向けに
git reset
と git restore
の違いと使い分けの考え方を、具体例を交えて整理します。
reset
と restore
の違い
項目 | git reset |
git restore |
---|---|---|
主な用途 | 履歴(HEADやステージ)を巻き戻す | ファイルの状態を元に戻す(復元) |
操作対象 | HEAD(履歴)、インデックス、 作業ツリー(オプションにより) |
インデックス、作業ツリー(ファイル) |
よく使う場面 | 直前または特定のコミットを取り消したいとき | 特定のファイルを以前の状態に戻したいとき |
導入時期 | Gitの初期バージョンから存在 | Git 2.23(比較的新しい) |
安全性 | コマンドによっては 作業内容が完全に失われることもある |
比較的安全だが上書きに注意 |
git reset
:履歴やステージの状態を元に戻すコマンド
git reset
は、コミット履歴やステージングエリアの状態を過去の状態に戻すコマンドです。
使い方によっては非常に強力な操作が可能ですが、その分注意も必要です。
git reset --soft HEAD^
例1:git reset --soft HEAD^
- 最新のコミットだけを 1つ前の状態に戻します
- ステージング(
git add
済み)や作業ツリーの内容は そのまま残ります
git reset --hard HEAD^
例2:git reset --hard HEAD^
- 1つ前のコミット時点の状態に全て戻します
- ステージングや作業中の変更も、全てまとめて消えます(=元に戻せなくなります)
git reset --hard <コミットID>
⚠️ この操作を実行すると、作業内容が完全に失われる可能性があります。
本当に戻したい状態かどうか、慎重に確認してから実行しましょう。
git restore
:ファイルの変更を安全に取り消すためのコマンド
Git 2.23以降で使えるようになった比較的新しいコマンドです。
ファイル単位で「元に戻す」ことができます。
例1:変更を破棄(作業ツリーの復元)
git restore main.py
➡ 作業ツリーの変更を取り消し、最後にコミットされた状態に戻します。
例2:過去のコミット時点のファイルに戻す
git restore --source abc1234 main.py
➡ abc1234
は過去のコミットIDです。このコマンドは、main.py
をその時点の状態に復元します。
✅ 特定のファイルだけを「戻す」目的なら、
restore
の方がコマンドの意味がわかりやすく、安全に使える設計になっています。
状況別:どちらを使えば良いか?
やりたいこと | おすすめ |
---|---|
特定のファイルを以前の状態に戻したい | ✅ git restore
|
HEADや履歴を過去に巻き戻したい | ✅ git reset
|
ステージに追加した内容をやり直したい |
git restore --staged or git reset (どちらも可) |
全て元に戻したい(強制) |
git reset --hard (⚠️要注意) |
混乱しやすいポイント
git checkout
でも変更を戻せるのでは?
はい、git checkout
でもファイルの変更を元に戻すことは可能です。
ただし、現在ではコマンドの役割が明確に分けられており、次のように整理されています。
-
git checkout
:ブランチを切り替えるためのコマンド -
git restore
:作業中のファイルの変更を元に戻すためのコマンド
☝️ 現在は、用途ごとにコマンドを使い分けることが推奨されています。 その方が、意味が明確で誤操作も防ぎやすくなります。
特に、ファイルの変更を戻したいだけの場合はgit restore
を使用するのがおすすめです。
なお、ブランチの切り替えには、git checkout
よりも git switch
を使用することが推奨されています。
詳しくはこちらの記事で解説しています:
👉 git switch と git checkout の違いを解説
おわりに
git reset
と git restore
はどちらも「元に戻す」ためのコマンドですが、
目的と操作対象が大きく異なります。
- 履歴を戻す→
reset
- ファイルを戻す→
restore
と覚えておくと、実務でも使い分けやすくなります。
最初は混乱しやすいですが、使いながら徐々に理解が深まっていくと思います。
本記事が一助になれば幸いです。
🔗 関連記事
- Gitで特定のコミットに強制的に戻す方法と、戻しすぎたときの対処法 ← reset 解説記事
- Gitで特定のファイルだけ過去の状態に戻す方法 ← restore 解説記事
Discussion
ブランチの切り替えは
git switch
に分離されていますね。git checkout
は使わなくても、ほぼ作業できます。ご指摘いただきありがとうございます。
ブランチの切り替えについて、誤解を招く表現になっていたかと思います。
git switch
に関する補足を本文に追記いたしました。ご教示いただきありがとうございました。