変更を元に戻す
git restore を使って、間違えた変更を取り消す方法を学びましょう。
間違えても大丈夫
コードを書いていると「あ、やっちゃった」という場面は割とあります。(特に疲れているときとか)
- 動いていたコードを壊してしまった
- 余計なファイルをステージしてしまった
- さっきの状態に戻したい
Git を使っていれば、こうした「うっかり」を簡単に取り消せます。このレッスンでは git restore コマンドを使って、変更を元に戻す方法を実践します。
git restore は コミットしていない変更 を取り消すコマンドです。すでにコミットした変更を取り消す方法(git revert など)はこのコースでは扱いません。
コミット前の変更を安全に戻す方法に絞って学びます。
ワーキングツリーの変更を取り消す
ファイルを壊してみる
まず、意図的に index.html を壊してみましょう。<body> の中身をすべて消して、以下のように書き換えてください。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>自己紹介</title>
</head>
<body>
<h1>壊れました!!!</h1>
</body>
</html>保存したら git status で確認します。
git status
index.html が modified(変更あり)と表示されています。よく見ると Git が親切に use "git restore <file>..." to discard changes と教えてくれています。
git diff でどれくらい壊れたか見てみましょう。
git diff
赤い-行が消えた部分、緑の+ 行が追加された部分です。せっかくのプロフィールが消えてしまいました。
git restore で元に戻す
git restore で最後にコミットした状態に戻してみましょう。
git restore index.htmlgit status で確認しましょう。
On branch main
nothing to commit, working tree clean「変更なし」に戻りました。index.html を開いてみてください。プロフィール情報がきちんと復活しているはずです。
git restore は最後のコミットの状態に戻すコマンドです。まだコミットしていない変更はすべて消えてしまいます。
取り消した変更は元に戻せないので、本当に戻していいか確認してから実行しましょう。迷ったときは先に git diff で差分を確認するのがおすすめです。
厳密には、git restore はステージ(インデックス)の内容でワーキングツリーを復元します。ステージに何も追加していなければステージは最後のコミットと同じ内容なので、結果的に「最後のコミットに戻る」動作になります。
しかし、もし git add でステージに変更を追加した後に git restore を実行すると、最後のコミットではなくステージの状態に戻ります。
このレッスンではステージしていない変更を取り消すケースだけを扱っているので、「最後のコミットに戻る」という理解で問題ありません。
復習: ワーキングツリーとは、実際にファイルを編集する作業場所のことです。
詳しくは Git の仕組み を確認してください。
ステージした変更を取り消す
次は「git add でステージまでしてしまったけど、やっぱりやめたい」というケースを体験します。
変更をステージしてしまう
index.html にうっかり不要な行を追加してしまったとします。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>自己紹介</title>
</head>
<body>
<h1>自己紹介</h1>
<p>名前: あなたの名前</p>
<p>テスト中です。あとで消します。</p>
<h2>プロフィール</h2>
<ul>
<li>好きな食べ物: ラーメン</li>
<li>住んでいるところ: 東京</li>
<li>ひとこと: よろしくお願いします!</li>
</ul>
</body>
</html>そして、うっかりステージまでしてしまいます。
git add index.htmlgit status で確認します。

Changes to be committed に入ってしまいました。このままコミットすると「テスト中です」が履歴に残ってしまいます。
git restore --staged でステージを取り消す
--staged オプションを付けると、ステージだけを取り消しできます。
git restore --staged index.htmlgit status
ファイルが Changes not staged for commit に戻りました。ステージから降ろされた状態です。
ここが大事なポイントです。git restore --staged は ステージを取り消すだけ で、ファイルの中身は変わりません。
「テスト中です」の行はまだファイルに残っています。
ファイルの中身も元に戻す
ステージの取り消しに続いて、ワーキングツリーの変更も取り消しましょう。
git restore index.htmlgit statusOn branch main
nothing to commit, working tree cleanきれいに元通りになりました。
まとめ: 2つの restore を使い分ける
同じrestoreコマンドですがオプションの有無によって、自分の作業内容が無かったことにもなり得ます。
| コマンド | 取り消す対象 | ファイルの中身 |
|---|---|---|
git restore ファイル名 | ワーキングツリーの変更 | 最後のコミットの状態に戻る(編集が消える) |
git restore --staged ファイル名 | ステージへの追加 | 変わらない(編集はそのまま残る) |
git restore は Git 2.23 で導入された比較的新しいコマンドです。それ以前は git checkout -- ファイル名 がワーキングツリーの取り消し、git reset HEAD ファイル名 がステージの取り消しに使われていました。
古い記事やドキュメントでは git checkout や git reset が出てくることがありますが、git restore のほうが目的が明確でわかりやすいため、こちらを使うのがおすすめです。
このレッスンのまとめ
git restore ファイル名でワーキングツリーの変更を取り消せるgit restore --staged ファイル名でステージを取り消せるgit restoreは コミット前の変更 に使うコマンド- 間違えても Git があれば安心して元に戻せる
次のステップ
次のレッスンでは、のリポジトリを GitHub に公開します。からへ!