Skip to main content

変更の取り消しとバージョンの復元

この章で得られるスキル:

  • ✅ 取り消し操作の全体像を説明できる
  • git restore で作業ディレクトリの変更を元に戻せる
  • git restore --staged でステージの取り消しができる
  • git revert でコミットを安全に取り消せる
  • git log --onelinegit show で過去のコミットを確認できる

Step 0: まず体験してみよう

シナリオ:うっかりファイルを壊してしまった

Calculator.java にメソッドを追加していたら、間違えてファイルの中身を大幅に壊してしまった。

// 本来のコード
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
// うっかり壊してしまったコード
public class Calculator {
public int add(int a, int b) {
return a - b; // 間違えて引き算にしてしまった!
}

public int divide(int a, int b) {
return a / b; // ゼロ除算のチェックを忘れた!
}
}

さらに、この壊れたコードをコミットしてしまった場合はどうすればよいだろうか?

重要

開発中にミスをすることは日常茶飯事である。 重要なのは「ミスをしないこと」ではなく、 「ミスを安全に元に戻せること」 である。

→ Gitには、状況に応じた 3つの取り消し方法 がある。この章で1つずつ学んでいこう。


Step 1: 取り消し操作の全体像

Gitでは、 変更がどの段階にあるか によって、使うコマンドが異なる。

段階コマンド効果
作業ディレクトリの変更git restore ファイル名ファイルを最後のコミット状態に戻す
ステージ済みの変更git restore --staged ファイル名ステージから外す(変更内容は残る)
コミット済みの変更git revert コミットID打ち消しコミットを作成する
ポイント

この決定木を覚えておけば、どんな場面でも適切な取り消し操作を選べる。 迷ったら「変更はどの段階にあるか?」を考えよう。


Step 2: 作業ディレクトリの変更を元に戻す(git restore)

基本的な使い方

git restore は、作業ディレクトリのファイルを 最後のコミット状態に戻す コマンドである。

git restore ファイル名

やってみよう

  1. Calculator.java を適当に変更する(メソッド名を変えるなど)
  2. git status で変更を確認する
  3. git restore Calculator.java を実行する
  4. ファイルが元に戻っていることを確認する
# ファイルを変更した状態
git status
# → modified: Calculator.java

# 変更を元に戻す
git restore Calculator.java

# 確認
git status
# → nothing to commit, working tree clean

全ファイルの変更を一括で戻す

git restore .

.(ドット)を指定すると、すべての変更ファイルが元に戻る。

注意

git restore で戻した変更は 元に戻せない 。 コミットしていない変更は完全に失われる。 本当に不要な変更かどうか、 git diff で確認してから実行しよう。

いつ使うか

  • 試行錯誤した結果、最初からやり直したいとき
  • 間違った編集をしてしまい、コミット前の状態に戻したいとき

Step 3: ステージの取り消し(git restore --staged)

基本的な使い方

git restore --staged は、 git add でステージに追加したファイルを ステージから外す コマンドである。

git restore --staged ファイル名

やってみよう

  1. Calculator.java を変更する
  2. git add Calculator.java でステージに追加する
  3. git status で「Changes to be committed」にあることを確認する
  4. git restore --staged Calculator.java を実行する
  5. git status で「Changes not staged for commit」に戻っていることを確認する
# ファイルを変更してステージに追加
git add Calculator.java
git status
# → Changes to be committed:
# → modified: Calculator.java

# ステージから外す
git restore --staged Calculator.java
git status
# → Changes not staged for commit:
# → modified: Calculator.java

ステージ解除とファイル復元の違い

コマンド効果
git restore --staged ファイル名ステージから外す( 変更内容は残る
git restore ファイル名ファイルを元に戻す( 変更内容が消える
重要

git restore --staged は、ステージから外すだけであり、ファイルの変更内容は作業ディレクトリに残る。 ファイルの変更自体も元に戻したい場合は、続けて git restore ファイル名 を実行する必要がある。

いつ使うか

  • 間違えて git add してしまったファイルをステージから外したいとき
  • コミットする前に、ステージの内容を整理したいとき

Step 4: コミットの取り消し(git revert)

基本的な使い方

git revert は、指定したコミットの変更を 打ち消す新しいコミット を作成するコマンドである。

git revert コミットID

コミットIDの確認方法

git revert を使うには、取り消したいコミットのIDが必要である。 git log --oneline で確認しよう。

git log --oneline
# 出力例:
# a1b2c3d 割り算メソッドを追加
# e4f5g6h 掛け算メソッドを追加
# i7j8k9l 最初のコミット

コミットIDは先頭の7文字(例:a1b2c3d)で指定できる。

やってみよう

  1. Calculator.java にバグを含むメソッドを追加してコミットする
  2. git log --oneline で、取り消したいコミットのIDを確認する
  3. git revert コミットID を実行する
  4. エディタが開くので、コミットメッセージを確認して保存する
  5. git log --oneline で、打ち消しコミットが追加されていることを確認する
# バグを含むコミットのIDを確認
git log --oneline
# → a1b2c3d バグを含むメソッドを追加

# revertを実行
git revert a1b2c3d
# → エディタが開き「Revert "バグを含むメソッドを追加"」というメッセージが表示される
# → 保存して閉じる

# 確認
git log --oneline
# → f0e1d2c Revert "バグを含むメソッドを追加"
# → a1b2c3d バグを含むメソッドを追加
# → ...

revert は「打ち消しコミット」を追加する

git revert は元のコミットを削除するのではなく、 元のコミットを打ち消す新しいコミットを追加 する。 そのため、変更の履歴が完全に残り、安全に取り消すことができる。

revert と reset の違い

git revert の他に git reset というコマンドもある。 git reset はコミット履歴自体を巻き戻すコマンドだが、 push済みのコミットに使うと危険 である。 チーム開発では必ず git revert を使うこと。 git reset については、このステップの最後にコラムで紹介する。

いつ使うか

  • コミット済みの変更にバグが見つかったとき
  • すでにpushした変更を取り消したいとき(revert後にpushすれば、チームにも反映される)

Step 5: 過去のコミットの確認

取り消し操作を行う前に、過去のコミット内容を正しく確認できることが重要である。

git log --oneline — コミット一覧を表示

git log --oneline

出力例:

a1b2c3d (HEAD -> main) Revert "割り算メソッドを追加"
e4f5g6h 割り算メソッドを追加
i7j8k9l 掛け算メソッドを追加
m0n1o2p 足し算メソッドを追加
q3r4s5t 最初のコミット

直近N件だけ表示したい場合は -n オプションを使う。

git log --oneline -n 5

git show — 特定のコミットの内容を確認

git show を使うと、特定のコミットで 何がどう変わったか を確認できる。

git show コミットID

出力には以下の情報が含まれる。

  • コミットID、作成者、日時、メッセージ
  • 変更されたファイルとその差分(+ が追加行、- が削除行)
git show e4f5g6h
# → commit e4f5g6h
# → Author: Taro Tanaka <taro@example.com>
# → Date: Mon Feb 9 10:00:00 2026
# →
# → 割り算メソッドを追加
# →
# → diff --git a/Calculator.java b/Calculator.java
# → + public int divide(int a, int b) {
# → + return a / b;
# → + }

やってみよう

  1. git log --oneline で過去のコミット一覧を確認せよ
  2. 気になるコミットのIDをコピーし、git show コミットID で内容を確認せよ
  3. revertしたコミットの差分と、元のコミットの差分を比較してみよう
ポイント

git loggit show は「何が起きたかを調べる」ためのコマンドである。 取り消し操作の前に必ず使い、 何を戻そうとしているか を確認する習慣をつけよう。


Step 6: 実践課題

課題1:作業ディレクトリの変更を元に戻す

  1. Calculator.java のメソッドを意図的に壊せ(例:return a + b;return 0; に変更)
  2. git diff で変更内容を確認せよ
  3. git restore Calculator.java で変更を元に戻せ
  4. ファイルが正しく復元されたことを確認せよ

課題2:ステージの取り消し

  1. Calculator.java を変更し、git add でステージに追加せよ
  2. git status で「Changes to be committed」にあることを確認せよ
  3. git restore --staged Calculator.java でステージから外せ
  4. git status で「Changes not staged for commit」に戻っていることを確認せよ

課題3:コミットの取り消し

  1. Calculator.java にバグを含むメソッドを追加し、コミットせよ
  2. git log --oneline でコミットIDを確認せよ
  3. git revert コミットID でコミットを取り消せ
  4. git log --oneline で打ち消しコミットが追加されていることを確認せよ
  5. Calculator.java がバグ追加前の状態に戻っていることを確認せよ

課題4:総合問題

以下の状況を想定し、適切な取り消しコマンドを選んで実行せよ。

  1. ファイルを編集したが、まだ git add していない → どのコマンドで戻す?
  2. git add したが、まだ git commit していない → どのコマンドで戻す?
  3. git commit まで完了してしまった → どのコマンドで戻す?

コラム:git reset について

git reset は、コミット履歴自体を巻き戻すコマンドである。 実務では使われることもあるが、 チーム開発では原則使わない

3つのモード

モードコマンド作業ディレクトリステージコミット履歴
--softgit reset --soft HEAD~1そのままそのまま巻き戻す
--mixedgit reset HEAD~1そのまま戻す巻き戻す
--hardgit reset --hard HEAD~1戻す戻す巻き戻す

なぜ危険なのか

  • git resetコミット履歴を書き換える ため、push済みのコミットに使うと他のメンバーに影響が出る
  • --hard は作業ディレクトリの変更も消えるため、データが完全に失われる
  • チーム開発では「履歴を書き換えない」git revert を使うべき
注意

git reset は十分にGitを理解してから使うこと。 このブートキャンプでは、 git revert を使えば安全に取り消しができる ことを覚えておこう。


まとめ

この章では、 変更の取り消しとバージョンの復元 について学んだ。

🎯 達成できたこと

  • ✅ 取り消し操作の全体像(決定木)を説明できるようになった
  • git restore で作業ディレクトリの変更を元に戻せるようになった
  • git restore --staged でステージの取り消しができるようになった
  • git revert でコミットを安全に取り消せるようになった
  • git log --onelinegit show で過去のコミットを確認できるようになった

📚 学んだ内容

  • 取り消し操作は「変更がどの段階にあるか」で使うコマンドが決まる
  • git restore は作業ディレクトリの変更を元に戻す(元に戻せない操作)
  • git restore --staged はステージから外す(ファイルの変更は残る)
  • git revert はコミットを打ち消す新しいコミットを作成する(安全な操作)
  • git log --onelinegit show で履歴を確認してから取り消し操作を行う

🚀 次のステップ

次の章では、 ブランチとマージ について学ぶ。 開発の流れを分岐させ、安全に新機能を開発する方法を身につけよう。


💡 よくある質問

Q1: git restore と git checkout の違いは?

A: git checkout はGitの古いコマンドで、ブランチの切り替えとファイルの復元の両方に使われていた。Git 2.23以降、ファイルの復元は git restore、ブランチの切り替えは git switch に分離された。この教材では新しいコマンドを使用している。

Q2: git revert でコンフリクトが起きることはあるか?

A: ある。revert対象のコミット以降に同じ箇所を変更している場合、コンフリクトが発生する。その場合は、コンフリクトマーカーを手動で解決し、git addgit commit で完了する。コンフリクトの解決方法は第5章で詳しく学ぶ。

Q3: 間違えて git restore してしまった場合、元に戻せるか?

A: コミットしていない変更を git restore で戻した場合、 元に戻す方法はない 。コミットしていない変更はGitの管理対象外だからである。重要な変更は、こまめにコミットしておくことが最善の対策である。

Q4: 複数のコミットをまとめて取り消したい場合はどうすればよいか?

A: git revert を複数回実行するか、範囲を指定して git revert HEAD~3..HEAD のように取り消すことができる。ただし、複数コミットの取り消しは複雑になりやすいため、まずは1つずつ取り消す方法を確実に使えるようにしよう。

Q5: git revert の後、revert自体を取り消したくなった場合はどうすればよいか?

A: revert コミット自体をさらに git revert すればよい。revertは通常のコミットなので、それを再びrevertすることで元の変更が復活する。


練習問題

この章の内容を理解できたか確認しよう。

Gitの取り消しコマンドの組み合わせとして正しいものを選べ。

正解

A. git restore はワークツリーの変更を取り消し、git restore --staged はステージを取り消し、git revert はコミットを安全に取り消す

解説

Gitの取り消しコマンドは、対象の状態によって使い分ける。

コマンド対象説明
git restore ファイル名作業ディレクトリgit add 前の変更を取り消す。元に戻すと復元不可
git restore --staged ファイル名ステージgit add をなかったことにする(ファイル自体は変更したまま)
git revert コミットIDコミット履歴特定コミットを取り消す「打ち消しコミット」を作成する

使い分けの目安

  1. まだ git add していない変更を取り消したい → git restore
  2. git add した後でステージを取り消したい → git restore --staged
  3. すでにコミットした内容を取り消したい → git revert

注意git restore でワークツリーの変更を取り消すと、その内容は復元できない

以下のコマンドの空欄を埋めて、Main.java の変更を取り消し、最後のコミット時の状態に戻せ。

$
Main.java

解答例
git restore Main.java
解説

git restore ファイル名 は、作業ディレクトリ(ワークツリー)のファイルを最後のコミット時の状態に戻すコマンドである。

git restore Main.java
# Main.javaの変更が取り消され、最後のコミット時の状態に戻る

重要な注意点

  • git restore で取り消した変更は 復元できない
  • git add 前の変更のみが対象(git add 後の取り消しは git restore --staged を使う)

実行前の確認

git diff Main.java    # 変更内容を確認してから取り消す
git restore Main.java # 実行(取り消し後は戻せない)

全ファイルを一括で取り消す場合

git restore .    # カレントディレクトリ以下の全変更を取り消す

git add でステージに追加した Main.java をステージから取り除くコマンドの空欄を埋めよ。

$
Main.java

解答例
git restore --staged Main.java
解説

git restore --staged ファイル名 は、git add でステージに追加したファイルをステージから取り除くコマンドである。

ポイント

  • ファイルの変更内容は保持される(変更を消すわけではない)
  • ステージングエリアから取り除くだけであり、作業ディレクトリのファイルは変わらない
git add Main.java          # ステージに追加
git restore --staged Main.java  # ステージから取り除く(変更は残る)
git status                 # Changes not staged for commit: に戻っている

使いどころ

  • git add . で余分なファイルまでステージに追加してしまったとき
  • コミット前に「このファイルは今回含めたくない」と気づいたとき

ファイルへの影響

  • git restore Main.java → ファイルの変更が消える(注意が必要)
  • git restore --staged Main.java → ファイルの変更は残る(安全)

git revert コミットID の動作として正しいものを選べ。

正解

C. 指定したコミットの変更を打ち消す新しいコミットを作成する

解説

git revert コミットID は、指定したコミットの変更内容を打ち消す新しいコミットを作成するコマンドである。

git log --oneline
# a1b2c3d バグを混入させた変更
# d4e5f6a 前の正常なコミット

git revert a1b2c3d
# → "Revert 'バグを混入させた変更'" という新しいコミットが作成される

git revert の特徴

  • 履歴が書き換わらない(既存のコミットを削除しない)
  • 新しい「打ち消しコミット」が追加される
  • チームでの共有リポジトリでも安全に使える

git reset との違い

git revertgit reset
履歴への影響削除しない削除する
チームでの使用安全危険(pushした後は使わない)

初心者へのアドバイス

  • 共有リポジトリでコミットを取り消すときは git revert を使う
  • git reset は履歴が消えるため、プッシュ済みのコミットには使わない

過去のコミット内容を調べる正しい方法を選べ。

正解

C. git log --oneline でコミット一覧を確認し、git show コミットID で詳細を確認する

解説

過去のコミットを確認する際は、git loggit show を組み合わせて使う。

ステップ1: コミット一覧を確認

git log --oneline
# a1b2c3d (HEAD -> main) ログイン機能を追加
# d4e5f6a Calculator.javaを追加
# f7a8b9c 最初のコミット

ステップ2: 特定のコミットの詳細を確認

git show d4e5f6a
# commit d4e5f6a...
# Author: 山田太郎 <yamada@example.com>
# Date:   ...
#
#     Calculator.javaを追加
#
# diff --git a/Calculator.java b/Calculator.java
# +public class Calculator { ... }

コミットIDの使い方

  • コミットIDは最初の7文字程度で指定できる
  • git revert, git show, git checkout などにコミットIDを使う

Main.java を変更して git add した後、「やっぱり今回のコミットには含めたくない(ただしファイルの変更は残したい)」と気づいた。次に実行すべきコマンドとして最も適切なものを選べ。

正解

B. git restore --staged Main.java を実行してステージから取り除く

解説

この状況では git restore --staged Main.java が正しい選択である。

状況の整理

  • Main.java を変更し、git add Main.java を実行済み
  • コミットはまだしていない
  • 「やっぱりコミットに含めたくない」と気づいた

各コマンドの適用場面

コマンド適用場面
git restore Main.javagit add 前の変更を取り消したい(ファイルの変更が消える)
git restore --staged Main.javagit add 後にステージから取り除きたい(ファイルの変更は残る)
git revert コミットIDコミット済みの内容を安全に取り消したい
git reset --hard複数のコミットをまとめて取り消したい(共有リポジトリでは危険)

この問題のポイント

  • ファイルの変更は保持したい → git restore Main.java は不適(変更が消える)
  • コミットはしていない → git revert は不適
  • git add 済みをステージから取り除く → git restore --staged が正解