やり直す②(revert・reflog)
このページで分かること
git resetとgit revertの違いと、選ぶ基準が分かるgit revertで、記録を残したまま変更を打ち消せるgit reflogで、取り消したはずのコミットを探し出せる- reflog でも取り戻せないものが何かが分かる
このページの目次8 items
第2部の14の最後に、「やることに郵便局を追加」のコミットを変更ごと取り消しました。このページでは、まずそのコミットを取り戻します。そのうえで、記録を消さずに打ち消す、もう1つの取り消し方を扱います。
reset と revert の違い#

どちらも「C の変更をなかったことにする」操作ですが、やり方が逆です。
git resetは、ブランチを過去のコミットに戻します。C はgit logに出なくなり、履歴そのものが書き換わりますgit revertは、C と正反対の変更を新しいコミットとして足します。C は履歴に残ったまま、中身だけが C の前の状態に戻ります
選ぶ基準は、そのコミットを誰かと共有したかどうかです。
| 状況 | 使うもの | 理由 |
|---|---|---|
| 自分の手元にしかないコミット | reset(第2部の14) |
履歴がきれいに保てる。困る人がいない |
| 他の人と共有したコミット | revert |
履歴を書き換えないので、相手の履歴と食い違わない |
| 迷ったとき | revert |
記録が増えるだけで、何も失わない |
共有の仕組みは第6部で扱います。第2〜5部では練習用フォルダの中だけで作業しているので、どちらを使っても困ることはありません。両方を試せるうちに、違いを手で確かめておきます。
reflog:HEAD が動いた記録#
git log は「今のブランチからたどれるコミット」だけを表示します。取り消したコミットはもう出てきません。
cd ~/git-practice
git log --oneline -n 2
# 出力:
# 1acb8f0 買い物メモにパンを追加
# b90cd28 config.txt を追跡から外すところが Git は、コミットそのものをすぐには消しません。そして、HEAD がいつ、どのコミットへ動いたかを別に記録しています。それが reflog(reference log)です。
git reflog -n 3
# 出力:
# 1acb8f0 HEAD@{0}: reset: moving to HEAD~1
# fd7152c HEAD@{1}: commit: やることに郵便局を追加
# 1acb8f0 HEAD@{2}: commit: 買い物メモにパンを追加新しい順に、HEAD の移動が並んでいます。
HEAD@{0}:今。resetで1acb8f0に戻ってきたHEAD@{1}:その直前。fd7152cのコミットを作ったHEAD@{2}:さらにその前
HEAD@{1} の fd7152c が、取り消した「やることに郵便局を追加」です。ハッシュが分かれば、そこへ戻れます。
取り消したコミットを取り戻す#
git status -s
# 出力:
# (何も表示されない)
git reset --hard fd7152c
# 出力:
# HEAD is now at fd7152c やることに郵便局を追加ブランチが fd7152c を指すように戻り、todo.txt にも「郵便局に行く」の行が戻りました。
git log --oneline -n 3
# 出力:
# fd7152c やることに郵便局を追加
# 1acb8f0 買い物メモにパンを追加
# b90cd28 config.txt を追跡から外すrevert:記録を残したまま打ち消す#
取り戻した「やることに郵便局を追加」を、今度は revert で打ち消します。
git revert --no-edit HEAD
# 出力:
# [main bb5686f] Revert "やることに郵便局を追加"
# Date: Thu Oct 22 01:03:21 2026 +0900
# 1 file changed, 1 deletion(-)HEAD は打ち消したいコミットの指定です。直前のコミット以外も、git revert 1acb8f0 のようにハッシュで指定できます。--no-edit を付けないと、打ち消しのコミットのメッセージを編集するエディタが開きます。
git log --oneline -n 3
# 出力:
# bb5686f Revert "やることに郵便局を追加"
# fd7152c やることに郵便局を追加
# 1acb8f0 買い物メモにパンを追加元のコミット fd7152c は残ったまま、その上に打ち消しのコミット bb5686f が足されました。todo.txt から「郵便局に行く」の行は消えていますが、「一度追加して、あとで取り消した」という経緯が履歴に残っています。
reflog でも取り戻せないもの#
reflog は強力ですが、万能ではありません。
| 取り戻せるもの | 取り戻せないもの |
|---|---|
| 一度でもコミットした内容 | 一度もコミットしていない編集(第2部の14の「消える」操作で捨てたもの) |
| reset・amend で取り消したコミット | 期限を過ぎた古い reflog の記録 |
| 別のPCでの操作(reflog はそのPCの中だけにある) |
取り消したコミットは、初期設定ではおおむね30日は reflog からたどれます。それを過ぎると、Git が掃除のときに削除することがあります。
ここから分かることは1つです。コミットさえしてあれば、Git はほぼ何でも取り戻せます。 作業の区切りでこまめにコミットすることが、いちばん確実な保険になります。
よくある疑問#
Q. reflog に同じハッシュが何度も出てきます。
A. HEAD がそのコミットに何度も戻ってきた、という意味です。reflog は「どのコミットがあるか」ではなく「HEAD がどう動いたか」の記録なので、同じコミットが繰り返し現れます。
Q. revert したコミットを、さらに revert するとどうなりますか?
A. 打ち消しの打ち消しになり、元の変更が戻ってきます。履歴には3つのコミットがすべて残ります。
まとめ#
resetはブランチを戻して履歴を書き換え、revertは打ち消しのコミットを足して履歴を残す- 共有したコミットは
revertで打ち消す。迷ったらrevert git reflogは HEAD の移動の記録で、取り消したコミットのハッシュを探せる- 一度もコミットしていない編集は、reflog でも取り戻せない
- こまめなコミットが、いちばん確実な保険になる
次のページ#
16. Gitは差分ではなくスナップショットを保存する ── ここから第3部です。Git がコミットの中に何を保存しているのかを、仕組みから見ていきます。