How much of git is here?
mkit matches the git commands and flags you already know. It also adds BLAKE3 addressing, a signature on every commit, and guards against silent data loss. It never shares bytes with a .git repo, so this is parity of behavior, not wire interop.
Everyday
Stage, commit, and undo your everyday changes.
init Create a repo. The marker is .mkit/, not .git/.
add Pathspecs, -A, -u, and -p interactive hunk staging. -n/--dry-run isn't implemented yet — a no-op flag would incorrectly stage, so it's deferred rather than faked.
status --porcelain v1 and v2, -s, -z. Git-shaped output, adding T for a mode change.
diff Worktree, --staged, ranges, --stat, --name-status, -w/-b whitespace modes, -U<n> context, and byte-exact Myers hunks.
commit -m, -a, --amend, --author. Every commit is signed.
rm --cached, -r, -f. Refuses to destroy modified content without -f.
mv Renames or moves files and directories (including move-into-directory and multi-source moves) with git's `-f` file-clobber guard (a directory destination is never overwritten). Content addressing gives exact rename detection, so `status` and `diff` show `R` like git (`--no-renames` to opt out).
checkout / switch Switch branches (checkout -b/-B, switch -c/-C to create) or restore files, guarded against clobbering dirty or colliding files.
restore / reset --staged, --worktree, --soft, --mixed, --hard.
Branches, tags, and merging
Create branches and tags, then merge history back together.
branch Create, list, -v, -d/-D, -m. Remote-tracking listing and upstream flags (-r, -a, -u, --unset-upstream) aren't implemented yet.
tag Lightweight, -a, -s, -m, -d.
merge / cherry-pick / rebase Full conflict workflow. rebase -i reorders, drops, rewords, squashes, and fixups.
revert Inverse commit, conflict-aware. Reverting a merge commit is not yet supported.
History and inspection
Read what happened, and find when it changed.
log Ranges, -n, --oneline, --format=json, --author/--grep (substring), --since/--until, --no-merges, --first-parent. --graph is accepted as a no-op. -p, --stat, --decorate, and --all are not yet implemented.
show Commits, trees, blobs, and tags. The diff body matches git; the commit header differs.
reflog Reconstructs the branch's reachable first-parent chain (@{N}), cross-checked against a tamper-evident commit-history Merkle log — not git's per-operation reflog. Shows each commit's subject but no op labels, and commits superseded by amend/reset aren't listed.
blame Supports -L line ranges, a [<rev>] argument, -w, -M/-C move/copy detection (inline -M<num>/-C<num> thresholds and git's three-level -C -C -C whole-history search), --ignore-rev fall-through, and git-shaped --porcelain/--line-porcelain. Move/copy and --ignore-rev attribution is merge-aware across every real merge parent, implementing git's per-parent -C candidate mechanism (modified-files vs whole-tree, porigin-keyed) with git's ancestor tie-break, pinned against git 2.50.1. Opt-in --ignore-rev-precise uses content matching instead of git's positional per-hunk guess to resolve --ignore-rev fall-through (documented divergence; the default fall-through remains git-identical). Two differences keep it divergent: --format=json and --porcelain carry an mkit Identity, not Name <email> (the same, accepted difference as log); and blame follows a fixed path, so it does not trace lines across a whole-file rename the way git does (use -C to credit copied blocks).
bisect start, good, bad, skip, reset, and run <cmd> (auto-bisect with git’s 0/125/1-127 exit-code contract). Prints the next candidate to stdout rather than auto-checking-out the midpoint (you check it out yourself); run checks out each candidate transiently but still prints the first bad commit rather than parking there.
Workspace
Manage the working copy itself — extra trees, partial checkouts, and shelved changes.
worktree add, list, remove, and prune linked working trees. Every tree shares the one object store and refs; each keeps its own HEAD, index, in-progress-op state, and stash, and a branch can be checked out in at most one tree. Two documented differences from git: the stash is per-worktree (git shares one stash across trees), and move / lock / repair are not yet implemented.
sparse-checkout set, list, disable, reapply over pattern sets (stored in .mkit/sparse-checkout). The sparse clone/fetch that transfers only matching paths is feature-gated.
stash save, list, pop, apply, drop, clear, show. Per-worktree (git shares one stash across trees).
Cleanup and maintenance
Clear out untracked junk and reclaim object storage.
clean -n, -f, -d, -x, -X. Refuses without -f, matching clean.requireForce.
gc Mark-and-sweep, recovery-aware, and fail-closed. Unions retention roots across every linked worktree.
Plumbing
Low-level commands your scripts and tools build on.
rev-parse --verify, --short, --abbrev-ref, --show-toplevel.
cat-file -t, -s, -p, --batch. Byte-exact for blobs.
ls-files / ls-tree ls-files: -s, -z, --others, --ignored, --exclude-standard. ls-tree: -r, -z. Output matches git modulo hash length.
show-ref / for-each-ref --heads, --tags, --format.
symbolic-ref / update-ref Read or repoint HEAD. CAS via <old>; -d refuses the current branch.
merge-base <a> <b> prints the common ancestor; --is-ancestor tests ancestry via exit code.
rev-list Lists commit ids reachable from a revision; --count prints the number.
Remotes and git interop
Sync over mkit's own transports, with one-way bridges to and from git.
remote List (-v), add, remove, rename, get-url, set-url. Accepts mkit+file, mkit+https, mkit+s3, mkit+ssh, plus git+https / git+ssh / git+file bridge remotes. With prefix-nested names (a and a/b both configured), rename preserves the sibling's tracking refs — git's own rename silently drags them to the new name.
push / pull / fetch / clone Over mkit's own transports, with CAS-safe push and --force-with-lease. fetch/pull support --all (every configured remote); clone supports -b <branch> and -o <name>. They speak mkit's protocol, not git's wire protocol.
git import One-way, importer-signed translation from a git remote (a downstream fork). Experimental and feature-gated.
git export One-way deterministic mirror to git. Experimental and feature-gated.
on-disk / wire interop with .git A BLAKE3 object store can't share bytes with git's SHA-1 store. Native push/pull refuse bridge schemes, and bidirectional sync is a permanent non-goal.
Config and conventions
Git-shaped settings and ignore rules that never set your signed identity.
config user.name / user.email Accepted and round-tripped, but non-authoritative: they never feed the signed identity.
config --unset / --local / --global Removes a key from whichever scope a set of it would use (repo vs. user-scoped), or the scope forced by --local/--global. Idempotent on an already-unset key.
config core.* An inert subset is stored; dangerous keys (sshCommand, pager, editor, hooksPath, fsmonitor) are rejected.
.gitignore Reads .gitignore and .mkitignore. Supports **, anchors, negation, and char classes (root-level; nested ignore files deferred).
abbreviated hashes Short-prefix resolution and display, as BLAKE3 prefixes.
Different, and permanent
These fall out of choosing BLAKE3 over SHA-1. They cannot change without dropping content addressing.
Safer than git
Where mkit refuses git’s silent-data-loss defaults. Features, not gaps.