Git の履歴とログ管理

GitBeginner
オンラインで実践に進む

はじめに

Git タイムトラベラーの皆さん、ようこそ!今日は、Git プロジェクトの履歴を巡る刺激的な旅に出かけましょう。Git の最も強力な機能の一つは、プロジェクトの歩みを追跡し、表示する能力です。この履歴は単なる過去の記録ではなく、プロジェクトを理解し、デバッグし、改善するための強力なツールとなります。

この実験(Lab)では、Git の履歴レコードへの窓口となる git log コマンドを探索します。基本的な使い方から始めて、ログ出力のフォーマット、日付によるフィルタリング、特定の変更の検索、さらにはプロジェクト履歴からの統計情報の生成といった高度なテクニックまで深く掘り下げていきます。

この実験を終える頃には、プロのようにプロジェクトの履歴を自在に操り、開発者としてより効果的に動くための貴重な洞察や情報を引き出せるようになっているはずです。バグの追跡、変更内容の確認、あるいはプロジェクトがどのように進化してきたかの把握など、ここで学ぶスキルは計り知れない価値を持つでしょう。

それでは、Git タイムマシンに乗り込んで、過去を探索しに行きましょう!

ワークスペースのセットアップ

Git の履歴機能を詳しく調べる前に、探索対象となるコミット履歴を持つワークスペースを準備しましょう。新しいディレクトリを作成し、Git リポジトリを初期化して、いくつかのコミットを追加します。

ターミナルを開き、以下のコマンドを入力してください:

cd ~/project
mkdir git-history-lab
cd git-history-lab
git init

次に、いくつかのファイルを作成し、一連のコミットを行います。以下のコマンドをコピーして貼り付けてください:

echo "## Git History Lab" > README.md
git add README.md
git commit -m "Initial commit"

echo "function hello() {" > script.js
echo "  console.log('Hello, Git!');" >> script.js
echo "}" >> script.js
git add script.js
git commit -m "Add hello function"

echo "function goodbye() {" >> script.js
echo "  console.log('Goodbye, Git!');" >> script.js
echo "}" >> script.js
git add script.js
git commit -m "Add goodbye function"

echo "This is a test file" > test.txt
git add test.txt
git commit -m "Add test file"

echo "hello();" >> script.js
echo "goodbye();" >> script.js
git add script.js
git commit -m "Call hello and goodbye functions"

今行った操作の内容を整理しましょう:

  1. README ファイルを作成し、最初のコミット(Initial commit)を行いました。
  2. "hello" 関数を含む JavaScript ファイルを作成し、コミットしました。
  3. 同じファイルに "goodbye" 関数を追加し、コミットしました。
  4. テストファイルを追加し、コミットしました。
  5. 最後に、両方の関数を呼び出すようにスクリプトを修正し、その変更をコミットしました。

これで、探索するための履歴が詰まったリポジトリが完成しました!

ログの基本的な使い方

コミット履歴が作成できたので、git log の基本的な使い方を見ていきましょう。

プロジェクトのコミット履歴を確認するには、単純に次のコマンドを実行します:

git log

次のような出力が表示されるはずです:

commit 1234567890abcdef1234567890abcdef12345678 (HEAD -> main)
Author: Your Name <your.email@example.com>
Date:   Mon Jun 5 10:00:00 2023 +0000

    Call hello and goodbye functions

commit 2345678901abcdef2345678901abcdef23456789
Author: Your Name <your.email@example.com>
Date:   Mon Jun 5 09:45:00 2023 +0000

    Add test file

...

ログの各エントリには以下の情報が表示されます:

  • 完全なコミットハッシュ(コミットを一意に識別する ID)
  • コミットの作成者(Author)
  • コミットの日時
  • コミットメッセージ

デフォルトでは、git log はすべてのコミットを最新のものから順に表示します(逆時系列順)。

出力が長い場合、Git はページャー(通常は less)で表示します。矢印キーで移動し、q キーを押すと終了してターミナルに戻ります。

より簡潔なログを表示したい場合は、次のコマンドを使用します:

git log --oneline

これにより、各コミットが 1 行で表示され、短いコミットハッシュとコミットメッセージのみが示されます。

git log はプロジェクトの過去を知るための窓口であることを忘れないでください。いつ、誰が、どのような変更を行ったかを理解するための素晴らしい出発点となります。

ログ出力のフォーマット

Git には、必要な情報を正確に表示するためにログ出力をフォーマットする強力なオプションが用意されています。いくつかのオプションを試してみましょう。

各コミットで修正されたファイルを表示するには、--stat オプションを使用します:

git log --stat

これにより、各コミットでどのファイルが変更され、何行追加または削除されたかが表示されます。

変更内容をより詳細に確認するには、-p オプションを使用します:

git log -p

これは各コミットの実際のパッチ(追加・削除された行)を表示します。変更内容を詳細にレビューする際に非常に便利です。

また、--pretty オプションを使用してカスタムフォーマットを作成することもできます。例えば:

git log --pretty=format:"%h - %an, %ar : %s"

このコマンドは以下を表示します:

  • %h: 短縮されたコミットハッシュ
  • %an: 作成者名(Author Name)
  • %ar: 相対的な作成日時(Author Date, relative)
  • %s: 件名(コミットメッセージ)

このフォーマット文字列をカスタマイズして、必要な情報を含めることができます。便利なプレースホルダーをいくつか紹介します:

  • %H: 完全なコミットハッシュ
  • %ad: 作成日時
  • %cn: コミッター名
  • %ce: コミッターのメールアドレス
  • %cd: コミッターの日時

自分にとって最も使いやすいフォーマットを見つけるために、いろいろ試してみてください!

日付によるログのフィルタリング

特定の期間内のコミットだけを確認したいことがよくあります。Git には日付でログをフィルタリングするためのオプションがいくつかあります。

先週からのコミットを表示するには:

git log --since=1.week

特定の日付を指定することもできます:

git log --after="2023-06-01" --before="2023-06-30"

これにより、2023 年 6 月 1 日から 6 月 30 日までのコミットが表示されます。

Git は、"yesterday"(昨日)や "1 month 2 weeks 3 days ago"(1 ヶ月 2 週間 3 日前)といった相対的な表現を含む、多様な日付フォーマットを理解します。

--before の代わりに --until を、--since の代わりに --after を使うこともできます(これらは同義です)。

これらのフィルタは、コミット日時が指定された範囲内にあるコミットを表示することに注意してください。コミット日時はコミットが作成された時であり、実際にコードが書かれた時とは異なる場合があります。

特定の変更がいつ導入されたかを調査している場合は、次のステップで説明する --grep オプションを使用して特定のコミットメッセージを検索するのが有効です。

特定の変更をログから検索する

Git は、特定のコミットを見つけるための強力な検索機能を提供しています。これらの機能をいくつか探索してみましょう。

コミットメッセージ内に特定の単語が含まれるコミットを検索するには:

git log --grep="function"

これにより、コミットメッセージに "function" という単語が含まれるすべてのコミットが表示されます。

特定のファイルに対する変更を検索することもできます:

git log -- script.js

これは script.js ファイルに影響を与えたすべてのコミットを表示します。

特定のコード行を追加または削除した変更を検索するには:

git log -S "console.log"

これは「ピックアクス(つるはし)」検索と呼ばれます。"console.log" という文字列の出現回数が変化したコミットを表示します。

これらを他のオプションと組み合わせることも可能です。例えば、先週 script.js に行われた詳細な変更を確認するには:

git log -p --since=1.week -- script.js

Git の検索はデフォルトで大文字と小文字を区別します。区別せずに検索したい場合は -i オプションを使用してください:

git log --grep="function" -i

これらの検索機能は、特定の変更がいつ導入されたか、あるいはバグがいつ修正されたかを突き止める際に非常に役立ちます。

ログからの統計情報の生成

Git は、統計を通じてプロジェクトの履歴に関する貴重な洞察を提供してくれます。統計情報を生成するいくつかの方法を見てみましょう。

作成者ごとのコミット数の要約を表示するには:

git shortlog -s -n

これにより、コミット数でソートされた作成者リストと、それぞれの名前の横にコミット数が表示されます。

特定の作成者が何行追加し、何行削除したかを確認するには:

git log --author="Jane Doe" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "Added lines: %s, Removed lines: %s, Total lines: %s\n", add, subs, loc }'

"Jane Doe" を確認したい作成者の名前に置き換えてください。

どのファイルが最も頻繁に変更されているかを確認するには:

git log --pretty=format: --name-only | sort | uniq -c | sort -rg | head -10

これにより、最も頻繁に修正された上位 10 ファイルが表示されます。

総コミット数を確認するには:

git rev-list --count HEAD

これらの統計情報は、プロジェクト全体の開発パターンを理解するのに非常に役立ちます。プロジェクトのどの部分が最も活発に開発されているか、誰が最も貢献しているか、そしてプロジェクトが時間の経過とともにどのように成長してきたかを特定するのに役立ちます。

ただし、これらの統計は有益ではありますが、それがすべてではないことを忘れないでください。コミット数や変更行数は、必ずしも貢献の影響力や品質と相関するわけではありません。

まとめ

おめでとうございます、Git 歴史家の皆さん!Git の履歴とログ管理機能の力を手に入れましたね。今回学んだ主要な概念を振り返ってみましょう:

  1. ログの基本的な使い方: git log を使用してプロジェクトのコミット履歴を表示する方法を学びました。
  2. ログ出力のフォーマット: 必要な情報を正確に表示するためにログ出力をカスタマイズする方法を発見しました。
  3. 日付によるログのフィルタリング: 特定の時間範囲内のコミットに焦点を当てる方法を確認しました。
  4. 特定の変更をログから検索する: 特定の変更がいつ導入されたかを見つけるための強力なテクニックを学びました。
  5. ログからの統計情報の生成: プロジェクトの開発パターンに関する洞察を引き出す方法を探索しました。

これらのスキルは、より大きなプロジェクトに取り組む際に非常に価値があることが証明されるでしょう。バグを追跡する場合でも、機能の進化をレビューする場合でも、プロジェクト全体の開発トレンドを把握しようとする場合でも、git log コマンドとその多様なオプションはあなたの忠実な相棒となります。

Git の履歴は単なる過去の記録ではなく、プロジェクトを理解し改善するための強力なツールであることを忘れないでください。これらを賢く使いこなせば、より効果的な開発者になれるはずです。

これからもこれらのコマンドを探索し、実験し続けてください。プロジェクトの履歴をナビゲートすることに慣れれば慣れるほど、そこからより多くの洞察を得られるようになります。あなたの Git リポジトリでのタイムトラベルが実り多きものになりますように!