gitでブランチがどこから派生したかを調査する

はじめに

複数のブランチで開発していると、特定のブランチがどこから派生したか分からなくなることがある。

Gitには、ブランチの派生元や関係性を調査するためのコマンドが用意されているので試してみた際の備忘録を書いておく。

環境

git 2.34.1

基本的な調査方法

ブランチの派生関係は以下のような構造になっている

mainfeature/new-featureInitialABCDEF

この例では、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で図示すると

mainfeature/test-brancha66ab42: Inite02b4e2: Add test file21dfc24: Update test file

派生元の調査をする

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

派生元ブランチが不明な状態での調査

例示ではすでに派生元ブランチに目星がついている状態だったが、そうではない場合の調査例も記載する。

maindevelopfeature/Afeature/B12345678910

この状況で「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-basegit logを組み合わせることで、複雑なブランチ構造も把握できるので、このあたりは知っておこうと思ったのでやってみた。
現状だと、--graphオプションを使った視覚化は、ブランチの関係性を理解するのに有効だと感じる。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。