Git・GitHub・はじめてのコミット

まちがえたときに戻す

「保存したけど元に戻したい」「addを取り消したい」「コミットメッセージを打ちまちがえた」。Gitで戻すやり方は状況ごとに違います。初心者が本当に使う4つだけを、危険度つきで整理しました。

Gitを使う最大の理由が「戻せること」です。ただし戻し方は状況によって違います。ここでは初心者が実際に使う4つだけを、危険度つきで整理します。

どれを使うかの早見表

やりたいことコマンド危険度
編集を捨てて最後のコミットに戻したいgit restore ファイル名高(編集内容が消える)
git addを取り消したいgit restore --staged ファイル名
直前のコミットのメッセージを直したいgit commit --amend
前のコミットの内容を打ち消したいgit revert コミットID

いちばん上だけが「本当に消える」操作です。順番に見ていきます。

1. 編集を捨てる:git restore

「いろいろ試したけれど、やっぱり全部なかったことにしたい」というときです。

git restore style.css

style.cssが、最後にコミットした状態に戻ります。フォルダの中のいくつも直したときは、まとめて戻すこともできます。

git restore .

2. addを取り消す:git restore —staged

「記録する箱に入れたけど、これは今回の記録に含めたくない」というときです。

git restore --staged script.js

--stagedが付くと、箱から降ろすだけで編集内容には手を付けません。安心して使えます。

git statusを打ったとき、Gitの側からこの2つを案内してくれます。

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)   ← 箱から降ろす

Changes not staged for commit:
  (use "git restore <file>..." to discard changes)    ← 編集を捨てる

Gitは、いま使えるコマンドを毎回教えてくれます。困ったらgit status、はここでも効きます。

3. 直前のコミットを直す:git commit —amend

コミットした直後に「メッセージを打ちまちがえた」「1ファイル入れ忘れた」と気づいたときです。

git commit --amend -m "すきなものリストを追加"

直前のコミットが、新しいメッセージで上書きされます。入れ忘れたファイルがあるときは、先にgit addしてから同じコマンドを打てば、そのファイルも直前のコミットに含められます。

4. 前のコミットを打ち消す:git revert

「3つ前のコミットで入れた変更が原因で壊れた」というときです。まずコミットIDを調べます。

git log --oneline
c3d4e5f 送信ボタンの色を変更
b2c3d4e フォームの動きを追加
a1b2c3d ページの骨組みを作った

打ち消したいコミットのIDを指定します。

git revert b2c3d4e

すると、そのコミットの変更を取り消す新しいコミットが積まれます。履歴は消えず、「取り消した」という事実も記録として残る——これが安全な理由です。

git resetは、いまは覚えなくていい

検索するとgit reset --hardという強力なコマンドがよく出てきます。これは履歴ごと巻き戻す操作で、指定をまちがえると作業がまとめて消えます。

初心者のうちは、この記事の4つで足りる場面がほとんどです。reset --hardは「そういう強い道具がある」とだけ覚えて、必要になったときに調べれば十分です。

このレッスンのまとめ

  1. 編集を捨てるのはgit restore——取り消せない操作なので対象をよく確認する
  2. git addの取り消しはgit restore --staged。編集内容は残るので安全
  3. 直前のコミットの直しは--amend(push前のみ)、上げたあとの取り消しはgit revert

よくある質問

編集したファイルを保存前の状態に戻すにはどうしますか?
まだコミットしていない変更ならgit restore ファイル名で、最後にコミットした状態に戻せます。ただし編集内容は完全に消えるので、取り消しの取り消しはできません。
git addを取り消すにはどうしますか?
git restore --staged ファイル名です。記録の箱から降ろすだけで、編集した内容そのものは残ります。
git resetとgit revertの違いは何ですか?
resetは履歴そのものを巻き戻す操作、revertは「取り消したという新しいコミット」を追加する操作です。すでにGitHubへ上げたコミットを取り消すときはrevertが安全です。