まず基本的なこととして、 Git subtree は Git subtree merge と同じものではありません。 subtree merge はマージ戦略として subtree を指定したマージにすぎませんが、 Git subtree は明確に外部ライブラリの取り込みと submodule の代替を目的として設計された機能です。 Git 1.7.11 以降であれば、 Git subtree を使用するのが望ましいでしょう。
なぜなら、 Git subtree には、 Git subtree merge にはない、下記のような機能があるからです。
- 取り込んだライブラリ側の歴史を"潰し"(squash)てコンパクトな歴史にできる。
- 自分のプロジェクトでライブラリ側に変更を加えた場合、それをライブラリ側(上流)のリポジトリにプッシュしたり、プルリクエストしたりできる。
- ライブラリの取り込みの初期化のためのコマンドが用意されており、3コマンドぐらい要するところを1コマンドで直観的に実施できる。
あとは、比較的小さな利点ですが、下記の特徴があります。
- Squash したライブラリの歴史には、途中経過のすべては保存していないので、無駄なディスク容量を食わない。(ハッシュだけ記録している)
- Squash の有無に関わらず、 Git subtree を実施したリポジトリは、 Git subtree に対応していないバージョンの Git でも扱える。たとえば Git subtree 担当者以外は、中央リポジトリや、他のプロジェクトメンバーの Git のバージョンが古くても運用できる。(ただ、 Git subtree に関係するコマンドが打てないだけ)
Git subtree の使い方については、 Atlassian Blog の下記エントリがもっともよくまとまっています。
しかし、原文が英語の日本語翻訳版なので、あらためて噛み砕いて違った角度から説明してみようと思います。