Git command compatibility

Supported commands, differences, and unsupported features.

mkit supports many Git commands and flags, with the differences listed below. It uses BLAKE3 object IDs and signs every commit. Its storage format and transport protocol are incompatible with .git repositories.

parity Matches Git for the flags in scope.divergent Works, with documented differences.non-goal Intentionally not supported.

Everyday

Stage, commit, inspect, and undo changes.

parity:

init Creates .mkit/ instead of .git/.

divergent:

add Pathspecs, -A, -u, and -p interactive hunk staging. -n/--dry-run is not implemented.

parity:

status --porcelain v1 and v2, -s, -z. Git-compatible 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 moves into a directory and multi-source moves, with Git's -f overwrite guard (a directory destination is never overwritten). Content addressing gives exact rename detection, so status and diff show R like Git (--no-renames turns it off).

parity:

checkout / switch Switch branches (checkout -b/-B, switch -c/-C to create) or restore files. Refuses to overwrite modified 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 supports reorder, drop, reword, squash, and fixup.

parity:

revert Creates an inverse commit and handles conflicts. 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 Rebuilds the branch's reachable first-parent chain (@{N}) and checks it against a tamper-evident Merkle log of commit history. Unlike Git's per-operation reflog, it shows each commit's subject without operation labels and omits commits replaced by amend or reset.

divergent:

blame Supports -L line ranges, a [<rev>] argument, -w, -M/-C move and copy detection (including inline -M<num>/-C<num> thresholds and Git's three-level -C -C -C whole-history search), --ignore-rev fall-through, and Git-compatible --porcelain/--line-porcelain. Move/copy and --ignore-rev attribution follows every real merge parent using Git's per-parent -C candidate mechanism (modified files vs whole tree, porigin-keyed) and Git's ancestor tie-break, pinned against Git 2.50.1. Opt-in --ignore-rev-precise resolves --ignore-rev fall-through by content matching instead of Git's positional per-hunk guess; the default matches Git. Two differences remain: --format=json and --porcelain show an mkit Identity instead of Name <email>, as log does; and blame follows a fixed path, so it does not trace lines across a whole-file rename as Git does (use -C to credit copied blocks).

divergent:

bisect start, good, bad, skip, reset, and run <cmd> (automatic bisect using Git’s 0/125/1-127 exit codes). Prints the next candidate to stdout instead of checking it out; you check it out yourself. run checks out each candidate temporarily, then prints the first bad commit instead of leaving it checked out.

Workspace

Manage linked worktrees, partial checkouts, and stashed changes.

divergent:

worktree add, list, remove, and prune linked working trees. All trees share one object store and one set of refs; each has its own HEAD, index, in-progress operation state, and stash. A branch can be checked out in only one tree at a time. Differences from Git: the stash is per-worktree (Git shares one stash across trees), and move, lock, and 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

Remove untracked files 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. Collects retention roots from every linked worktree.

Plumbing

Low-level commands for scripts and tools.

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 except for hash length.

parity:

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

parity:

symbolic-ref / update-ref Read or repoint HEAD. update-ref accepts <old> for compare-and-swap; -d refuses to delete 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. When names nest (a and a/b both configured), rename keeps the other remote's tracking refs; Git renames them as well.

parity:

push / pull / fetch / clone Use mkit's own transports and protocol, not Git's wire protocol. push is compare-and-swap safe and supports --force-with-lease. fetch/pull support --all (every configured remote); clone supports -b <branch> and -o <name>.

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 will not be supported.

Config and conventions

Git-compatible settings and ignore rules.

parity:

config user.name / user.email Stored and read back, but they do not determine the signing identity.

parity:

config --unset / --local / --global Removes a key from the scope a set would write to (repository or user), or from the scope --local/--global selects. Unsetting a key that is not set succeeds.

parity:

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

divergent:

config http.sslCAInfo Supports Git's CA-file key for native Connect HTTPS remotes only, including RPCs and upload/download streams. MKIT_SSL_CA_FILE overrides it (Git uses GIT_SSL_CAINFO). PEM certificates augment Mozilla roots; chain and hostname verification stay enabled. Invalid files are hard errors. The self-updater uses OS trust and release checksums when present, ignoring both settings; S3 remotes are not yet covered. Browser trust is unchanged.

parity:

.gitignore Reads .gitignore and .mkitignore. Supports **, anchors, negation, and char classes (root-level only; nested ignore files are not yet supported).

parity:

abbreviated hashes Short-prefix resolution and display, as BLAKE3 prefixes.

Repository format differences

Permanent differences in object IDs and repository layout.

Hash length. mkit object IDs are 64 hex characters (BLAKE3); Git's are 40 hex characters (SHA-1). A Git hash never resolves in mkit. Short prefixes and abbreviated display work, as prefixes of the BLAKE3 ID.
Repository directory. mkit stores repository state in .mkit/, not .git/, and does not detect repositories by .git/. An opt-in git alias shim exists but is never installed by default.

Safety differences

Deliberate departures from Git’s defaults that protect local changes, rewritten commits, and the signing identity.

Destructive commands require --force. rm, restore, reset --hard, clean, stash pop, mv, checkout, and worktree remove refuse to destroy modified or untracked content without an explicit -f / --force.
Repository-local identity settings are rejected. Repository config cannot set user.identity or other security-sensitive keys, so a cloned repository cannot redirect signing or transport trust.
Rewrites stay recoverable. commit --amend, reset, and rebase record each replaced commit in a recovery log, and gc keeps it recoverable for the retention window.