はじめに
複数のブランチで開発していると、特定のブランチがどこから派生したか分からなくなることがある。
Gitには、ブランチの派生元や関係性を調査するためのコマンドが用意されているので試してみた際の備忘録を書いておく。
環境
git 2.34.1
基本的な調査方法
ブランチの派生関係は以下のような構造になっている
この例では、feature/new-feature
ブランチはB
コミットから派生している。git merge-base
コマンドを使うと、この共通祖先(B
)を特定できる。
git merge-baseで共通祖先を確認
git merge-base ブランチ1 ブランチ2
2つのブランチの最も近い共通祖先のコミットハッシュを表示する。
# masterとfeatureブランチの共通祖先
git merge-base master feature/new-feature
# 出力: a1b2c3d4e5f6...
git logでブランチの履歴を可視化
git log --graph --oneline --decorate --all
全ブランチの履歴をグラフ形式で表示し、ブランチの分岐点が視覚的に分かる。
# 簡潔な履歴表示
git log --graph --oneline --decorate --all -10
実践してみる
適当なリポジトリでテスト用ブランチを作成して調査してみる。
ブランチの作成と確認
# 現在の状態を確認
git branch
git log --oneline -3
# テスト用ブランチを作成
git checkout -b feature/test-branch
echo "test content" > test-file.txt
git add test-file.txt
git commit -m "Add test file in feature branch"
# さらにコミットを追加
echo "more content" >> test-file.txt
git add test-file.txt
git commit -m "Update test file"
現状は下記とする。
21dfc24 (HEAD -> feature/test-branch) Update test file
e02b4e2 Add test file in feature branch
a66ab42 (master) Init
この状況をmermaidで図示すると
派生元の調査をする
1. merge-baseで共通祖先を確認
git merge-base master feature/test-branch
出力
a66ab42e312ed14513f899577979839d8b8ec6e5
2. 共通祖先の詳細を確認
git show $(git merge-base master feature/test-branch)
3. グラフで履歴を可視化
git log --graph --oneline --decorate --all -10
出力
* 21dfc24 (HEAD -> feature/test-branch) Update test file
* e02b4e2 Add test file in feature branch
* a66ab42 (master) Init
詳細な調査
派生後のコミット一覧
# masterから派生後のコミットのみ表示
git log master..feature/test-branch --oneline
21dfc24 (HEAD -> feature/test-branch) Update test file
e02b4e2 Add test file in feature branch
双方向の差分確認
# masterとfeatureブランチの相互差分
git log --left-right --graph --oneline master...feature/test-branch
派生元ブランチが不明な状態での調査
例示ではすでに派生元ブランチに目星がついている状態だったが、そうではない場合の調査例も記載する。
この状況で「feature/Aがどこから派生したか分からない」場合の調査手順を示す。
# 1. 全ブランチとの共通祖先を確認
git merge-base main feature/A # → コミット2
git merge-base develop feature/A # → コミット4
# 2. どちらがより近い祖先かを確認
git log --oneline main..feature/A | wc -l # mainからの距離
git log --oneline develop..feature/A | wc -l # developからの距離
# 3. ブランチの分岐点を視覚的に確認
git log --graph --oneline --all
# 結果: feature/Aはdevelopのコミット4から派生していることが判明
このように、派生元が不明な場合は複数のブランチと比較して調査をするとよい。
高度な調査について
特定のコミットからの派生確認
# 特定のコミット以降の履歴
git log --graph --oneline --since="2025-09-01" --all
ブランチ間の関係を調査
# ブランチがマージされているか確認
git branch --merged master
git branch --no-merged master
コミットがどのブランチに含まれるか
# 特定のコミットを含むブランチを表示
git branch --contains コミットハッシュ
調査パターン
マージ前の確認
# プルリクエスト前の差分確認
git log --graph --oneline origin/master..HEAD
古いブランチの整理
# masterにマージ済みのブランチ一覧
git branch --merged master | grep -v master
特定期間のブランチ作成履歴
# 1週間以内に作成されたブランチ
git for-each-ref --format='%(refname:short) %(committerdate)' refs/heads | \
awk '$2 >= "'$(date -d '1 week ago' '+%Y-%m-%d')'"'
参考
git-merge-base Documentation
https://git-scm.com/docs/git-merge-basegit-log Documentation
https://git-scm.com/docs/git-loggit-branch Documentation
https://git-scm.com/docs/git-branch
おわりに
ブランチの派生元調査は、あまりすることはないが認識違いで別ブランチから派生させてそのまま開発した際に確認することがある。git merge-base
とgit log
を組み合わせることで、複雑なブランチ構造も把握できるので、このあたりは知っておこうと思ったのでやってみた。
現状だと、--graph
オプションを使った視覚化は、ブランチの関係性を理解するのに有効だと感じる。