結局「ブランチ」なのか?

Mercurial の場合、Named branch があるから話が混乱するが、これを除外すると、hg heads がブランチ。
で、git の場合、hg heads 以外にも、歴史の途中にも、ブランチがあって、必ずしも hg heads に対応しない、ってことか。
だから、git の場合、ブランチをDBにもって、それを走査するってのも答えでは無いわけか?
取り込み用のIDだけ先に構築して、ってやるとなると、まさしく、hg の incoming, outgoing になっちゃう気がするんだが。
そういえば、git は、push に --dry-run があるけど、hg の incoming って無いよね?
実装としては、ScmHeads みたいなテーブルを作って、ハッシュ値を持って、git の場合は、名前も入れる、か?