Skip to content

Scenario Browser

Filter, search, and copy snippets for every scenario in one place. The data is generated from the package registry at build time — the same allScenarios array spinUpScenario reads from. Add a scenario in the source and it shows up here next build.

Each card has a commit graph view — the real git log --graph output, captured at build time by materializing the scenario. Because every scenario is byte-identical (and therefore hash-identical) on every run, the short hashes you see here are exactly the ones you’ll get locally.

46 of 46 scenarios
  • freshly-initialized repo, no commits, no files, no remotes

    emptyedge-caseunborn
    6 contracts
    • HEAD is unborn (no commits)
    • main is the current branch
    • working tree is empty
    • no remotes configured
    • no tags
    • no stashes
  • feature branch with 4 commits, clean worktree, ready to open a PR

    feature-branchpr-readycleanahead
    4 contracts
    • main has 3 commits
    • feat/widget-v2 is checked out
    • feat/widget-v2 is 4 commits ahead of main
    • worktree is clean
    commit graph · 7 lines
    * 0d92e8f (HEAD -> feat/widget-v2) docs: document widget-v2 API and migration path
    * 7e06c32 test: cover widget-v2 happy path and edge cases
    * 4a4ba62 feat: expose widget-v2 from public index
    * 7ef2a30 feat: add widget-v2 entry point and types
    * 8f8c1d3 (main) test: add baseline widget tests
    * 3377978 feat: scaffold widget module
    * 51d305e chore: initial commit
  • main + feat/x (1 commit ahead, src/feature.ts)

    feature-branchminimalahead
    5 contracts
    • main has 1 commit
    • feat/x is checked out
    • feat/x has 1 commit on top of main
    • src/feature.ts exists
    • worktree is clean
    commit graph · 2 lines
    * 7d4e915 (HEAD -> feat/x) feat: add feature module
    * 26c2b1e (main) chore: initial commit
  • feature branch with 8 varied commits (feat/fix/chore/docs/refactor/test)

    feature-branchmulti-commithistory
    4 contracts
    • main has 2 commits
    • feat/dashboard is checked out
    • feat/dashboard has 8 commits on top of main
    • worktree is clean
    commit graph · 10 lines
    * 7e70f15 (HEAD -> feat/dashboard) feat: add dashboard export-to-csv action
    * 8dc878e chore: bump dev dependencies
    * e65142a docs: document dashboard configuration
    * a1f5fd4 refactor: extract dashboard data-fetch into hook
    * d1545d7 fix: dashboard refresh interval respects user setting
    * 0448e2b test: cover dashboard reducer
    * 60ff18b feat: wire dashboard to data source
    * a6e44d1 feat: add dashboard layout
    * 5c57eab (main) chore: baseline app shell
    * 36b092a chore: initial scaffold
  • baseline scaffold + a single feat commit, clean worktree

    feature-branchminimalhistory
    4 contracts
    • main has 2 commits
    • commit subjects are "chore: initial commit" and "feat: add feature module"
    • src/feature.ts exists
    • worktree is clean
    commit graph · 2 lines
    * 7d4e915 (HEAD -> main) feat: add feature module
    * 26c2b1e chore: initial commit
  • main + gh-pages with no shared history (orphan branch)

    orphanunrelated-historygh-pages
    4 contracts
    • main has 2 commits
    • gh-pages is checked out
    • gh-pages has 1 commit
    • main and gh-pages share no common ancestor
    commit graph · 3 lines
    * 0895935 (HEAD -> gh-pages) docs: scaffold gh-pages site
    * d0a705b (main) feat: add module
    * 3e7cbf7 chore: initial commit
  • main tracks origin/main, both at the same commit, worktree clean

    upstreamtrackingsyncedremoteclean
    5 contracts
    • main is checked out
    • main has 3 commits
    • origin/main exists at the same commit as main
    • main is configured to track origin/main
    • worktree is clean
    commit graph · 3 lines
    * 6e30e6b (HEAD -> main, origin/main) feat: two
    * c9e8aea feat: one
    * 7520170 chore: initial
  • main is 3 commits ahead of origin/main, worktree clean

    upstreamtrackingaheadremote
    5 contracts
    • main is checked out
    • main has 6 commits
    • main is 3 commits ahead of origin/main
    • main tracks origin/main
    • worktree is clean
    commit graph · 6 lines
    * e27a9c8 (HEAD -> main) feat: ahead three
    * afb7f71 feat: ahead two
    * a2b6066 feat: ahead one
    * 0d8eaf9 (origin/main) feat: baseline two
    * f269069 feat: baseline one
    * 7520170 chore: initial
  • main is 3 commits behind origin/main, worktree clean

    upstreamtrackingbehindremotefast-forward
    5 contracts
    • main is checked out
    • main has 2 commits
    • main is 3 commits behind origin/main
    • main tracks origin/main
    • worktree is clean
    commit graph · 5 lines
    * 2237af0 (origin/main) upstream feat three
    * 0890736 upstream feat two
    * 4fe142e upstream feat one
    * e657666 (HEAD -> main) feat: shared baseline
    * 7520170 chore: initial
  • main is 2 ahead AND 2 behind origin/main, worktree clean

    upstreamtrackingdivergedremote
    5 contracts
    • main is checked out
    • main has 4 commits
    • main is 2 ahead and 2 behind origin/main
    • main tracks origin/main
    • worktree is clean
    commit graph · 7 lines
    * a64cf51 (HEAD -> main) local N
    * 3d6bc88 local M
    | * 6b28d74 (origin/main) upstream Y
    | * 2b2b356 upstream X
    |/  
    * e657666 feat: shared baseline
    * 7520170 chore: initial
  • five local branches in five different upstream sync states (behind / ahead / diverged / synced / no-upstream); HEAD on the behind branch

    upstreamtrackingshowcaseremote
    8 contracts
    • main is checked out
    • main is 2 commits behind origin/main
    • feat/ahead-only is 3 commits ahead of origin/feat/ahead-only
    • feat/diverged is 2 ahead and 2 behind origin/feat/diverged
    • feat/synced is at the same commit as origin/feat/synced
    • local-only has no upstream configured
    • all four tracked branches have branch.<X>.remote = origin
    • worktree is clean
    commit graph · 18 lines
    * f5f2e63 (local-only) wip: local-only experiment
    | * a0d340e (feat/diverged) local: diverged 2
    | * a3e16ed local: diverged 1
    |/  
    | * 9899a93 (feat/ahead-only) feat: ahead three
    | * 1fb5f8e feat: ahead two
    | * 9f3f5cc feat: ahead one
    |/  
    | * c7736d0 (origin/main) upstream: main 2
    | * 867156f upstream: main 1
    |/  
    | * e334429 (origin/feat/synced, feat/synced) feat: synced-branch work
    |/  
    | * bd9cfd5 (origin/feat/diverged) upstream: diverged 2
    | * 6a8b392 upstream: diverged 1
    |/  
    * 7443f6e (HEAD -> main, origin/feat/ahead-only) feat: shared baseline module
    * 3657d81 chore: initial commit
  • origin + upstream remotes; main tracks upstream/main, feat/fork-work tracks origin

    forkmulti-remotetrackingremote
    7 contracts
    • origin and upstream remotes are configured
    • feat/fork-work is checked out
    • main tracks upstream/main
    • feat/fork-work tracks origin/feat/fork-work
    • feat/fork-work is 2 commits ahead of origin/feat/fork-work
    • main and upstream/main are at the same commit
    • worktree is clean
    commit graph · 5 lines
    * ad1e759 (HEAD -> feat/fork-work) feat: fork work two
    * 6ba3e46 feat: fork work one
    * 59f2ca6 (origin/feat/fork-work) feat: scaffold fork work
    * a0dbf3b (upstream/main, main) feat: baseline
    * 5eb70f1 chore: initial
  • HEAD detached at main~2, worktree clean

    detached-headedge-case
    5 contracts
    • HEAD is detached
    • main still exists as a branch
    • main has 4 commits
    • HEAD is 2 commits behind main
    • worktree is clean
    commit graph · 4 lines
    * 34c4535 (main) feat: three
    * 3c9536f feat: two
    * 1ab1c9c (HEAD) feat: one
    * 7520170 chore: initial
  • repo configured to require signed commits (commit.gpgsign=true + signingkey set)

    signingconfiggpg
    5 contracts
    • main is checked out
    • main has 3 commits
    • commit.gpgsign is true
    • user.signingkey is set
    • worktree is clean
    commit graph · 3 lines
    * 3c9536f (HEAD -> main) feat: two
    * 1ab1c9c feat: one
    * 7520170 chore: initial
  • experimental commit dropped from main, reachable only via reflog

    reflogrecoverydangling
    4 contracts
    • main has 2 commits
    • worktree is clean
    • the experimental commit is not reachable from any branch
    • the experimental commit is recoverable via the reflog (HEAD@{1})
    commit graph · 2 lines
    * dca4ab1 (HEAD -> main) feat: keep this
    * 7520170 chore: initial
  • main reset 2 commits back; former tip recoverable via main@{1}

    reflogrecoveryreset
    4 contracts
    • main has 2 commits
    • worktree is clean
    • the former tip (4th commit) is not reachable from main
    • the former tip is recoverable via main@{1} in the reflog
    commit graph · 2 lines
    * 1ab1c9c (HEAD -> main) feat: one
    * 7520170 chore: initial
  • mid-bisect operation

    20-commit history with `git bisect` started, HEAD at midpoint

    bisectin-progress
    4 contracts
    • main has 20 commits
    • a bisect is in progress
    • HEAD is detached
    • no bisect decisions logged yet
    commit graph · 20 lines
    * 15b968b (main) feat: step 19
    * 776dd30 feat: step 18
    * a99fde7 feat: step 17
    * 8bd95f6 feat: step 16
    * 0355588 feat: step 15
    * 9158a8d feat: step 14
    * 4f6883e feat: step 13
    * a47e02b feat: step 12
    * 254b819 feat: step 11
    * 5bc0d05 feat: step 10
    * 7f298e0 (HEAD) feat: step 9
    * b3adf88 feat: step 8
    * feb4808 feat: step 7
    * 6bdf65e feat: step 6
    * 533991d feat: step 5
    * 7f97f0c feat: step 4
    * e368ff3 feat: step 3
    * de6b63b feat: step 2
    * 92f90a2 feat: step 1
    * 06a10b7 chore: initial scaffold
  • in-progress merge with one unresolved conflict in src/widget.ts

    conflictmerge
    4 contracts
    • main is checked out
    • a merge is in progress (MERGE_HEAD exists)
    • src/widget.ts has unresolved conflict markers
    • exactly 1 unresolved conflict
    commit graph · 5 lines
    * a9cd5e1 (HEAD -> main) feat: rename widget on main
    | * 4be74e3 (feat/x) feat: rename widget on feat/x
    |/  
    * 43bb961 feat: baseline widget
    * f1f1793 chore: initial scaffold
  • in-progress rebase with one unresolved conflict in src/config.ts

    conflictrebase
    4 contracts
    • a rebase is in progress (.git/rebase-merge/ exists)
    • REBASE_HEAD is set
    • src/config.ts has unresolved conflict markers
    • exactly 1 unresolved conflict
    commit graph · 5 lines
    * 36f0bb6 (HEAD, main) feat: switch to production env
    | * fb0615b (feat/refactor) refactor: use staging env
    |/  
    * 2de6c56 feat: baseline config
    * 8b3fa17 chore: initial scaffold
  • in-progress cherry-pick with one unresolved conflict in src/utils.ts

    conflictcherry-pick
    4 contracts
    • main is checked out
    • a cherry-pick is in progress (CHERRY_PICK_HEAD exists)
    • src/utils.ts has unresolved conflict markers
    • exactly 1 unresolved conflict
    commit graph · 5 lines
    * 9668eb6 (HEAD -> main) feat: use UTC string for dates
    | * 04126d9 (feat/hotfix) fix: use locale string for dates
    |/  
    * ebd06d3 feat: baseline utils
    * 1e9b280 chore: initial scaffold
  • in-progress revert with one unresolved conflict in src/service.ts

    conflictrevert
    4 contracts
    • main is checked out
    • a revert is in progress (REVERT_HEAD exists)
    • src/service.ts has unresolved conflict markers
    • exactly 1 unresolved conflict
    commit graph · 3 lines
    * 26066af (HEAD -> main) feat: add role field and deleteUser method
    * 16aeb7f feat: add email field and listUsers method
    * 44eebf1 feat: add user service
  • in-progress merge with a rename/rename conflict (orig.txt → two different names)

    conflictmergerename
    6 contracts
    • main is checked out
    • a merge is in progress (MERGE_HEAD exists)
    • orig.txt was renamed to main-name.txt on main and to feat-name.txt on feat/x
    • main-name.txt and feat-name.txt both exist in the worktree (no conflict markers)
    • orig.txt is absent from the worktree (DD — deleted by both sides)
    • at least 2 unresolved conflicts (AU/UA/DD index entries)
    commit graph · 5 lines
    * 5ef56bd (HEAD -> main) refactor: rename orig.txt to main-name.txt
    | * 78644df (feat/x) refactor: rename orig.txt to feat-name.txt
    |/  
    * 740a739 chore: add shared file
    * f4ee0a9 chore: initial scaffold
  • in-progress merge with a delete/modify conflict on src/component.ts

    conflictmergedelete
    5 contracts
    • main is checked out
    • a merge is in progress (MERGE_HEAD exists)
    • src/component.ts was deleted on main but modified on feat/x
    • src/component.ts exists in the worktree with feat/x content (no conflict markers)
    • exactly 1 unresolved conflict (DU status: deleted by us, modified by them)
    commit graph · 5 lines
    * 3685503 (feat/x) feat: update component to v2
    | * da99c48 (HEAD -> main) refactor: remove component
    |/  
    * 6626e42 feat: add component
    * f4ee0a9 chore: initial scaffold
  • in-progress merge with an add/add conflict on src/config.ts

    conflictmergeadd
    5 contracts
    • main is checked out
    • a merge is in progress (MERGE_HEAD exists)
    • src/config.ts was independently added on both branches with different content
    • src/config.ts has unresolved conflict markers
    • exactly 1 unresolved conflict (AA status: added by both)
    commit graph · 4 lines
    * 3c5fcfd (HEAD -> main) feat: add config for production
    | * d9e1e2e (feat/x) feat: add config for development
    |/  
    * f4ee0a9 chore: initial scaffold
  • interactive rebase paused at an edit action with 2 remaining picks

    rebaseinteractivein-progress
    4 contracts
    • a rebase is in progress (.git/rebase-merge/ exists)
    • .git/rebase-merge/interactive exists
    • HEAD is detached
    • .git/rebase-merge/git-rebase-todo has at least 1 remaining pick
    commit graph · 4 lines
    * a0afc60 (main) feat: add module c
    * 895b026 feat: add module b
    * 8c99000 (HEAD) feat: add module a
    * f4ee0a9 chore: initial scaffold
  • a successful --no-ff merge of feat/x into main, fully committed

    mergeno-ffhistory
    5 contracts
    • main has the merge commit at HEAD
    • HEAD has 2 parents
    • worktree is clean
    • main is checked out
    • feat/x exists and is merged into main
    commit graph · 6 lines
    *   34a6587 (HEAD -> main) Merge branch feat/x
    |\  
    | * ad8c9b1 (feat/x) feat: add x
    |/  
    * d37e34b feat: baseline a
    * 7520170 chore: initial
  • multi-branch history that exercises bucket dividers, type coloring, branch chips, lane topology

    historymergemulti-authorshowcase
    6 contracts
    • main is checked out
    • feat/wip exists and is NOT merged into main
    • two --no-ff merge commits sit on main (feat/auth, feat/payments)
    • worktree is clean
    • commits span at least 6 distinct date buckets (today through 2 older months)
    • commit messages cover feat / fix / chore / docs / refactor / test / perf / revert and a breaking-change `!:`
    commit graph · 28 lines
    * 9109b4b (HEAD -> main) feat(search): trigram-based subject filter
    * 25ced15 revert: temporary rollback of v1-shim removal
    * 7f089dd chore: tidy imports
    * 069596f fix!: drop deprecated v1 endpoints
    | * 8fba97e (feat/wip) chore(search): prototype lookup cache
    | * e8cee63 feat(search): experimental trigram backend
    |/  
    * 3e8e574 perf(db): index user_id on sessions
    * b8a15ab fix(db): retry on transient timeout
    * 86bab4d perf(api): cache compiled route matcher
    *   7a4ec73 Merge branch 'feat/payments'
    |\  
    | * d8ef61a (feat/payments) test: cover stripe checkout flow
    | * 2d6e7f2 fix(payments): handle 3D-secure redirect
    | * f79b8c7 feat(payments): stripe checkout adapter
    |/  
    * 0e4d041 docs: contributor guide
    * 12d70a4 chore(deps): bump simple-git to 4.x
    * c36d837 fix(api): route precedence for catch-all
    * 1b20d70 refactor(api): centralise error shapes
    *   93086cc Merge branch 'feat/auth'
    |\  
    | * 8e0a6d9 (feat/auth) test: cover session edge cases
    | * cb2679f feat(auth): session middleware
    |/  
    * c0321ac docs: project README and contributor guide
    * d079bc9 feat(api): public router skeleton
    * 80328cd Initial scaffold
  • 6-commit history with every branch-tip-chip variant visible at once (HEAD, local, slashy-local, two remotes, tag)

    renderingshowcasechipshistory
    10 contracts
    • main is checked out
    • main has 6 commits
    • develop branch exists at commit 2
    • feat/widgets branch exists at commit 4
    • origin/main exists at commit 5
    • upstream/main exists at commit 3
    • tag v0.1.0 exists at commit 1
    • main is 1 commit ahead of origin/main
    • main tracks origin/main
    • worktree is clean
    commit graph · 6 lines
    * 7476241 (HEAD -> main) feat: widget tests
    * 0ca3242 (origin/main) feat: widget interactions
    * 7f6d04d (feat/widgets) feat: add widget module
    * c4e9179 (upstream/main) refactor: extract helpers
    * af22682 (develop) feat: scaffold core module
    * 2cbc857 (tag: v0.1.0) chore: initial commit
  • shallow repo with only 3 of 10 commits reachable from HEAD

    shallowhistory
    4 contracts
    • main is checked out
    • repo is shallow (git rev-parse --is-shallow-repository = true)
    • main has 10 total commits in object store
    • only 4 commits are reachable from HEAD (depth boundary inclusive)
    commit graph · 4 lines
    * e5dcc92 (HEAD -> main) chore: release v1.0.0
    * c6d192f docs: update readme
    * 5059beb test: add test suite
    * 8d9bff2 (grafted) feat: add auth
  • large-repo history

    115 commits across 3 branches with tags — for pagination and performance testing

    largehistoryperformancepagination
    6 contracts
    • main is checked out
    • main has 80 commits
    • feat/large-feature exists with 25 commits ahead of its fork point
    • develop exists with 10 commits ahead of its fork point
    • tags v0.1.0, v0.5.0, v1.0.0 exist
    • total commit count across all branches is 115
    commit graph · 117 lines
    * b1c0890 (HEAD -> main, tag: v1.0.0) ci: implement module 79
    * 0a045ef perf: implement module 78
    * 65cbaf4 test: implement module 77
    * 710e670 refactor: implement module 76
    * fe8e254 docs: implement module 75
    * 7190ec9 chore: implement module 74
    * e206fee fix: implement module 73
    * 35f598f feat: implement module 72
    * 436f9bc ci: implement module 71
    * f4c3f31 perf: implement module 70
    * 27f4cea test: implement module 69
    * 0af78ce refactor: implement module 68
    * 11dfb38 docs: implement module 67
    * a7310db chore: implement module 66
    * ea5d4a7 fix: implement module 65
    * 14ee0bd feat: implement module 64
    * 6eca227 ci: implement module 63
    * 56748de perf: implement module 62
    * 3da726d test: implement module 61
    * 1c5c8fa refactor: implement module 60
    | * 989beb1 (develop) feat: develop iteration 10
    | * 5bad990 feat: develop iteration 9
    | * 5736a01 feat: develop iteration 8
    | * e24278a feat: develop iteration 7
    | * 4372311 feat: develop iteration 6
    | * c06bc45 feat: develop iteration 5
    | * 82afcfa feat: develop iteration 4
    | * be22023 feat: develop iteration 3
    | * bf49971 feat: develop iteration 2
    | * 15c32b6 feat: develop iteration 1
    |/  
    * 12af7f3 (tag: v0.5.0) docs: implement module 59
    * 89d507e chore: implement module 58
    * 08770c7 fix: implement module 57
    * 077215c feat: implement module 56
    * bef04c9 ci: implement module 55
    * 4209dfd perf: implement module 54
    * 1302551 test: implement module 53
    * 7db0e61 refactor: implement module 52
    * 67fc474 docs: implement module 51
    * cfc9e79 chore: implement module 50
    * 07a9dee fix: implement module 49
    * f8b9d89 feat: implement module 48
    * 5b72539 ci: implement module 47
    * bf0572b perf: implement module 46
    * d385530 test: implement module 45
    * 271ca4d refactor: implement module 44
    * 4ec6208 docs: implement module 43
    * 81ebee3 chore: implement module 42
    * e635343 fix: implement module 41
    * 9334e2e feat: implement module 40
    | * ef7c08d (feat/large-feature) feat: large-feature step 25
    | * 3887a6f feat: large-feature step 24
    | * 96a6efd feat: large-feature step 23
    | * ab42f78 feat: large-feature step 22
    | * 2effada feat: large-feature step 21
    | * 6f41315 feat: large-feature step 20
    | * d44eadf feat: large-feature step 19
    | * 4a31dd7 feat: large-feature step 18
    | * 9464e9e feat: large-feature step 17
    | * 72e8580 feat: large-feature step 16
    | * 893b047 feat: large-feature step 15
    | * 1443724 feat: large-feature step 14
    | * 39f4d4d feat: large-feature step 13
    | * ad4cb6b feat: large-feature step 12
    | * 9ebefc1 feat: large-feature step 11
    | * db1b9fd feat: large-feature step 10
    | * 6b2c4a5 feat: large-feature step 9
    | * 578b519 feat: large-feature step 8
    | * ce39f33 feat: large-feature step 7
    | * 55c6a20 feat: large-feature step 6
    | * 5309d8f feat: large-feature step 5
    | * e1aa4b4 feat: large-feature step 4
    | * 55d72de feat: large-feature step 3
    | * 6e48154 feat: large-feature step 2
    | * 2e10cea feat: large-feature step 1
    |/  
    * 6b01f40 ci: implement module 39
    * e3652b4 perf: implement module 38
    * 3e99867 test: implement module 37
    * aacd176 refactor: implement module 36
    * 02dd835 docs: implement module 35
    * e501176 chore: implement module 34
    * 925d604 fix: implement module 33
    * 263311b feat: implement module 32
    * e3c596c ci: implement module 31
    * e8d31aa perf: implement module 30
    * 76101c2 test: implement module 29
    * 5e2b2fa refactor: implement module 28
    * 66b050f docs: implement module 27
    * 6a0a86d chore: implement module 26
    * c5001c3 fix: implement module 25
    * bd2f59a feat: implement module 24
    * 1bdf060 ci: implement module 23
    * 8c97a7b perf: implement module 22
    * fdc5804 test: implement module 21
    * 1b7985c refactor: implement module 20
    * 4b36a8e (tag: v0.1.0) docs: implement module 19
    * c12dcec chore: implement module 18
    * 5253217 fix: implement module 17
    * 08bfd34 feat: implement module 16
    * 8457df2 ci: implement module 15
    * 0ecda09 perf: implement module 14
    * 344f85b test: implement module 13
    * 496ee34 refactor: implement module 12
    * 72566f5 docs: implement module 11
    * da6326c chore: implement module 10
    * 789d452 fix: implement module 9
    * 724ee95 feat: implement module 8
    * c56f9a1 ci: implement module 7
    * 1a435dc perf: implement module 6
    * 29a2395 test: implement module 5
    * 79ec158 refactor: implement module 4
    * 1e49b44 docs: implement module 3
    * cf4ca59 chore: implement module 2
    * 0835472 fix: implement module 1
    * 2fdb479 feat: implement module 0
  • clean worktree on main + 3 stashes, each touching a different file

    stashmulti-entryclean-worktree
    4 contracts
    • main has 2 commits
    • worktree is clean
    • git stash list reports 3 entries
    • each stash touches a different file
    commit graph · 7 lines
    *-.   79423b5 (refs/stash) On main: WIP: experiment-c
    |\ \  
    | | * 69a2165 untracked files on main: 0e3655b chore: baseline content for stashing
    | * ec8f6a3 index on main: 0e3655b chore: baseline content for stashing
    |/  
    * 0e3655b (HEAD -> main) chore: baseline content for stashing
    * 257b4b9 chore: initial scaffold
  • one stash containing both modified tracked + untracked new files

    stashuntrackedmixed-content
    4 contracts
    • main has 2 commits
    • worktree is clean
    • git stash list reports 1 entry
    • the stash includes both modified tracked and untracked new files
    commit graph · 7 lines
    *-.   5b6e7cc (refs/stash) On main: WIP: feature v2 + new-feature scaffolding
    |\ \  
    | | * b27d53a untracked files on main: 44f2eaf feat: baseline feature
    | * 8c19173 index on main: 44f2eaf feat: baseline feature
    |/  
    * 44f2eaf (HEAD -> main) feat: baseline feature
    * c3cfc31 chore: initial scaffold
  • one baseline commit + a single staged README

    stagedminimalcommit-ready
    3 contracts
    • main has 1 commit
    • exactly 1 staged file (README.md)
    • no unstaged or untracked files
    commit graph · 1 line
    * bdc267e (HEAD -> main) chore: initial commit
  • 2 staged + 2 modified-unstaged + 1 untracked — the "mixed worktree" shape

    dirtystagedunstageduntrackedpartial
    4 contracts
    • main has 2 commits
    • exactly 2 staged files
    • exactly 2 modified-but-unstaged files
    • exactly 1 untracked file
    commit graph · 2 lines
    * 0ab8fc8 (HEAD -> main) chore: baseline content
    * ff79513 chore: initial commit
  • workspaces monorepo with 3 packages: app (clean), lib (staged), cli (unstaged)

    monorepoworkspacesstagedunstaged
    5 contracts
    • main has 3 commits
    • root package.json declares packages/* workspaces
    • packages/app is clean (no staged or unstaged changes)
    • packages/lib has staged changes
    • packages/cli has unstaged changes
    commit graph · 3 lines
    * 821231a (HEAD -> main) feat(lib,cli): scaffold lib + cli packages
    * 698a421 feat(app): scaffold app package
    * 5bf487d chore: scaffold workspace root
  • 12 staged + 6 unstaged + 3 untracked across 3 top-level dirs

    dirtystagedunstageduntrackedlarge
    5 contracts
    • main has 2 commits
    • worktree has 12 staged files
    • worktree has 6 unstaged files
    • worktree has 3 untracked files
    • changes span src/, tests/, and docs/
    commit graph · 2 lines
    * b963a11 (HEAD -> main) chore: baseline app scaffold
    * 15d9042 chore: initial commit
  • primary worktree on main + 3 linked worktrees on feature/hotfix branches

    worktreebranch
    5 contracts
    • main is checked out in the primary worktree
    • 3 linked worktrees exist
    • feat/alpha has 1 commit ahead of main
    • feat/beta has 2 commits ahead of main
    • hotfix/urgent has 1 commit ahead of main
    commit graph · 7 lines
    * c4f2fe0 (hotfix/urgent) fix: critical hotfix
    | * 9c01773 (feat/beta) feat: beta part 2
    | * afd85cf feat: beta part 1
    |/  
    | * e586e91 (feat/alpha) feat: alpha feature
    |/  
    * f53cf2e (HEAD -> main) chore: initial scaffold
  • primary worktree on main + 1 linked worktree locked with a reason

    worktreelockedin-progress
    4 contracts
    • 1 linked worktree exists
    • the linked worktree is locked
    • git worktree list --porcelain shows locked with a reason
    • .git/worktrees/ has a locked file for the linked worktree
    commit graph · 1 line
    * c949dcc (HEAD -> main, hotfix/reserved) chore: initial scaffold
  • parent with 4 commits + vendor/lib submodule pinned at its 4-commit HEAD

    submodulenestedhistory
    6 contracts
    • parent main has 4 commits
    • main is checked out
    • .gitmodules registers vendor/lib with branch = main
    • vendor/lib is a clean submodule (pin matches HEAD)
    • vendor/lib has 4 commits of its own
    • parent worktree is clean
    commit graph · 4 lines
    * 8554d0b (HEAD -> main) feat: integrate vendor/lib into entry point
    * 1660bc7 chore: add vendor/lib submodule
    * 9326672 feat: app shell
    * 5f49d93 chore: initial scaffold
  • parent pinned to an older submodule SHA while the submodule has moved ahead

    submoduleout-of-datein-progress
    4 contracts
    • parent main has 2 commits
    • .gitmodules registers vendor/lib
    • git submodule status shows + for vendor/lib
    • vendor/lib HEAD is 1 commit ahead of the parent pin
    commit graph · 2 lines
    * c4d8ca4 (HEAD -> main) chore: add vendor/lib submodule
    * c428bd9 chore: initial scaffold
  • repo with a Git LFS pointer file committed for a binary asset (no lfs binary required)

    lfsencodinggitattributescross-platform
    5 contracts
    • main is checked out
    • main has 2 commits
    • .gitattributes marks *.bin as LFS-tracked (filter=lfs diff=lfs merge=lfs -text)
    • assets/blob.bin contains a canonical LFS pointer (version + oid sha256 + size)
    • worktree is clean
    commit graph · 2 lines
    * b7b3122 (HEAD -> main) feat: add lfs-tracked binary asset
    * 7520170 chore: initial
  • repo with .gitattributes enforcing LF line endings on all text files (text=auto eol=lf)

    crlfencodinggitattributescross-platform
    5 contracts
    • main is checked out
    • main has 2 commits
    • .gitattributes contains "* text=auto eol=lf"
    • src/lf-only.txt is committed with LF-only line endings
    • worktree is clean
    commit graph · 2 lines
    * 9afdcd6 (HEAD -> main) chore: enforce LF line endings via .gitattributes
    * 7520170 chore: initial
  • repo whose history holds src/File.ts and src/file.ts — a case-only path collision invisible on case-insensitive filesystems

    case-collisionfilesystemcross-platform
    6 contracts
    • main is checked out
    • main has 2 commits
    • HEAD tree contains src/File.ts (PascalCase variant)
    • HEAD tree contains src/file.ts (lowercase variant)
    • both case variants are absent from the working tree
    • core.ignoreCase is false
    commit graph · 2 lines
    * ad7c59b (HEAD -> main) feat: add case-colliding sources
    * 7520170 chore: initial
  • repo with pre-commit and commit-msg hooks installed and marked executable

    hooksmetadata
    5 contracts
    • main is checked out
    • main has 2 commits
    • .git/hooks/pre-commit exists and is executable
    • .git/hooks/commit-msg exists and is executable
    • worktree is clean
    commit graph · 2 lines
    * 39669d4 (HEAD -> main) feat: add source
    * 7520170 chore: initial
  • two commits annotated with git notes; first commit also carries a note in a second namespace (refs/notes/ci)

    notesmetadata
    5 contracts
    • main is checked out
    • main has 2 commits
    • HEAD~1 has a note in refs/notes/commits containing "Reviewed-by: Alice"
    • HEAD~1 has a note in refs/notes/ci containing "CI: passed"
    • HEAD has a note in refs/notes/commits containing "Reviewed-by: Bob" and "Coverage: 92%"
    commit graph · 6 lines
    * c8df691 (HEAD -> main) fix: widget alignment
    * f42f25b feat: initial widget
    * 465151c Notes added by 'git notes append'
    * fbc9631 Notes added by 'git notes add'
    * 3ce2336 Notes added by 'git notes add'
    * 552cc08 Notes added by 'git notes add'
  • mixed-tags history

    lightweight tag (v0.1.0), annotated tag (v1.0.0), and a tag pointing at a tree object (tree-snapshot)

    tagsmetadata
    6 contracts
    • main is checked out
    • main has 3 commits
    • v0.1.0 is a lightweight tag pointing at HEAD~2 (git cat-file -t → commit)
    • v1.0.0 is an annotated tag object pointing at HEAD (git cat-file -t → tag)
    • tree-snapshot is a lightweight tag pointing at a tree object (git cat-file -t → tree)
    • worktree is clean
    commit graph · 3 lines
    * bbd015e (HEAD -> main, tag: v1.0.0) feat: stable release
    * f207e93 feat: v0.1.0 content
    * 7520170 (tag: v0.1.0) chore: initial

Tips

  • Kind chips are mutually exclusive. Click “All” to clear.
  • Tag chips are multi-select with AND semantics — click two tags and you get only scenarios that carry both.
  • Search matches against name, summary, and contract lines.
  • Commit graph expands the captured git log --graph for that scenario — fork lines, merge tips, and decorations included.
  • Copy buttons put either spinUpScenario('name') or npx git-scenarios create name on your clipboard.
  • URL hash is honored on load: ?kind=operation&tag=conflict would arrive pre-filtered.
  • Scenario name links to that scenario’s dedicated permalink page (e.g. /scenarios/mid-merge-conflict), which includes the full description, contracts, copy-paste snippets, and the captured git graph.

See also

  • Playground — interactive commit-graph view for every scenario, deep-linkable per graph
  • Scenarios overview — flat reference of all 46 scenarios grouped by kind
  • CLI Reference — same filter semantics as git-scenarios list --kind ... --tag ... --json
  • Custom scenarios — register your own and they’ll appear in the registry too (though not on this site, since the data is built from the package’s source)
  • Each scenario also has its own permalink at /scenarios/<name> — shareable links with full description and code snippets