# Git operation state matrix — method This edition compiles original observations from independent synthetic repositories, checks command semantics against the Git 2.56.0 documentation and records each result with its source and UTC observation time. JSON is canonical; CSV protects text values that spreadsheet software could interpret as formulas. Observations are CC BY 4.0 and original example code is MIT licensed. ## Execution Every case creates a separate temporary repository with two initial commits, then makes only its declared preparation changes. No external remote is contacted. The configured author and committer are Example Author . TZ is UTC; author and committer dates are fixed at 2026-10-25T12:00:00Z. Configuration and templates are isolated. Git must report exactly 2.56.0. The published run records contain the actual runtime, OS and architecture, without local machine details. The twenty case wrappers call matrix.py. Each case records setup, the selected operation, its exit code and assertions. Each current result has two matching fresh-repository executions. This revision reran R03, R09, R11, R16 and R20 after changing their inputs or command text; the other fifteen recorded results are unchanged. Observation timestamps naturally differ. This establishes reproducibility for these cases, not for arbitrary repositories or every supported operating system. ## State definitions HEAD is the full commit ID. The index hash is SHA256 of the exact bytes from git ls-files --stage -z. It describes staged entries, including unmerged stages, without filesystem cache timestamps. It is not the hash of the binary index file. Every working file has a byte-level SHA256; a second hash covers the sorted relative-path-to-hash mapping. Files below .git are excluded. The status column preserves porcelain v1 columns; an empty value is clean. A null branch means detached HEAD. Commit counts follow HEAD; stash counts count listed entries. Each factual cell identifies its original run record and observation time. Its documentation URL separately identifies the command reference. Do not interpret a documentation citation as evidence that a private repository hash appears in the manual. Unknown data would remain null rather than be inferred; no unknown outcome is hidden as a passing assertion. ## Boundaries Cases use text files and isolated local histories. Network authentication, hosted services, submodules, ignored-file stash behavior, expired reflogs, garbage collection and every conflict shape are outside this edition. Successful apply and pop cases do not establish conflict outcomes. Recovery restores a unique committed tip still present in the HEAD reflog; it does not recover never-committed edits. Release checks separately exercise marker-based git add --resolved with explicit paths, two text conflicts and an unrelated tracked edit. Untouched binary and modify/delete conflicts are also staged, retaining the current side in the declared cases; absence of conflict markers is not a correct-resolution check. Resolve binary and delete conflicts yourself, then inspect git diff --cached before committing. A cached diff can be empty when the current side was retained. Additional checks compare plain stash apply with apply --index in separate clean repositories, and test git branch --delete-merged with synthetic remote-tracking refs. Plain apply does not restore the original staged/unstaged split; --index attempts to reinstate it and may fail when conflicts prevent that. These checks are not extra matrix rows. They preserve their own logs and limits in release-checks.json. R03 deliberately gives HEAD, the index and the working file different contents. Unstaging replaces the index entry with HEAD while retaining only the working file’s version; save a needed staged diff before running it. R20 now uses an ordinary sibling worktree path and verifies that the relative-worktree extension is unset and repository format remains zero. R16’s quoted reflog expression was executed through a POSIX shell; PowerShell was not run. ## Updating Keep the version-pinned scripts and records together. Run all cases and release checks after changing the supported Git version, review changed assertions, and issue a new dated edition. Never silently combine results from different runtime versions. Recompute hashes after an edition changes.