Quickstart
This is the whole lifecycle, copy-paste. Work happens on a change: an isolated set of ops forked from the trunk. You edit, push your ops, and take the change through propose → review → accept. Accepting integrates your work into the trunk. That’s it.
Each account has exactly one repository, so you never name a repo in a command. Fabric uses your repo automatically, creating it the first time you use it.
fabric change create "fix login" # fork a new draft change (now the most recent)
fabric clone # materialize the most recent change → a working dir
cd fix-login
# …edit files normally with your editor or an agent…
fabric status # local diff vs the cloned base (no network)
fabric push # upload your edits to the change as ops (does NOT land them)
fabric propose # draft → proposed (open it for review)
fabric accept # land the change into trunk (after it's approved)
# …or `fabric abandon` to discard the change…
Push vs. land: an important distinction
fabric push only uploads your edits onto your own change as new ops. It
never changes the trunk and never merges anything for anyone else. The only way
work reaches the trunk is fabric accept, and a change must be reviewed and
approved before it can be accepted (see Core concepts for
how review and approval work). Pushing early and often is safe: it’s just
saving your work-in-progress to the change.
Notes that save you a round-trip
fabric clonematerializes the most recent change, so create the change first. (If you just ranfabric import, the import advanced trunk rather than a change: clone the imported tree withfabric clone --at trunk, or fork a change off the new trunk and clone that. See Import & export.)- No browser handy?
fabric login --no-browserprints an activation URL and a one-time code you approve from any browser. See Install. fabric pushis idempotent: safe to re-run; it appends only what’s new. If it reports nothing to do, your tree already matches the change tip. That’s success, not an error.fabric statusandfabric diffare local (no network): use them freely.- By default commands print human-readable text; add
--jsonto any command for structured output that scripts and agents can parse. - One change = one reviewable unit of work. Keep it scoped; open another change for unrelated edits rather than piling everything onto one.
What just happened
Each edit you pushed became an append-only op on your change. Once the change
was approved, accept advanced the trunk to include those ops. It didn’t
rewrite or rebase anything. To understand why there’s no rebase, --force, or
conflict markers to untangle, read Core concepts.