Find who changed a line and why

tovio blame, with rationale and run record.

Written By Dustin

Last updated 34 minutes ago

tovio blame <file>

Attributes each line to the change that introduced or last modified it. Because attribution is to a change rather than a commit, it survives rebases and amends โ€” the id you get back still resolves after history moves. A line inherited unchanged from the base shows as (base).

Every flag

FlagWhat it adds
--whyAfter the line attribution, the attested rationale for each owning change โ€” the reasoning behind those lines.
--sessionAfter the line attribution, each owning change's run record: the originating prompt and the ordered turns. Independent of --why.
--first-parentAttribute along the first-parent line only โ€” the lane-summary reading, and the cheaper walk. The default follows every parent, so a line that arrived on a landed lane is credited to the change that wrote it.

The version worth using

tovio blame <file> --why

โ€œWho wrote thisโ€ is rarely the real question; โ€œwhy is this hereโ€ is, and this answers it directly instead of sending you to dig through history. A change with no recorded rationale says so rather than guessing.

Where blame has nothing to say

Line-level attribution needs clear text. A protected file, a large or binary file, and an empty file all produce no line attribution โ€” blame tells you that rather than printing an empty result. For a protected file, use tovio log <path> and tovio change show instead.

Following up

tovio change show <id>

Takes the change id from blame output and gives you the full picture โ€” author, time, provenance, rationale, files changed, and with --diff the whole patch.

In the editor

The VS Code extension exposes this as inline blame and a โ€œWhy This Line?โ€ hover, which is usually where you want it.

Where to find it

blame is Advanced-tier, so it is hidden from the default tovio help index. It still runs โ€” tovio help --all lists it, and tovio help blame prints its full help regardless of tier.