gitの相対的なコミットの指定、コミットの範囲指定方法

^、~の違いがよくわからなかったので、調べた。

相対的なコミット指定方法

^を用いる方法

主にブランチをマージしたコミットの場合に用いる。
マージしたコミットの場合、以下のように親が2つ以上いることがある。
この際にHEAD^1とすることで一つ目の親、HEAD^2とすることで2つ目の親を指定することができる。
○ー○
○/

~を用いる方法

常に一番目の親を指定する。

まとめ

つまり、HEAD^1とHEAD~1は同じものを指している。これだから混乱してたんだな^^;

範囲指定

ダブルドット
git log [branchname]..[branchname2]

これで[branchname2]にしか含まれていないコミットが抜き出せる。

git log [branchname2] --not [branchname] 
git log [branchname2] ^[branchname]

としても同じ効果が得られる。
これは2つのブランチを指定しているが、3つ以上の場合は

git log [branch1] --not [branch2] [branch3]
git log [branch1] ^[branch3] ^[branch3]

などと指定すれば、上の場合は[branch1],[branch3]には含まれているが、[branch2]には含まれていないコミットが取り出せる。
下の場合には[branch1]には含まれているが、[branch2],[branch3]には含まれていないコミットを取り出せる。

トリプルドット
git log [branch]...[branch1]

これは[branch][branch1]の両方に存在しないコミットを取り出せる。

git log --left-right [branch]...[branch1]

とするとどっちのコミットかわかるようになる.