Gitで作業を安全に巻き戻す!初心者でも迷わない変更取り消し完全ガイド
こんにちは、とまだです。
「あ、このファイル編集しちゃいけなかった!」
「テストコード消すの忘れてコミットしちゃった...」
Gitを使っていると、こんな「やっちゃった」瞬間って誰でもありますよね。
でも大丈夫です。
Gitには変更を取り消す方法がちゃんと用意されています。
ただし、使い方を間違えると大切なコードが消えてしまうことも...。
今回は、Gitの変更取り消しを「間違いノート」に例えながら、安全で確実な方法を解説します。
Gitの変更取り消しとは?間違いノートで理解する基本
Gitの変更取り消しって、日常生活でいうと「間違いノート」みたいなものです。
- 鉛筆書き = ワークツリーの変更(消しゴムで消せる)
- ボールペン書き = ステージングした変更(修正テープが必要)
- 提出した宿題 = コミットした変更(訂正版を作るか、先生に相談)
それぞれのレベルで取り消し方が違うんです。
なぜ変更取り消しが重要なのか
プログラミングって、試行錯誤の連続です。
「この方法でやってみよう」→「うまくいかなかった」→「元に戻したい」
この流れを安全に行えるのが、Gitの変更取り消し機能です。
ただし、取り消し方を間違えると...
# 危険!全ての変更が消える
git reset --hard HEAD
こんなコマンドを安易に実行すると、今日の作業が全部パーになることも。
だからこそ、正しい知識が必要なんです。
ワークツリーの変更を取り消す:消しゴムで消す感覚
まずは一番簡単な「まだ保存していない変更」の取り消しから。
git restore:現代的な取り消し方法
最新のGitではgit restore
コマンドが推奨されています。
# 特定ファイルの変更を取り消す
git restore ファイル名.txt
# すべての変更を取り消す(慎重に!)
git restore .
これは「ファイルを最後のコミット時点の状態に戻す」という操作です。
実際の使用例
たとえば、設定ファイルをいじっていて元に戻したくなった場合。
# config.jsを編集中...
# あ、やっぱり元のままでいいや
git restore config.js
# → config.jsが元の状態に戻る
ただし注意!
一度取り消した変更は戻せません。
本当に消していいか、必ず確認してから実行しましょう。
ステージングエリアから取り出す:修正テープを剥がす感覚
git add
してしまったファイルを「やっぱりまだコミットしたくない」という場合。
git restore --staged:ステージから降ろす
# ステージから特定ファイルを降ろす
git restore --staged ファイル名.txt
# すべてのファイルをステージから降ろす
git restore --staged .
これで変更自体は残したまま、コミット対象から外せます。
よくある使用シーン
# 3つのファイルを変更
# でも1つだけ先にコミットしたい
git add . # 全部ステージに上げちゃった!
# 2つのファイルをステージから降ろす
git restore --staged file2.js file3.js
# これで file1.js だけコミットできる
git commit -m "file1.jsの修正"
ステージから降ろしても、ファイルの変更内容は消えません。
安心して使える機能です。
コミット後の取り消し:2つのアプローチ
コミットしてしまった後の取り消しは、少し慎重に行う必要があります。
git revert:安全な取り消し方法
git revert
は「取り消しコミット」を新しく作る方法です。
履歴を書き換えないので、チーム開発では基本これを使います。
# 直前のコミットを取り消す
git revert HEAD
# 特定のコミットを取り消す
git revert abc1234
revertの動作イメージ
履歴: A → B → C → D(間違い)
↓ revert
履歴: A → B → C → D → E(Dを打ち消す)
Dのコミットは履歴に残りますが、Eで打ち消されます。
「間違えたことも記録として残す」という考え方です。
git reset:履歴を巻き戻す方法
git reset
は履歴そのものを巻き戻します。
個人作業では便利ですが、共有後は使用注意です。
# コミットを取り消し、変更は残す
git reset HEAD^
# コミットも変更も取り消す(危険!)
git reset --hard HEAD^
resetの3つのモード
resetには3つのモードがあります。
- --soft: コミットだけ取り消す(変更はステージに残る)
- --mixed: コミットとステージを取り消す(変更は残る)
- --hard: すべて取り消す(変更も消える)
それぞれの使い分けが重要です。
実務でよくある「やっちゃった」パターンと対処法
パターン1:デバッグコードを消し忘れた
function calculate(price) {
console.log("デバッグ: price =", price); // これ消し忘れた!
return price * 1.1;
}
対処法:
# まだプッシュしていない場合
git reset HEAD^
# ファイルを修正
git add .
git commit -m "価格計算機能を追加"
# すでにプッシュした場合
git revert HEAD
# または修正コミットを追加
パターン2:違うブランチで作業してしまった
mainブランチで新機能を開発し始めてしまった!
対処法:
# まだコミットしていない場合
git stash
git checkout -b feature/new-function
git stash pop
# すでにコミットした場合
git checkout -b feature/new-function
git checkout main
git reset --hard HEAD^
パターン3:大量のファイルを間違えてaddした
node_modulesフォルダを間違えて追加してしまった!
対処法:
# ステージから除外
git restore --staged node_modules/
# .gitignoreに追加
echo "node_modules/" >> .gitignore
git add .gitignore
git commit -m "gitignoreを更新"
安全に変更を取り消すためのベストプラクティス
1. 作業前に状態を確認
# 現在の状態を確認
git status
# 変更内容を確認
git diff
2. 重要な変更は一時保存
# 作業を一時保存
git stash save "作業中の〇〇機能"
# あとで復元
git stash pop
3. ブランチを活用する
# 実験用ブランチで試す
git checkout -b experiment/try-something
# うまくいったらマージ
# 失敗したらブランチごと削除
4. エイリアスで安全性を高める
# ~/.gitconfigに追加
[alias]
# 安全なreset(--hardは使わない)
undo = reset HEAD^
# 変更内容を見てから取り消し
restore-check = !git diff && echo "本当に取り消しますか?[y/N]" && read ans && [ "$ans" = "y" ] && git restore
まとめ
Gitの変更取り消しは、レベルごとに適切な方法があります。
- ワークツリー:
git restore
で簡単に - ステージング:
git restore --staged
で安全に - コミット後: チーム開発なら
revert
、個人ならreset
大切なのは「取り消しの影響範囲」を理解すること。
特に--hard
オプションは、本当に必要な時だけ使いましょう。
最初は怖いかもしれませんが、適切に使えばGitはとても頼もしい味方になります。
まずは個人プロジェクトで練習して、徐々に慣れていってくださいね。
著者について

とまだ
フルスタックエンジニア
Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。
著者の詳細を見る →