git log ancestry-pathについて

git logの–ancestry-pathオプションがよくわからなかったので調べて見た。

まずこんな感じのコミットログを考える

*   e3b7b68 2019-02-03 togai-r  (HEAD -> master) I
|\
| * 659e5da 2019-02-03 togai-r (br-1) H
| * bcb7e69 2019-02-03 togai-r G
| |\
| | * a8b93fa 2019-02-03 togai-r (br-2) D
| * | 9103739 2019-02-03 togai-r E
| |/
| * 71c4055 2019-02-03 togai-r B
* | 2a3c429 2019-02-03 togai-r F
|/
* 7963add 2019-02-03 togai-r A

ここでgit log –graph –oneline 9103739..e3b7b68を実行すると、以下が出力される。

*   e3b7b68 (HEAD -> master) I
|\
| * 659e5da (br-1) H
| * bcb7e69 G
| * a8b93fa (br-2) D
* 2a3c429 F

git logに<rev1>..<rev2>とrevisionを2つのドットで繋いで範囲にすると、「<rev2>の祖先のログから<rev1>の祖先を減算したログ」を出力する。

ここでgit log –graph –oneline –ancestry-path 9103739..e3b7b68を実行してみよう。

* e3b7b68 (HEAD -> master) I
* 659e5da (br-1) H
* bcb7e69 G

a8b93faと2a3c429コミットがログから消えた。–ancestry-pathをつけていない状態ではa8b93faと2a3c429があったのに、つけるとa8b93faと2a3c429が消えた。この2つのリビジョンの法則性としては2つのドットの前に指定した9103739の子孫ではないということだ。

–ancestry-pathの働きは、「2つのドットの後ろにつけたリビジョンの子孫でないものを削除する」というものになる。

つまり、git log –ancestry-path <rev1>..<rev2>は、「<rev2>の祖先から<rev1>の祖先を削除し、さらに<rev1>の子孫でないものを削除する」意味になる。

これは結果的になにをしているかというと、「<rev1>から<rev2>の間にあるコミットだけ抽出」という結果になる。

2つのリビジョン間にあるコミットだけを抽出したい時、git log –ancestry-path <rev1>..<rev2>は便利に使うことができる。

参考文献

https://stackoverflow.com/questions/36433572/how-does-ancestry-path-work-with-git-log

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.