はじめに
Gitを使い始めた頃、すべてが新鮮である一方、コマンドの多さに圧倒されることも少なくありません。例えば、ある日、誤って作業中のファイルを変更してしまい、どうやって元に戻せばいいのか分からずに焦った経験はありませんか?そのような状況で、多くの人が初めに触れるのがcheckout
コマンドです。しかし、Gitの進化と共に、これらの操作がさらに簡単にできるよう、checkout
の役割がrestore
とswitch
に分かれました。
本記事では、その中でも特に、誤った変更を元に戻すためのrestore
コマンドに焦点を当て、その使い方と、類似するreset
コマンドとの違いを詳しく解説していきます。
restoreコマンドの基本
Gitの作業中に、誤って変更したファイルを元に戻したいとき、restore
コマンドが役立ちます。作業ツリーやステージングエリアにあるファイルの変更を、簡単に以前の状態に復元するためのコマンドです。例えば、数時間かけて行った変更が間違いだったと気づいたときでも、このコマンドを使えばすぐに修正できます。
基本的な使い方は次の通りです。
git restore <ファイル名>
このコマンドを使用すると、指定したファイルを前回のコミット時点に戻せます。複数のファイルに対しても同様に操作できます。restore
コマンドは、ミスをリカバリーする際にとても役立ちます。
restoreとresetの比較
restore
とreset
は、いずれも変更を取り消すためのコマンドですが、その目的と作用範囲には大きな違いがあります。ここでは、両者の違いを詳しく掘り下げてみましょう。
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におけるファイル操作を直感的で簡素なものにしました。reset
やcheckout
との違いを理解することで、日常のGit操作がさらにスムーズに進みます。特に、特定のファイルの変更を元に戻したい場合に、このコマンドは非常に有用です。関連するcheckout
とswitch
コマンドについてさらに学びたい方は、Gitのcheckoutとswitchコマンドの比較をご覧ください。
参考資料
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.05.29
Gitで間違ってコミットしたファイルを後から無視する方法 .gitignoreの設定
ここでは、架空のプロジェクト「AwesomeProject」での失敗談を元に、誤って追跡されたファイルを後から管理外にする方法を解説します。
- git
2023.11.26
gitのコミット履歴を整理するためにsquashを使いこなそう
Squashは、複数のコミットを1つのコミットにまとめる操作です。Squashを使用すると、コミットの履歴を整理したり、コミットのメッセージや変更内容を変更したりすることができます。
- インフラエンジニア
- git
2024.05.08
リリース管理に欠かせない!コミットにタグを付ける「git tag」コマンドの使い方
アプリ開発において「Git」は必須スキルとなってきます。Gitの基本コマンドは知っているけど他のコマンドはよく知らない、Gitコマンドをもっと知って便利に使いたい!と思っている方、また特定のコミットに普遍的な目印をつけたい!や、リリースバージョンを管理したい!という方向けに、この記事では「git tag」について解説します。
- git