本文へコードを読む前に実行するGitコマンド
概要
- 新しいコードベースを扱う際、まず Git履歴 を確認する手法の重要性
- 変更頻度・バグ集中・貢献者分布 などの観点でリスク分析
- 主要な Gitコマンド を用いた短時間診断の流れ
- コードベースの 健康状態やチーム状況 の可視化
- 初動調査で得られる 洞察と次の行動指針
新しいコードベースを診断する最初の一時間
- 新規プロジェクトで最初に行うのは、 コード閲覧 ではなく ターミナルでのGitコマンド実行
- コミット履歴 から「誰が作ったか」「問題がどこに集中しているか」「チームの活発度」などを把握
- これにより、 読むべきファイルや注意点 を初動で特定
最も変更されているファイルの特定
- コマンド例
git log --format=format: --name-only --since="1 year ago" | sort | uniq -c | sort -nr | head -20
- 過去1年で最も変更されたファイル上位20件 を抽出
- 最上位のファイルは「 誰も触りたがらない問題児」であることが多い
- 高頻度変更=悪 とは限らないが、 誰も責任を持ちたがらない高頻度ファイル は要注意
- Microsoft Researchの調査 でも、変更頻度は複雑度以上に不具合発生を予測
- 上位5件を次の「バグ集中ファイル」と クロスチェック するのが効果的
誰がこのコードを作ったのか
- コマンド例
git shortlog -sn --no-merges
- 一人が 60%以上 を占めていれば「 バス係数」が低い
- 上位貢献者が 最近6ヶ月で活動していない場合 は即クライアントに報告
- コマンド例
git shortlog -sn --no-merges --since="6 months ago"
- 貢献者数に対し、実質稼働者が少ない場合 はメンテナンスリスク
- Squash Merge運用 の場合、実際の作者とコミット者が異なることに注意
バグが集中する場所の把握
- コマンド例
git log -i -E --grep="fix|bug|broken" --name-only --format='' | sort | uniq -c | sort -nr | head -20
- 変更頻度トップとバグ集中トップ が重なるファイルは最大のリスク
- コミットメッセージの質 に依存するため、運用状況も加味
プロジェクトの加速か停滞か
- コマンド例
git log --format='%ad' --date=format:'%Y-%m' | sort | uniq -c
- 安定したリズム は健全、急減はメンバー離脱などの兆候
- 6-12ヶ月の漸減 はモメンタム低下、 周期的なスパイク はリリースバッチ型運用
- チームの歴史と出来事 を可視化するデータ
チームが火消しに追われている頻度
- コマンド例
git log --oneline --since="1 year ago" | grep -iE 'revert|hotfix|emergency|rollback'
- 年間数回は正常、 頻繁なRevert はデプロイ手順やテストの信頼性不足
- ゼロ件 も「安定」か「メッセージが雑」かのどちらか
- 危機パターン は履歴から容易に判読可能
まとめ
- この5つのコマンド で数分以内に「どこを読むべきか」「どこに問題が潜むか」を特定可能
- 初動調査 で得られる洞察が、無駄な探索を防ぎ、効率的な読み進めを実現
- これは コードベース監査の初日1時間 のアプローチ
関連記事リスト
- Why Your Engineering Team Is Slow (It's the Codebase, Not the People)
- How to Close a Tab in Vim
- How I Audit a Legacy Rails Codebase in the First Week
- How to Open a New Tab in Vim
- Rails default_scope: Why You Should Never Use It
提供: ハクソク · 要約更新:
AIによる日本語要約です。内容は原文とあわせてご確認ください。
Hacker Newsの議論を読む
jujutsuの使い方について興味がある人のために、以下のコマンドを紹介するね。 「最も変更されたファイル」
jj log --no-graph -r 'ancestors(trunk()) & committer_date(after:"1 year ago")' \ -T 'self.diff().files().map(|f| f.path() ++ "\n").join("")' \ | sort | uniq -c | sort -nr | head -20「このプロジェクトを作ったのは誰?」jj log --no-graph -r 'ancestors(trunk()) & ~merges()' \ -T 'self.author().name() ++ "\n"' \ | sort | uniq -c | sort -nr「バグはどこに集まる?」jj log --no-graph -r 'ancestors(trunk()) & description(regex:"(?i)fix|bug|broken")' \ -T 'self.diff().files().map(|f| f.path() ++ "\n").join("")' \ | sort | uniq -c | sort -nr | head -20「このプロジェクトは加速しているのか、それとも死にかけているのか?」jj log --no-graph -r 'ancestors(trunk())' \ -T 'self.committer().timestamp().format("%Y-%m") ++ "\n"' \ | sort | uniq -c「チームはどれくらい頻繁に火消しをしているのか?」jj log --no-graph \ -r 'ancestors(trunk()) & committer_date(after:"1 year ago") & description(regex:"(?i)revert|hotfix|emergency|rollback")'もっと詳しくて、シェルスクリプトよりプログラミングに近い感じ。でも、覚えるフラグは少ないよ。