1. ホーム
  2. 記事一覧
  3. Gitのrestoreを使ってファイルを元に戻そう!簡単ガイドとresetとの違い

2024.08.24

Gitのrestoreを使ってファイルを元に戻そう!簡単ガイドとresetとの違い

はじめに

Gitを使い始めた頃、すべてが新鮮である一方、コマンドの多さに圧倒されることも少なくありません。例えば、ある日、誤って作業中のファイルを変更してしまい、どうやって元に戻せばいいのか分からずに焦った経験はありませんか?そのような状況で、多くの人が初めに触れるのがcheckoutコマンドです。しかし、Gitの進化と共に、これらの操作がさらに簡単にできるよう、checkoutの役割がrestoreswitchに分かれました。

本記事では、その中でも特に、誤った変更を元に戻すためのrestoreコマンドに焦点を当て、その使い方と、類似するresetコマンドとの違いを詳しく解説していきます。

restoreコマンドの基本

Gitの作業中に、誤って変更したファイルを元に戻したいとき、restoreコマンドが役立ちます。作業ツリーやステージングエリアにあるファイルの変更を、簡単に以前の状態に復元するためのコマンドです。例えば、数時間かけて行った変更が間違いだったと気づいたときでも、このコマンドを使えばすぐに修正できます。

基本的な使い方は次の通りです。

git restore <ファイル名>

このコマンドを使用すると、指定したファイルを前回のコミット時点に戻せます。複数のファイルに対しても同様に操作できます。restoreコマンドは、ミスをリカバリーする際にとても役立ちます。

restoreとresetの比較

restoreresetは、いずれも変更を取り消すためのコマンドですが、その目的と作用範囲には大きな違いがあります。ここでは、両者の違いを詳しく掘り下げてみましょう。

resetコマンドの特徴

resetは、特定のコミットまでプロジェクトの状態を巻き戻す強力なコマンドです。特に、ステージングエリアやHEADの位置をリセットするために使用され、通常は広範な影響をプロジェクトに及ぼします。たとえば、次のように使います。

git reset --hard <コミットID>

このコマンドは、指定したコミットIDの状態まで作業ツリーとステージングエリアを完全にリセットします。つまり、すべての未保存の変更が消去され、HEADが指定したコミットに移動します。

restoreコマンドの特徴

一方、restoreコマンドは、個別のファイルやディレクトリに限定した操作を行うために設計されています。resetがプロジェクト全体に影響を与えるのに対し、restoreはより細かな制御が可能です。特定のファイルだけを前回のコミットに戻したい場合に非常に有用です。

たとえば、次のように使います。

git restore <ファイル名>

このコマンドは、指定したファイルを元のコミット時点に戻し、他のファイルには影響を与えません。

使い分けのポイント

resetは、プロジェクト全体の状態を巻き戻す際に使用し、restoreは、特定のファイルだけを元に戻す際に使用します。用途に応じてこれらのコマンドを使い分けることで、より効果的にGitの管理が行えるようになります。

restoreとcheckoutの関係

Gitの初期バージョンでは、checkoutコマンドがブランチの切り替えやファイルの復元といった複数の役割を担っていました。この多機能さは便利である反面、特に初心者にとっては操作ミスを引き起こす原因にもなり得ました。意図せずブランチが切り替わったり、ファイルが上書きされたりすることがしばしば発生していたのです。

これらの問題に対処するため、Gitの開発者はcheckoutの機能を専用コマンドに分割しました。ブランチ切り替え専用のswitchコマンドと、ファイル復元専用のrestoreコマンドがその結果として登場しました。

checkoutの役割と分割の背景

元々、checkoutコマンドは以下のような複数の機能を持っていました。

  • ブランチの切り替え: git checkout <ブランチ名> でブランチを変更する
  • ファイルの復元: git checkout -- <ファイル名> で特定ファイルを復元する

このように一つのコマンドに多くの役割が集中していたため、操作が複雑になり、特に大規模プロジェクトではミスがプロジェクト全体に悪影響を及ぼす可能性がありました。

switchとrestoreへの分割

Git 2.23以降、これらの操作が専用コマンドに分割されました。ブランチの切り替えにはswitchが、ファイルの復元にはrestoreが使われるようになったことで、操作が直感的かつ明確になり、ミスのリスクが減少しました。

  • switch: ブランチの切り替えに特化したコマンド
    • git switch <ブランチ名>
  • restore: ファイル復元に特化したコマンド
    • git restore <ファイル名>

専用コマンドの導入によって、Gitの操作がより分かりやすくなり、初心者でも安心して使えるようになりました。それぞれのコマンドが特定の役割を担うことで、安全で効率的なバージョン管理が可能になっています。

restoreの応用例

restoreコマンドは、誤って行った変更を取り消すためだけでなく、実務上でも非常に役立つ場面があります。たとえば、チームで作業しているときに、ステージングエリアに追加した変更が間違っていた場合、その変更を取り消すことができます。これにより、間違ったコードがコミットされるのを防ぐことができます。

ステージングエリアの変更を取り消す

ステージングエリアに変更を追加したものの、その変更が間違っていた場合、以下のコマンドで変更を取り消せます。

git restore --staged <ファイル名>

このコマンドを実行すると、ステージングエリアからそのファイルが削除され、作業ツリーには影響を与えずに変更を元に戻せます。例えば、テスト用の一時的な変更をステージングエリアに追加してしまった場合、作業ツリーをそのままにして変更を取り消すことができます。

実務での具体例

例1: プルリクエスト(PR)を送る前に、ステージングエリアに追加した変更を確認している際、間違ったファイルが含まれていることに気づいた場合、restoreコマンドを使ってそのファイルのみをステージングから外すことができます。この操作により、PRに含まれるコードが正確で、不要な変更を含まない状態に保つことができます。

例2: 大規模なリファクタリングを行っている際、複数のファイルにわたる変更を一部だけコミットしたいときに、restoreコマンドを使って不要なファイルをステージングエリアから除外することで、選択的にコミットが可能になります。これにより、作業の一貫性を保ちながら段階的に変更を進めることができます。

応用テクニック

複数のファイルを同時に扱う場合、リストを使って一括でステージングエリアから外すことも可能です。

git restore --staged <ファイル名1> <ファイル名2>

こうした操作は、複数の関連ファイルに対する変更を選択的に管理

することが可能です。特に大規模なプロジェクトでは、個別に操作するよりも効率的で、ミスを防ぐのに効果的です。

restoreコマンドを適切に活用することで、コードレビューやコミットの精度が向上し、チーム全体の生産性を高めることができます。

まとめ

restoreコマンドは、Gitにおけるファイル操作を直感的で簡素なものにしました。resetcheckoutとの違いを理解することで、日常のGit操作がさらにスムーズに進みます。特に、特定のファイルの変更を元に戻したい場合に、このコマンドは非常に有用です。関連するcheckoutswitchコマンドについてさらに学びたい方は、Gitのcheckoutとswitchコマンドの比較をご覧ください。

参考資料

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事