tanacasinoのメモ

what are you waiting for ?

Git で親が3つ以上あるコミットを作ってみたよ

Git の Commit Objectの parent は存在する。これはGitな人には常識でしょう。 親の事考えないとamendやらrebaseやらが理解不能でしょうから。 Git のコミットオブジェクトの親は 3個以上もあるとかは考えたことあまりないと思います。

例えば親が1つのSingleコミットはこんな内容で一番多いと思う。

$ git cat-file -p 34d5217584ee4722d0c0b07ed6c8f1f01ad157c3
tree 2afc851b60064ef8ef899cb6909a3a1fd0eb3003
parent 12188a82990da099e2f3cf3d37aa4e0362122478
author Junio C Hamano <gitster@pobox.com> 1401317422 -0700
committer Junio C Hamano <gitster@pobox.com> 1401470021 -0700

Git 1.9.4

This is expected to be the final maintenance release for 1.9 series,
merging the remaining fixes that are relevant and are already in 2.0.

Signed-off-by: Junio C Hamano <gitster@pobox.com>

マージコミットの場合は大体のコミットが parent が2つあると思う。

$ git cat-file -p bce14aa132e0064d9a9b1c7ad98e71e22c6e0272
tree bc979e2a998e84450747c2c6f4010cf6c87adaa7
parent d7172825321369cb951dd7bbfc0c12dc4ecbe518
parent 34d5217584ee4722d0c0b07ed6c8f1f01ad157c3
author Junio C Hamano <gitster@pobox.com> 1401472672 -0700
committer Junio C Hamano <gitster@pobox.com> 1401472672 -0700

Sync with 1.9.4

マージコミットは親2つあると聞いてすごいわかりやすいなぁと思っていたら、親が3つ以上もGitでは存在することを知りました・・・・

そんなコミット見たことないし作るタイミングわかんねーよと思っていたら、git本家のリポジトリ内にかのHamanoさんが作っていたので、Gitのユースケース的には当たり前の存在なのであった・・・

$ git cat-file -p 1a8b76912e6ccef6bec3531eec30a0693bc25ae7
tree 0a94b441b8a3d174ce42c100cda67cab42288db0
parent 4bc708347e2b94564d9ec5e0e3a2ab0e3d6b2fd9
parent 88961ef2589433044365213fab98de081a1ce70f
parent 59c8e2cb2aee2e4eb75007602b264bc4e7928bc0
author Junio C Hamano <junkio@cox.net> 1180836294 -0700
committer Junio C Hamano <junkio@cox.net> 1180836294 -0700

Merge branches 'lh/submodules' and 'pb/am'

* lh/submodules:
  Add basic test-script for git-submodule
  Add git-submodule command

* pb/am:
  Remove git-applypatch
  git-applymbox: Remove command

Merge branches 'lh/submodules' and 'pb/am' · 1a8b769 · git/git · GitHub

さて、どうやったらparent が3個以上のマージコミットを作れるのか?

$ git merge br1 br2 br3
$ git cat-file -p c31ba16d5ab4fe530672716f7da668e99cfe9ad7
tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
parent e2da3bb525113a5fec5733b521a7acac6ce7d0f8
parent a6fee63e5b2bb1c0c832e0a906777ebdef582faf
parent f7e4c97f1a2f6909a2168b214b5629211ca25b26
author Tomofumi Tanaka <tanacasino@gmail.com> 1410529022 +0900
committer Tomofumi Tanaka <tanacasino@gmail.com> 1410529022 +0900

Merge branches 'br1', 'br2' and 'br3'

めっちゃ簡単。。。複数のブランチをマージする時ですね。(いやまあ普通に考えてそうなんですが) 必要なタイミングがなくて使ったことがないだけってかんじですね。

GitBucketに親の数が2つとかで条件文書いてしまったコードがある気がするので見なおせねばならぬ。