DESIGN / CODE / INFRA / AI

解説

git logの..と...は何が違う?片側の追加と両側の分岐を数えよう

共通のコミットから分岐したローカル履歴で、A..BとA...Bを比較。左右の件数、順序の意味、git diffとの読み方の違いを整理。

git logの..と...は何が違う?片側の追加と両側の分岐を数えよう
保存リストを見る →
この記事の道しるべ 4項目

二つのブランチを比べるとき、git log main..sideとmain...sideでは対象のコミットが違う。ドットが一つ増えただけでも、確認したい差は変わるよ。

今回は共有の接続先がない一時リポジトリで、main側に1件、side側に2件だけ追加する。コミットとブランチの基本が分かる人向けに、履歴の集合を数える練習をしよう。

練習用の分岐を作る

次のブロックはBashのターミナルで実行する。新しく作った一時ディレクトリーだけを書き換え、既存のGitリポジトリや共有ブランチへは触れないよ。

practice_dir=$(mktemp -d)
cd "$practice_dir"
git init -q -b main
git config user.name Practice
git config user.email practice@example.invalid
printf 'base\n' > base.txt
git add base.txt
git commit -qm base
git branch side
printf 'main\n' > main.txt
git add main.txt
git commit -qm main-only
git switch -q side
printf 'one\n' > side.txt
git add side.txt
git commit -qm side-one
printf 'two\n' >> side.txt
git add side.txt
git commit -qm side-two
git rev-list --count main..side
git rev-list --count side..main
git rev-list --left-right --count main...side

最後の三行の結果は、順に2、1、そして左1・右2となる。rev-listは履歴を列挙するためのコマンドで、ここではlogと同じ範囲指定を件数で確かめているよ。

二つのドットは、右にあって左にない履歴

main..sideは、sideから到達でき、mainからは到達できないコミットを選ぶ。この例ではside-oneとside-twoの2件。side..mainなら、逆にmain-onlyの1件になる。

git log --format=%s main..side
git log --format=%s side..main

ブランチ名を書く順序に意味があるので、「二つの枝の差」とだけ覚えないでね。共通のbaseは、どちらの結果にも含まれない。

三つのドットは、片側だけにある履歴を両方

main...sideは、どちらか片側からだけ到達できるコミットを選ぶ。今回はmain側1件とside側2件の合計3件だよ。共通部分は除外される。

git log --left-right --format='%m %s' main...side

左側のmainだけにあるものには<、右側のsideだけにあるものには>が付く。単純な新旧の関係ではなく、両方に固有の変更がある状態を読み取れるね。

git diffへそのまま読み替えない

ここで扱ったのはlog・rev-listが選ぶコミットの集合。git diff A...Bは同じ説明ではなく、共通祖先を基準にB側の差分を見る使い方になる。コマンドが違ってもドットだけで意味を決めないようにしよう。

この例は取り込み・削除・履歴の書き換えを行わない。一時リポジトリは確認後に作業場所を離れ、不要になった練習フォルダーだけを片付けられる。実リポジトリでは、名前がどのコミットを指しているかも先に確認したいね。

2026年10月29日にGit公式の範囲指定と照合し、一時リポジトリで件数とコミット名を検証した。fetchとpull、修正を含むブランチも関連するよ。

参考・出典

公開と変更の記録
  • :初回公開

日時は日本時間です。記載のある変更は、確認できた編集記録に基づきます。更新日の違いだけから変更内容を推測して載せることはありません。

更新・訂正の方針 →

みんなのコメント 0

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。