What a change id is, and why it survives a rewrite
chg: identity versus blake3: commit identity, and how to trace one.
Written By Dustin
Last updated 28 minutes ago
TOVIO has two identifiers, and understanding the split explains most of what feels different.
Commit id — blake3:
A content hash. It identifies an exact snapshot. Change the content in any way and you get a different commit id, necessarily. Written blake3:<hex>; the bare hex is accepted wherever an address is.
Change id — chg:
A random 128-bit identifier minted when the change is created, unrelated to its content. Written chg:<base32>. Every tovio change subcommand also accepts the bare base32 body without the prefix; tovio switch does not — there a bare body is read as a lane name. Amend the change, rebase it, split it, absorb into it, cherry-pick it — the id stays.
Why this matters
In Git, everything attaches to commit hashes, so rewriting history orphans it all: reviews, comments, references from colleagues, links in a tracker. This is why teams develop rules against rebasing shared branches.
In TOVIO those attach to the change. Rebase a change under review and it is still the same change under review. Blame attributes a line to the change that wrote it, not to the commit that happens to carry it today. Most of the rules Git teams need stop being necessary.
Working with them
tovio change show chg:a3f7b2tovio change listtovio logFollowing one across a rewrite
tovio explain change chg:a3f7b2tovio explain change chg:a3f7b2 --format html > trace.htmlThe change-identity tracer: every commit that has carried this id, and every amend, rebase, squash or absorb that moved it. This is the tool for "the hash changed — is this still my change?" The answer is yes, and this shows the path.
Where you will see them
Change ids appear in log, blame, status, every --json payload, and both editor extensions, which offer a "Copy Change ID" action.