LT概要「GitとMercurialのリポジトリ構造の違いと歴史改変について」SCMBootCamp in Tokyo

SCMBootCamp in Tokyo 開催しました。KPT公開。 - うさぎ組にて手ぶらLTをしたので資料はないが、内容を軽くまとめておく。

GitとMercurialの比較

Git Mercurial
リポジトリ commit objectのグラフと、branchのHEAD,tagなどの参照で出来ている。 commit objectのグラフだけで出来ている。
歴史改変サポート デフォルトであり。 デフォルトではなし。extensionが必要。
歴史改変 新しいcommit objectグラフを作成し、参照を古いHEADから新しいHEADに移す。表面上要らない歴史の削除として使われるresetはHEADの移動のみを行う。 新しいcommit objectグラフを作成し、古いcommit objectグラフをリポジトリから除去する。要らない歴史の削除として使われるstrip(MQExtension)は対象のcommit objectグラフをリポジトリから除去する。
改変前の歴史の参照方法 reflogを使えばGCされる前のcommit objectは作成時昇順で全部見える。「今の私にはね、過去と未来の全てが見えるの。かつてあった宇宙も、いつかあり得るかもしれない宇宙も、みんな」 基本的に見ることは出来ない。
改変失敗時の復旧 reflogを見て改変前にHEADだったcommit objectをreset --hardすれば良い。 bundle backup等があれば失敗した改変後commit objectグラフをstripで除去後、import出来る。

Mercurialで安全に歴史改変するコツ

ある特定のリポジトリの中に閉じた話に限定すれば、Mercurialの歴史改変はGitのそれに比べてずっと危険。
回避したい場合は、元のchangesetsを保持するoptionを付けて行い、正常に出来たことを確認した上で古い方の歴史をstripで削除すること。

伝えたかったこと

GitとMercurialの機能には表面的に似ているものは多いし、ポリシーの違いもextensionによって乗り越えられるように見えるが、
内部はぜんぜん違うのだから、表面的に似ているのと本質的に似てるのは違うって事を自覚し、気を付けること。
特にGitとMercurialのコマンド対応表といったものを鵜呑みにするのはやめること。