Skip to content

Real hashes · real orphans · real reflog

See what rebase actually does

Rebase does not move your commits. It writes new ones — with new hashes — and leaves the originals sitting on the shelf, unreferenced but not gone.

Type real git commands and watch the objects appear, the hashes change, and the leftovers pile up. Nothing is installed, nothing is uploaded, and nothing you do here can break a real repository.

Before
46c9fadd7f1c0508a0a8f8c8a584mainfeature
After rebase main
08a0a8f8c8a58446c9fadd7f1c052d201f0e836ca6mainfeature

Same work, different objects. The two feature commits were copied onto a new base, so their hashes changed — and the originals are still on the shelf, pointed at by nothing.

Three things, and the whole model

A commit is a box

It holds a full snapshot and is named by a hash of its own contents — including which box came before it. Change what is inside, or change what came before, and it is a different box with a different name. Boxes are never edited.

A branch is a card

A branch is just a card with a string running to one box. Moving a branch moves the string. It does not touch a single box. HEAD is the card marked in use.

An orphan is a box with no card

After a rebase or a hard reset, the old boxes are still in the room — nothing points at them any more. That is what "I lost my work" actually means, and why the reflog gets it back.

How to use it

  1. 01

    Pick a starting history

    Open a scenario, or build your own with write, add, and commit. Every scenario is a script of commands that replays when you open it.

  2. 02

    Run the command

    Type it in the command bar, exactly as you would in a terminal. Newly written objects are marked in red — that red is a hash that did not exist a moment ago.

  3. 03

    Look at what was left behind

    Faded boxes are unreachable, not deleted. The register lists every ref movement, and one click turns any orphan back into a branch.

Never used rebase before? Start with a scenario — each one sets up a history and names the one command worth running next.

What is real here, and what is not

Hashes here are real in the sense of being content-derived and internally consistent — not identical to what git would produce on your machine, because git also folds in the committer time and the author identity. This simulator uses a virtual clock so every session replays exactly.