🔖

【初心者向け】git reset と git restore の違いと使い分けを整理する

に公開2

はじめに

Gitで「変更を取り消したい」と思ったとき、
git resetgit restore というコマンドを使用します。

しかし、

「結局どちらを使えばいいのか?」
resetrestore の違いがわからない」

と迷ったことがある人も多いのではないでしょうか?

本記事では、初心者の方向けに
git resetgit restore の違いと使い分けの考え方を、具体例を交えて整理します。

resetrestore の違い

項目 git reset git restore
主な用途 履歴(HEADやステージ)を巻き戻す ファイルの状態を元に戻す(復元)
操作対象 HEAD(履歴)、インデックス、
作業ツリー(オプションにより)
インデックス、作業ツリー(ファイル)
よく使う場面 直前または特定のコミットを取り消したいとき 特定のファイルを以前の状態に戻したいとき
導入時期 Gitの初期バージョンから存在 Git 2.23(比較的新しい)
安全性 コマンドによっては
作業内容が完全に失われることもある
比較的安全だが上書きに注意

git reset:履歴やステージの状態を元に戻すコマンド

git reset は、コミット履歴やステージングエリアの状態を過去の状態に戻すコマンドです。
使い方によっては非常に強力な操作が可能ですが、その分注意も必要です。

例1:git reset --soft HEAD^

git reset --soft HEAD^
  • 最新のコミットだけを 1つ前の状態に戻します
  • ステージング(git add 済み)や作業ツリーの内容は そのまま残ります

例2:git reset --hard HEAD^

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 resetgit restore はどちらも「元に戻す」ためのコマンドですが、
目的と操作対象が大きく異なります

  • 履歴を戻す→ reset
  • ファイルを戻す→ restore

と覚えておくと、実務でも使い分けやすくなります。

最初は混乱しやすいですが、使いながら徐々に理解が深まっていくと思います。
本記事が一助になれば幸いです。


🔗 関連記事

Discussion

YuneKichiYuneKichi

ブランチの切り替えはgit switchに分離されていますね。
git checkoutは使わなくても、ほぼ作業できます。

fd2025fd2025

ご指摘いただきありがとうございます。
ブランチの切り替えについて、誤解を招く表現になっていたかと思います。
git switch に関する補足を本文に追記いたしました。
ご教示いただきありがとうございました。