Git → prikk: a vocabulary map, not a feature map
If you know Git, prikk’s commands will look familiar and several of them mean something different.
commit does not publish. There is no HEAD, no staging area, no branch switching. seal has no
Git counterpart at all. Reading prikk’s words as Git’s words will make you wrong about several things
at once, and you will not notice, because nothing will error — the commands will simply do something
other than what you expected.
This page is a vocabulary map for a human, not a migration tool. It does not import Git history and does not promise to; the closest active work on that is RFC 113, which is a design for the import contract, and nothing implements it yet.
Command correspondence
| Git | prikk | What differs |
|---|---|---|
git init | prikk init | Same idea: create the repository layout. |
git clone | — | Missing. prikk bundle import reads a bundle file into an untrusted, unmerged remotes/<ref> pointer — it does not create a worktree or a local branch. There is no network transport at all: bundles and sync artifacts are files you move yourself. |
git add (staging) | — | Missing, deliberately. There is no index and no staging area. prikk commit --from-worktree always considers the whole worktree (governed by .prikkignore, which is a flat list of literal path prefixes — no globbing, no negation, unlike .gitignore; see Ignoring Worktree Paths). You cannot stage part of a change. |
git commit | prikk commit --from-worktree -m <message> | Two-phase, not one. commit only queues a signed Patch into a local WAL; nothing is published yet. See Commit versus seal below. The message is stored as signed evidence since 0.32.0 — see Messages are stored. |
| — | prikk seal --allow-no-audit | No Git counterpart. Publishes the queued WAL as a signed Block, moving the branch ref. Nothing is visible to log or a peer before this runs. |
git status | prikk status + prikk worktree-status | Split in two: status reports the repository/WAL/queue state; worktree-status reports the worktree’s own drift against the replay baseline commit would author against. Neither is git status’s single combined view. |
git log | prikk log | Block and ref metadata only — target Block ID, RefState ID, kind, parent/Patch counts, rollback classification. No commit message, author, or date is shown, because none is stored yet (see below). |
git show / git diff | — | Missing. The closest things today are worktree-status (worktree vs. baseline) and merge-evidence’s operation listings — neither renders a content diff. |
git branch | prikk branch list / branch create <name> | List and create work the same way in spirit. |
git branch -d | prikk branch close <name> | Diverged. Closing marks the branch (a schema-2 closed RefState); nothing is deleted or reclaimed, and there is no reopen verb. |
git checkout <branch> / git switch | — | Missing, deliberately — see No HEAD, no switching below. prikk branch’s own --help text says so directly: “there is no branch switch yet, and no current-branch pointer; switching needs a separate, not-yet-designed increment; every command resolves --ref explicitly in the meantime.” |
git checkout -- <path> / git restore | prikk checkout --patch-materialize (and the sibling --snapshot-*/--patch-* flags) | Materializes files for one --ref, plan-first (--plan-only, --snapshot-plan, --patch-plan). No pathspec — it is whole-ref, not a partial restore. |
git tag | prikk tag create <name> --target <ref|block> [-m <message>] | The tag message is persisted — unlike a commit message, TagPayload already carries one. |
git merge | prikk merge-evidence → merge-plan → prikk merge --allow-no-audit | Three explicit steps, not one. merge executes only a merge already proven confluent by evidence; a merge that is not refuses with a witness rather than producing a conflicted worktree. |
git rebase / git cherry-pick | — | Missing. The closest thing to cherry-pick is prikk sync seal --claim <id>, which seals one already-received patch — it cannot take an arbitrary patch from your own history. |
git revert | prikk rollback-preview → rollback-draft --append-inverse -m <message> → rollback-draft-verify → seal | Four explicit steps producing a preimage-exact inverse Patch, rather than one command that also commits. |
git stash / git submodule / git worktree (multiple) | — | Missing. One worktree per repository; nothing analogous to any of the three exists. |
git gc | prikk compact --pointer-index|--received-index|--trust-policy|--all | Diverged, not equivalent. prikk’s object model never deletes an object — compact reclaims stale index and policy records only. There is no object pruning of any kind. |
git fsck | prikk verify [--format json] [--stop-on-first-error] | Broader: object/WAL/ref integrity plus three-valued publication-trust classification in one pass. |
git reflog | — | No user-facing verb. Every ref update is a signed, append-only RefUpdate log entry internally, but nothing surfaces it to a command today. |
git config | — | Missing. Environment variables only (PRIKK_AUTHOR_KEY_ID and its siblings — see Security and Signing Setup); no config file or command exists. |
| N/A — no counterpart | prikk key generate/prikk key public | Draws a fresh Ed25519 seed from the OS CSPRNG, or derives a public key from a seed already held. Git has no equivalent — an SSH key or GPG key is generated with a separate tool entirely. |
| N/A — no counterpart | prikk setup | Composes init, key generation for both roles, trust maintainer add, and the export lines into one command. Nothing in Git bootstraps signing identity this way — git init alone reaches a usable repository because Git commits are unsigned by default. |
git blame / git bisect / git grep | — | Missing. None exists in any form. |
.gitignore | .prikkignore | Diverged, and narrower on purpose. Literal repository-relative path prefixes only — no globbing, no negation, no per-directory files, and it binds only at commit’s worktree walk and worktree-status’s scan, never at replay or verification. |
git remote add / remote tracking | — | Missing. No remote registry or URLs of any kind — see File-based distribution below. |
| N/A — no counterpart | prikk doctor | Health diagnostics with one real repair (--repair-wal-tail); --repair-main-ref is recognized and always refused — there is no implemented repair behind it. |
| N/A — no counterpart | prikk unlock | Lists or clears a held file lock. Nothing in Git needs this because Git has no equivalent lock. |
| N/A — no counterpart | prikk trust maintainer add/remove | Manages the local MAINTAINER trust set. Git has no signer-trust concept at this layer; the closest analogue is a GPG keyring, and it is not the same model. |
Commit versus seal, a two-phase model
Git’s commit does one thing: it creates a commit object and moves the branch pointer in the same
step. prikk splits that into two commands with nothing in between them optional:
prikk commit --from-worktree -m "message" # queues a signed Patch to the local WAL
prikk seal --allow-no-audit # publishes the queue as a Block, moves the ref
A queued-but-unsealed commit is genuinely not part of history yet — it does not appear in log, and
a peer reading your repository cannot see it. You can queue several commits before sealing them
together. There is no Git operation that maps onto commit alone; it is closer to git add plus
git commit --no-verify into a holding area that Git does not have, and seal is the step that
actually behaves like git commit’s publishing half.
No HEAD, no branch switching
There is no current-branch pointer and no working-directory state that says “you are on main.”
Every command that needs a target names it explicitly with --ref. This is not a missing feature
with a planned fix on this page’s own authority — branch’s own --help text states it as a
present-tense limitation: switching “needs a separate, not-yet-designed increment.” If you are used
to git switch or git checkout <branch> changing what subsequent commands operate on implicitly,
expect to write --ref every time instead.
Messages are stored; authors and dates are not
prikk commit -m <message> requires a non-empty message and stores it — since 0.32.0 it is a
signed, identity-bearing field on the Patch itself (Patch schema 4), and prikk log prints it
under its block, one line per patch. Changing a message changes the patch id, exactly as changing an
operation does: it is evidence, not an annotation
(RFC 123).
A patch written before 0.32.0 carries no message and shows no message line — absence, not a
placeholder. Those patches stay readable forever; the message was never recorded and cannot be
attached retroactively.
An author display name and a commit date are still not stored, and the date never will be.
created_at is pinned to zero at every signing site so object ids stay reproducible across machines,
which CI proves by mutating a repository on Windows and Linux and diffing the resulting id lists. A
timestamp inside the identity surface would destroy that property. The display name is a separate,
deferred question (RFC 123 §5). A tag’s message is persisted too — the two commands are now
symmetric in this respect.
File-based distribution instead of remotes
There is no remote registry, no URLs, and no network transport of any kind in the binary. Moving history between repositories is always a file you produce and hand to the other side yourself:
prikk bundle export/import/verify— a complete, self-contained history bundle in one file.prikk sync’ssummary/compare/have/build/accept/pending/sealsubcommands — an incremental, gap-closing exchange, still file-based, still no sockets.
Either way, what you receive lands as an untrusted remotes/<name> pointer — readable by log,
merge-evidence, and merge, but not automatically merged or trusted the way a Git remote-tracking
branch is once fetched.
Claim-to-Source Anchors
| Claim | Source anchors |
|---|---|
commit only queues a signed Patch to the local WAL; seal publishes it as a Block and moves the branch ref. | node_authoring.rs, seal.rs |
There is no current-branch pointer or HEAD; every command resolves --ref explicitly. | branch.rs, commands.rs |
commit -m’s message is stored as an identity-bearing Patch field since 0.32.0; tag create -m’s message is persisted too. | main.rs, payload/tag.rs, RFC 123 |
There is no staging area; commit --from-worktree always considers the whole worktree, filtered only by .prikkignore. | worktree_files.rs, ignore.rs |
No remote registry or network transport exists; distribution is bundle export/import/verify or sync, both file-based, landing as an untrusted remotes/<name> pointer. | bundle.rs, sync.rs, received.rs |
| Every command named on this page is a real registered command. | commands.rs (COMMANDS), checked mechanically by RFC 118 §8’s rule (A) |
Provenance
Seeded from the external architecture audit’s 2026-08-31 feature-completeness matrix
(audit-2026-08-31-task-1a-design-functionality.md §4), re-verified against main at the time of
writing rather than copied — several rows in that matrix are now stale (worktree-status was broken
then and is fixed; .prikkignore did not exist then and does now). RFC
128
§5 requested this page. It does not cover RFC 113 (history import) or any importer tool — neither
exists yet.