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.

parityBehaves like git's in-scope subset today.divergentWorks, with a known, documented difference.non-goalDeliberately not git's behavior.

Everyday

Stage, commit, and undo your everyday changes.

parity:

init Create a repo. The marker is .mkit/, not .git/.

divergent:

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.

parity:

status --porcelain v1 and v2, -s, -z. Git-shaped output, adding T for a mode change.

parity:

diff Worktree, --staged, ranges, --stat, --name-status, -w/-b whitespace modes, -U<n> context, and byte-exact Myers hunks.

parity:

commit -m, -a, --amend, --author. Every commit is signed.

parity:

rm --cached, -r, -f. Refuses to destroy modified content without -f.

parity:

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).

parity:

checkout / switch Switch branches (checkout -b/-B, switch -c/-C to create) or restore files, guarded against clobbering dirty or colliding files.

parity:

restore / reset --staged, --worktree, --soft, --mixed, --hard.

Branches, tags, and merging

Create branches and tags, then merge history back together.

divergent:

branch Create, list, -v, -d/-D, -m. Remote-tracking listing and upstream flags (-r, -a, -u, --unset-upstream) aren't implemented yet.

parity:

tag Lightweight, -a, -s, -m, -d.

parity:

merge / cherry-pick / rebase Full conflict workflow. rebase -i reorders, drops, rewords, squashes, and fixups.

parity:

revert Inverse commit, conflict-aware. Reverting a merge commit is not yet supported.

History and inspection

Read what happened, and find when it changed.

divergent:

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.

parity:

show Commits, trees, blobs, and tags. The diff body matches git; the commit header differs.

divergent:

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.

divergent:

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).

divergent:

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.

divergent:

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.

parity:

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.

parity:

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.

parity:

clean -n, -f, -d, -x, -X. Refuses without -f, matching clean.requireForce.

parity:

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.

parity:

rev-parse --verify, --short, --abbrev-ref, --show-toplevel.

parity:

cat-file -t, -s, -p, --batch. Byte-exact for blobs.

parity:

ls-files / ls-tree ls-files: -s, -z, --others, --ignored, --exclude-standard. ls-tree: -r, -z. Output matches git modulo hash length.

parity:

show-ref / for-each-ref --heads, --tags, --format.

parity:

symbolic-ref / update-ref Read or repoint HEAD. CAS via <old>; -d refuses the current branch.

parity:

merge-base <a> <b> prints the common ancestor; --is-ancestor tests ancestry via exit code.

parity:

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.

parity:

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.

parity:

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.

divergent:

git import One-way, importer-signed translation from a git remote (a downstream fork). Experimental and feature-gated.

divergent:

git export One-way deterministic mirror to git. Experimental and feature-gated.

non-goal:

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.

parity:

config user.name / user.email Accepted and round-tripped, but non-authoritative: they never feed the signed identity.

parity:

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.

parity:

config core.* An inert subset is stored; dangerous keys (sshCommand, pager, editor, hooksPath, fsmonitor) are rejected.

parity:

.gitignore Reads .gitignore and .mkitignore. Supports **, anchors, negation, and char classes (root-level; nested ignore files deferred).

parity:

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.

Hash length. mkit object IDs are 64-hex BLAKE3; git's are 40-hex SHA-1. A git SHA pasted into mkit will never resolve. mkit matches the UX shape (short prefixes, abbreviated display) but not the length.
Repo marker. mkit's state lives in .mkit/, not .git/. Detecting a repo by .git/ is not built into the core; an opt-in git alias shim exists, but is never installed by default.

Safer than git

Where mkit refuses git’s silent-data-loss defaults. Features, not gaps.

No silent data loss. rm, restore, reset --hard, clean, stash pop, mv, checkout, and worktree remove refuse to destroy modified or untracked content without an explicit -f / --force.
A hostile clone can't spoof you. user.identity and other security-sensitive keys are forbidden in repo-local config, so a checked-out repo cannot redirect signing or transport trust.
Rewrites stay recoverable. commit --amend, reset, and rebase record the superseded commit in a recovery log, so gc keeps it recoverable within the retention window.
← back