Hands-on · 14 missions · runs in your browser
A real terminal on a simulated repository. Type git commands, watch the commit graph move in 3D, and see every file's version in the working tree, the index and HEAD. Each mission checks your work, then shows the same thing on a real machine. Break anything you like: "reset mission" puts it back.
git log --oneline --all.git hash-object on the same bytes). Commits have real parents and a real text format, so rebase, amend and cherry-pick produce new ids for the same reasons git does. Merges are three-way and line-based, with git's conflict markers and the rebase ours/theirs swap. Reflog lines, ORIG_HEAD, detached-HEAD warnings, the "fetch first" rejection and the divergent-pull error are modelled on git 2.4x.-m, and the todo list opens as a panel. The line matcher is a plain longest-common-subsequence, not git's Myers/histogram diff, so an unusual hunk can split differently. Dates come from a fake clock. No packfiles, hooks, gc or config files; origin lives in the same page.git bisect, blame, submodules, worktrees, LFS, signing, add -p. All worth learning once the model is solid.Recreate mission 6 (the conflict) in a real terminal, in a throwaway folder:
mkdir git-play && cd git-play && git init -b main
printf '# Demo\nGreeting: hello\n' > README.md && git add . && git commit -m "Start"
git switch -c feature
sed -i.bak 's/hello/hi there/' README.md && git commit -am "Friendlier greeting"
git switch main
sed -i.bak 's/hello/hey/' README.md && git commit -am "Shorter greeting"
git merge feature # CONFLICT: open README.md, fix it, then:
git add README.md && git commit --no-edit
git log --oneline --graph --all
pick keep · reword new message · squash melt into the line above, keep both messages · fixup melt into the line above, drop this message · drop remove · edit stop after it. Use ↑↓ to reorder.