第6章 履歴を見る・過去に戻る

この章で学ぶこと

  • git log で履歴を見る

  • git diff で変更内容を見る

  • git show で特定コミットを見る

  • git restore で作業ツリーを戻す

  • git revert で過去のコミットを打ち消す

動機・背景

第 5 章までで ~/my-scripts リポジトリにいくつかコミットを積み重ねてきました。コミットを重ねていくと、必ずと言っていいほど「いつ、どのファイルを、どう変えたんだっけ?」と振り返りたくなる場面、あるいは「あの変更を取り消したい」「うっかり編集してしまった内容を捨てたい」という場面が出てきます。

履歴を読み解いたり、安全に過去の状態へ戻したりできることは、実は Git が本領を発揮するポイントです。本章では、履歴を見るためのコマンド (git log / git diff / git show) と、変更を取り消すためのコマンド (git restore / git revert) を順に押さえていきます。

git log の基本

最も素朴な使い方は、引数なしの git log です。

git log

各コミットについてコミット ID・著者・日付・メッセージが詳しく表示されますが、コミット数が増えると非常に長くなり、流し読みには向きません。

長くて読みにくい場合は、表示を要約するオプションを組み合わせます。

git log --oneline
git log --graph --oneline --all
  • --oneline: 1 コミット 1 行に圧縮して表示

  • --graph: 分岐・マージの様子を ASCII アート風の図で描画

  • --all: 現在のブランチだけでなく全ブランチを対象に含める

Tip

日々の確認では git log --oneline を、ブランチ構造を把握したいときは git log --graph --oneline --all を、というように使い分けると見通しが良くなります。

git diff の使い分け

「いま何が変わっているか」を見るのが git diff ですが、比較対象によって複数の使い方があります。

コマンド

比較対象

git diff

作業ツリー vs index

git diff --staged

index vs HEAD

git diff HEAD

作業ツリー vs HEAD

git diff <commit>

作業ツリー vs 指定コミット

git diff <c1> <c2>

2 コミット間

具体例として、README.md に 1 行追記してから git diff を実行してみましょう。

Add-Content -Encoding utf8 -Path README.md -Value "## 注意"
git diff

期待出力 (コミット ID は環境によって異なります):

diff --git a/README.md b/README.md
index abc..def 100644
--- a/README.md
+++ b/README.md
@@ -2,3 +2,4 @@
 自動化スクリプトを管理するリポジトリです。
+## 注意

先頭が + の行は追加された行、- の行は削除された行です。@@ -2,3 +2,4 @@ は「変更箇所が旧側の 2 行目から 3 行、新側の 2 行目から 4 行」という意味のヘッダです。

git show で 1 コミットを見る

特定の 1 コミットの内容 (コミットメッセージ + 差分) をまとめて確認したいときは git show を使います。

git show HEAD
git show abc1234

HEAD は最新コミットを指す別名で、abc1234 のように直接コミット ID を指定することもできます。コミットメッセージとそのコミットで加えられた差分が一緒に表示されるので、「あのコミットで何を変えたか」を素早く確認できます。

git restore — 編集を捨てる

未ステージの編集 (作業ツリーの変更) を破棄して、index の状態に戻したい場合は git restore を使います。

git restore README.md

警告

git restore作業ツリーの編集を捨てる操作です。捨てた変更は基本的に元に戻せないので、本当に破棄して良いか確認してから実行してください。

ステージしてしまった変更を、コミット前に index から降ろしたい (unstage したい) 場合は --staged を付けます。

git restore --staged README.md

過去コミットの状態をピンポイントで取り出したい場合は --source で参照を指定します。例えば 1 つ前のコミット時点の README.md を作業ツリーに復元するには次のようにします。

git restore --source=HEAD~1 README.md

HEAD~1 は「HEAD の 1 つ前のコミット」を意味します。

git revert — 打ち消しコミットを作る

過去のコミットの内容を 取り消したい ときは git revert を使います。

git revert HEAD

このコマンドを実行すると、エディタが開いてコミットメッセージの入力画面になります (デフォルトでは Revert "..." という文面が用意されています)。そのまま保存して終了すると、対象のコミットの変更を打ち消す 新しいコミット が追加されます。git revert は過去のコミットそのものを履歴から消すのではなく、それを打ち消す新コミットを足す操作である点に注意してください。

Tip

revert vs restore:

  • restore: 作業ツリーやステージを書き換える (履歴は変わらない)

  • revert: 過去コミットを取り消す新コミットを追加 (履歴が増える)

ハンズオン課題

  1. git log --oneline で過去のコミット ID を 1 つ選び、git show <コミットID> でそのコミットの内容を確認する

  2. README.md を意図的に編集し、git diff で差分を確認したうえで git restore README.md により元に戻す

  3. 直前のコミットを git revert HEAD で打ち消し、git log --oneline で新しいコミットが 1 つ増えていることを確認する

まとめ

  • git log で履歴を、git diff で差分を、git show で 1 コミットの中身を確認できる

  • git restore は作業ツリーやステージを戻す操作で、履歴は変えない

  • git revert は過去コミットを打ち消す新コミットを追加する操作で、履歴に追記される