比较行与文件
Graft 有两层 diff:
- repository diff:比较 app-state tree 里的路径
- row diff:把 modified SQLite snapshot 展开成 table/row/schema changes
比较 Worktree 和 Staged
Section titled “比较 Worktree 和 Staged”graft diffgraft diff --jsongraft diff --stagedgraft diff --json --staged按 kind 过滤:
graft diff --kind sqlite_databasegraft diff --kind text_filegraft diff --kind binary_file比较 Commit
Section titled “比较 Commit”graft diff HEAD~1 HEADgraft diff HEAD~1 HEAD data.sqlitegraft diff --json HEAD~1 HEADpath-level 输出会说明每个路径的 change、kind 和 storage。
SQLite Row Diff
Section titled “SQLite Row Diff”graft diff --rows HEAD~1 HEAD data.sqlitegraft diff --json --rows HEAD~1 HEAD data.sqliteJSON 中常见 logical_status:
| Status | 含义 |
|---|---|
logical_changes | 找到支持的 row/schema changes。 |
unsupported_logical_surface | SQLite 变化触及无法完整解释的表面。 |
file_changed_no_supported_logical_changes | 文件变了,但支持的逻辑行和 schema 没有净变化。 |
row_diff_unavailable | 此文件无法产生 row diff。 |
真实 CLI 输出
Section titled “真实 CLI 输出”下面是一次真实 graft 运行捕获到的输出。你本机的 hash 和时间会不同。
$ graft diff --rows HEAD~1 HEAD app.sqliteRow Diff 55c99f73d879..d5cb39df069bmodified: app.sqlite Diff LSN 2 -> 4 ============================
Table 'tasks': +1 inserts ~1 updates ~ rowid 2: old: [Null, Text("record cli output"), Text("open")] new: [Null, Text("record cli output"), Text("blocked")] + rowid 4: [Null, Text("publish docs"), Text("open")]比较两个分支时,输出展示的是从 main 变成 feature/progress 需要的 row changes:
$ graft diff --rows main feature/progress app.sqliteRow Diff d5cb39df069b..89abefbeb063modified: app.sqlite Diff LSN 4 -> 4 ============================
Table 'tasks': +1 inserts -1 deletes ~2 updates - rowid 4: [Null, Text("publish docs"), Text("open")] ~ rowid 2: old: [Null, Text("record cli output"), Text("blocked")] new: [Null, Text("record cli output"), Text("open")] + rowid 3: [Null, Text("add screenshots"), Text("open")] ~ rowid 1: old: [Null, Text("write quickstart"), Text("open")] new: [Null, Text("write quickstart"), Text("done")]普通应用 UI 应使用 repository commits 和 revspecs。LSN 级 debug diff 放在 快照存储与 LSN。