git subtree のコミット履歴は順番どおりになる

たまたま git subtree を使う機会があったのでメモです。 説明を読むと理論上は時系列が考慮されるように思えましたが、念のため検証したところ、ちゃんとコミットした順番に並ぶことが確認できました。

2つの Git Repositoryを作りました。

  1. subtree-foo
  2. subtree-bar

そして、 foo, bar と交互に commit しています。

f:id:suzusin:20210603004115p:plain
subtree-commits

コミットログの先頭の数字が通し番号になっていて、これが実際の作業順です。

ここで、subtree として foo に bar を追加します。

$ git remote add subtree-bar https://github.com/suzushin54/subtree-bar.git

$ git subtree add --prefix=subtree-bar subtree-bar master
git fetch subtree-bar master
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Total 6 (delta 1), reused 6 (delta 1), pack-reused 0
Unpacking objects: 100% (6/6), 447 bytes | 149.00 KiB/s, done.
From https://github.com/suzushin54/subtree-bar
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> subtree-bar/master
Added dir 'subtree-bar'

$ git log --oneline
2a8292d (HEAD -> master) Add 'subtree-bar/' from commit '5f80d93e873e67467ffc7b0b405c90a8b2413223'
5f80d93 (subtree-bar/master) 4. second commit in bar
c07738d (origin/master) 3. second commit in foo
7702b0a 2. first commit in bar
226cc4e 1. first commit in foo

ちゃんと、1〜4の順番に並ぶことが確認できました。


ついでに、順番を入れ替えたり、foo の Repository から bar のファイルを更新したりしてみました。

それでも特に変わったことはなく、マージコミットが作られる、コンフリクトが発生したら普段どおり解消してコミットする、という通常の開発時における操作で対応できることを確認できました。

$ git log --oneline
23dae13 (HEAD -> master, origin/master) Merge commit '341fc6e882d31032c07e28785c03541cef699af9'
341fc6e (subtree-bar/master) 10. fifth commit in bar
14f9102 9. fifth commit in foo
9c48859 Merge commit 'c04367496b48f971f6a2ce540f3fad2eadbce74c'
04ef6bd 8. fourth commit in foo
c043674 7. fourth commit in bar
04b27d3 Merge commit '7687befaf4b8dbf5ed68b5668bb1996f1acaf51a'
7687bef 6. third commit in bar
6b824b3 5. third commit in foo
2a8292d Add 'subtree-bar/' from commit '5f80d93e873e67467ffc7b0b405c90a8b2413223'
5f80d93 4. second commit in bar
c07738d 3. second commit in foo
7702b0a 2. first commit in bar
226cc4e 1. first commit in foo