git logのrange指定

git logのRevisionを指定するとき、指定した範囲よりも前のRevisionからBranchを切っていて、そのBranchをMergeしたのが指定した範囲内だった場合にどう動くのだろうか?と思ったので調べてみた。

サンプルとして適当なリポジトリを作成した。コミットツリーは以下のようになっている。

少し長々としているが、想定状況はこんな感じ。

  • RepositoryはGit flowのルールで運用している。
  • 以前にv0.1.0をリリースしており、現在はv0.2.0をリリースしたばかり。

v0.2.0で開発したCommit一覧を取得したいけれど、v0.2.0にはv0.1.0時代からの修正(v0.1.0時点からのBranch)であるfeature/func12をMergeしている。このとき、feature/func12のCommitは一覧にあらわれるか否か?

「 ですよねー」という結果になりましたが、もちろん現れます。

git log a..bとしたとき、aからbまでのCommit一覧なので、bに含まれていてaに含まれていないCommitを表示します。

feature/func11は途中で一度mergeしているので、もう少しわかりやすい例としてこれを使います。

c8fd460は「0836fd6 add func11.txt」を知っているので一覧に表示されませんが、c8fd460の1つ前である00f05c1は0836fd6を知らないので一覧に表示されます。

git diffでも同様です。v0.1.0で修正したファイルの一覧が欲しい場合やv0.2.0での修正ファイル一覧が欲しい場合は以下のようになります。

これだけ長々と書いてあれなのですが、この仕様についてGitドキュメントのgitrevisionのページににしっかり書いていますね。

<rev1>..<rev2>

Include commits that are reachable from <rev2> but exclude those that are reachable from <rev1>. When either <rev1> or <rev2> is omitted, it defaults to HEAD.

では。