git commit --allow-emptyで空のコミットを作る

普通、git commit は何かしらの変更(git addとかgit rm)をした後でないとコミットできないですが、--allow-emptyオプションを使うと何も変更せずにコミットをすることができます。
git commit -m "空のコミット" --allow-empty
この「空」という言葉は紛らわしいので要注意です。
「空の(empty)」といっても、本当にコミットオブジェクトの中身が空なわけではありません。
(本当に空だったらauthorやコミット日時などの付随情報を保持できないですよね?)
そうではなくて、単に「前回のコミットからの差分がない」という意味です。

空コミットの中身を見てみる
ではこの空コミットの実体はどうなっているのでしょうか?
git cat-file -pで中身をのぞくことができます。
$ git cat-file -p <コミットハッシュ値>
tree 6b6f3e35d68009dda6a764a6b9ebf40387102d93
parent f47f6f62bda4b7c0e12bdd4151a02937978ac85b
author DQNEO <dqneoo@***.com> 1379315418 +0900
committer DQNEO <dqneoo@***.com> 1379315418 +0900

空のコミット
ご覧のように、空どころかちゃんとtreeオブジェクトや親コミットオブジェクトやauthor情報を保持しています。

ではその親コミットの中身も見てみましょう。
$ git cat-file -p f47f6
tree 6b6f3e35d68009dda6a764a6b9ebf40387102d93
author DQNEO <dqneoo@***.com> 1379315013 +0900
committer DQNEO <dqneoo@***.com> 1379315013 +0900

テストコミットです。
treeのハッシュ値に注目。
親コミットと子コミット(空コミット)で、同じtreeを共有していますね。
treeというのは、いわばコンテンツ群のスナップショットのようなものです。
tree値が同じであることによって、前回からの差分が何もないことがわかります。
カテゴリ: