Stage 2・中級編 ー Lesson 2-5

git で取り消す技術 — restore / reset / amend / revert

段階に応じて使い分ける:restore(編集を捨てる) / amend(直前を直す) / reset(履歴を戻す) / revert(公開後に取り消す)

💡 たとえるなら

セーブを書き直す(amend)、巻き戻す(reset)、上書きせずに「打ち消し」セーブを足す(revert)の使い分け

「やっちゃった」「直前のコミットメッセージ間違えた」「もう公開しちゃったコミットを取り消したい」… Git にはこうした 取り消し系のコマンド が複数あります。それぞれ 対象とするタイミングが違う ので、混乱しがち。このレッスンで一気に整理します。

4つの取り消しを地図で押さえる

作業フォルダ 編集中 仮置き場 add 済み コミット履歴 ローカル リモート push 後 restore 編集を捨てる restore --staged add を取り消す amend / reset コミットを書き直す/巻き戻す revert 打ち消しコミット → 取り消したい段階に応じて使い分ける

迷ったら 「コミット前ならローカル系、push後なら revert」 を覚えておけばだいたいOK。

① restore:作業フォルダの編集を捨てる

「ファイルを書き換えたけど、やっぱり最後のコミット時点に戻したい」とき。

# memo.txt の編集を捨てて最後のコミット状態に戻す
$ git restore memo.txt
⚠️ 編集は完全に消える
git restore で消した編集は元に戻せません。確信があるときだけ使いましょう。

② restore —staged:add を取り消す

git add したけど、やっぱりコミットには含めたくない」とき。ファイルの内容は触りません、仮置き場から下ろすだけ。

# memo.txt を仮置き場から下ろす
$ git restore --staged memo.txt

git status で確認すると、緑(staged)から赤(unstaged)に戻っています。

③ git commit —amend:直前のコミットを書き直す

「コミットメッセージをタイポした」「commit したあとに修正漏れに気づいた」とき。直前のコミットを上書き します。

# メッセージだけ直す
$ git commit --amend -m "正しいメッセージ"
# ファイルの修正漏れを足してから直す
$ git add forgot.txt
$ git commit --amend --no-edit
# --no-edit はメッセージはそのまま、内容だけ追加する意味
⚠️ push 済みのコミットは amend しない
amend は「コミットIDが変わる」=「歴史が書き換わる」操作。リモートに push 済みだとチームメンバーの履歴と食い違って大事故になります。push 前のローカルコミットだけにしましょう。

④ git reset:コミットを巻き戻す

「直近の数コミットをまるごと取り消したい」とき。3つのモードがあります。

# 直前1個のコミットを取り消す(編集は作業フォルダに残す)
$ git reset HEAD^
# さらに add も解除
$ git reset --soft HEAD^
# 編集すらもなかったことにする(強烈!)
$ git reset --hard HEAD^

HEAD^ は「直前のコミット」、HEAD^^ は「2つ前」、HEAD~5 は「5つ前」という意味。

モードコミット履歴仮置き場 (add)作業フォルダ (編集)
--soft巻き戻るそのまま残るそのまま残る
既定(--mixed巻き戻る解除されるそのまま残る
--hard巻き戻る消える消える(怖い!)
⚠️ --hard は本当に消える
作業中の編集も全て吹っ飛びます。実行前に必ず git status で何が消えるか確認しましょう。

reset歴史を書き換える ので push 済みコミットには使わないこと。

⑤ git revert:公開後の取り消しはこれ

「もう push しちゃったコミットを取り消したい」とき。これだけは 歴史を書き換えず、「取り消すコミット」を新しく積みます。

# コミットID a1b2c3d を取り消すコミットを作る
$ git revert a1b2c3d
[main x9y8z7w] Revert "問題のあった機能を追加"
A B C ¬C 問題のコミット 取り消しコミット C は履歴に残しつつ、その変更を打ち消す ¬C を積む

revert は履歴を残したまま「取り消し」を表現するので、チームに迷惑をかけずに公開済みコミットをやり直せます。

使い分けチートシート

状況コマンド
ファイルの編集を捨てたい(add前)git restore <file>
add を取り消したい(コミット前)git restore --staged <file>
直前のコミットメッセージを直したいgit commit --amend -m "..."
直前のコミットに修正漏れを追加したいgit add ...git commit --amend --no-edit
直近のコミットを巻き戻したい(変更は残す)git reset HEAD^
直近のコミットも変更も全消しgit reset --hard HEAD^
push 済みのコミットを取り消したいgit revert <commit>

ファイル名変更・削除:rm と mv

ついでに、ファイル操作系を Git で行うコマンドも。

# ファイルを削除して、削除を add まで一気に
$ git rm old.txt
# ファイル名を変更(リネームを履歴に残す)
$ git mv old.txt new.txt

普通の rm / mv でも結局 git status 経由で同じことになりますが、git rm / git mv の方が「Git公認の操作」として履歴がきれいに残ります。

やってみよう:5種類の取り消しを順に体験

my_project で、各取り消しを順に試して挙動の違いを体感しましょう。

# ① restore:編集を捨てる
$ echo "間違って書いた" >> memo.txt
$ git status
  modified: memo.txt
$ git restore memo.txt
$ git status
nothing to commit, working tree clean ← 戻った!
# ② restore --staged:add を取り消す
$ echo "本当に追加" >> memo.txt
$ git add memo.txt
$ git restore --staged memo.txt
# add は取り消されたけど、編集は残ってる
$ git status
  modified: memo.txt(赤)
# ③ commit --amend:直前のコミットメッセージを直す
$ git add memo.txt
$ git commit -m "メモ追記"
$ git commit --amend -m "メモに本文を追記"
$ git log -1 --oneline
x9y8z7w メモに本文を追記 ← メッセージが変わった
# ④ reset HEAD^:直前コミットを巻き戻す(編集は残す)
$ git reset HEAD^
$ git status
  modified: memo.txt(赤) ← コミットは消えたが編集は手元に残る
# ⑤ revert:取り消すコミットを積む
$ git restore memo.txt && git add memo.txt && git commit -m "メモ追記"
$ git revert HEAD --no-edit
$ git log --oneline -3
a1b2c3d Revert "メモ追記" ← 打ち消しコミットが新しく追加
e4f5g6h メモ追記

5種類すべて、「歴史の何を残して、何を消すか」が違う だけ。地図と照らし合わせて、状況に応じて選べるようになります。

このレッスンのまとめ

できるようになったこと
restore で編集や add を取り消せる
commit --amend で直前のコミットを直せる
reset --soft / --hard の違いを理解した
push 済みのコミットには revert を使う
git rm / git mv でファイル操作も履歴に残せる

🎉 Stage 2 完走おめでとうございます!

日常のGitで詰まらなくなりました 👏
ブランチを切って統合し、間違えても安全に取り消せる—これでチーム開発の入り口に立てました。
次の Stage 3 — 上級編 では、stash・tag・履歴編集(rebase)・featureブランチ運用など、現場で動けるテクニックを身につけていきます。

✏️ 理解度チェック

0 / 3 正解

各問題、選んだ瞬間に正解と解説が表示されます。気軽に試してください。

  1. Q1. まだ add していない編集を捨てて、最後のコミット時点に戻すコマンドは?
  2. Q2. 直前のコミットメッセージを書き直したいときに使うコマンドは?
  3. Q3. 既にリモートに push 済みのコミットを取り消したい。最も安全な方法は?

© 2026 git-ready-easy — プログラミング未経験でもわかる git 入門