Stage 2・中級編 ー Lesson 2-5
git で取り消す技術 — restore / reset / amend / revert
段階に応じて使い分ける:restore(編集を捨てる) / amend(直前を直す) / reset(履歴を戻す) / revert(公開後に取り消す)
💡 たとえるなら
セーブを書き直す(amend)、巻き戻す(reset)、上書きせずに「打ち消し」セーブを足す(revert)の使い分け
「やっちゃった」「直前のコミットメッセージ間違えた」「もう公開しちゃったコミットを取り消したい」… Git にはこうした 取り消し系のコマンド が複数あります。それぞれ 対象とするタイミングが違う ので、混乱しがち。このレッスンで一気に整理します。
4つの取り消しを地図で押さえる
迷ったら 「コミット前ならローカル系、push後なら revert」 を覚えておけばだいたいOK。
① restore:作業フォルダの編集を捨てる
「ファイルを書き換えたけど、やっぱり最後のコミット時点に戻したい」とき。
git restore で消した編集は元に戻せません。確信があるときだけ使いましょう。
② restore —staged:add を取り消す
「git add したけど、やっぱりコミットには含めたくない」とき。ファイルの内容は触りません、仮置き場から下ろすだけ。
git status で確認すると、緑(staged)から赤(unstaged)に戻っています。
③ git commit —amend:直前のコミットを書き直す
「コミットメッセージをタイポした」「commit したあとに修正漏れに気づいた」とき。直前のコミットを上書き します。
amend は「コミットIDが変わる」=「歴史が書き換わる」操作。リモートに push 済みだとチームメンバーの履歴と食い違って大事故になります。push 前のローカルコミットだけにしましょう。
④ git reset:コミットを巻き戻す
「直近の数コミットをまるごと取り消したい」とき。3つのモードがあります。
HEAD^ は「直前のコミット」、HEAD^^ は「2つ前」、HEAD~5 は「5つ前」という意味。
| モード | コミット履歴 | 仮置き場 (add) | 作業フォルダ (編集) |
|---|---|---|---|
--soft | 巻き戻る | そのまま残る | そのまま残る |
既定(--mixed) | 巻き戻る | 解除される | そのまま残る |
--hard | 巻き戻る | 消える | 消える(怖い!) |
--hard は本当に消える作業中の編集も全て吹っ飛びます。実行前に必ず
git status で何が消えるか確認しましょう。
reset も 歴史を書き換える ので push 済みコミットには使わないこと。
⑤ git revert:公開後の取り消しはこれ
「もう push しちゃったコミットを取り消したい」とき。これだけは 歴史を書き換えず、「取り消すコミット」を新しく積みます。
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 で行うコマンドも。
普通の rm / mv でも結局 git status 経由で同じことになりますが、git rm / git mv の方が「Git公認の操作」として履歴がきれいに残ります。
やってみよう:5種類の取り消しを順に体験
my_project で、各取り消しを順に試して挙動の違いを体感しましょう。
5種類すべて、「歴史の何を残して、何を消すか」が違う だけ。地図と照らし合わせて、状況に応じて選べるようになります。
このレッスンのまとめ
restore で編集や add を取り消せるcommit --amend で直前のコミットを直せるreset --soft / --hard の違いを理解したrevert を使うgit rm / git mv でファイル操作も履歴に残せる🎉 Stage 2 完走おめでとうございます!
次の Stage 3 — 上級編 では、stash・tag・履歴編集(rebase)・featureブランチ運用など、現場で動けるテクニックを身につけていきます。
✏️ 理解度チェック
各問題、選んだ瞬間に正解と解説が表示されます。気軽に試してください。
- Q1. まだ add していない編集を捨てて、最後のコミット時点に戻すコマンドは?
- Q2. 直前のコミットメッセージを書き直したいときに使うコマンドは?
- Q3. 既にリモートに push 済みのコミットを取り消したい。最も安全な方法は?