tide history lists every version of your deployed schema, tide diff
compares two versions, tide blame and tide owners attribute each field
and entity to the caller that introduced it, and a rollback restores an
earlier snapshot.
1. View history
tide historyOutput, newest first:
Schema History
● v7 apply vendor 2h ago
│ +4 change(s)
│
● v6 apply consumer 22h ago
│ +2 change(s)
│
● v5 apply vendor Jun 12, 14:30
│ +16 change(s)
│
● v4 apply auth Jun 10, 11:00
│ +1 change(s)
│
● v3 apply consumer Jun 09, 09:55
│ +1 change(s)
│
● v2 apply vendor Jun 08, 16:20
│ +36 change(s)
│
◌ v1 seed auth Jun 07, 10:00
no changesEach row is one schema version, and the second column is the event that
wrote it: apply, rollback, adopt, or seed. A seed renders as ◌;
the other three render as ●. Timestamps under a day old are relative
(2h ago); older ones are absolute. Use --limit=N to show only the most
recent N versions.
tide history --limit=32. Compare versions
tide diff 3 7Output:
diff v3 → v7
─── vendor.VendorImport (new entity)
+ vendor_id varchar(7) not null
+ import_strategy varchar(20) not null
+ status varchar(10) not null
─── consumer.Order
id varchar(8) primary
user_id varchar(8) not null
+ shipping_label text
- total int not null
+ total bigint not null
─── consumer.LegacyCart (removed)
+4 additive ~1 backfill ✗1 destructiveThe diff is structural, not line-level. Each changed entity gets a ───
header, suffixed (new entity) or (removed); inside it, + marks an
added field, - a removed one, and a modified field prints as its old
line with - followed by its new line with +. Unchanged fields of a
changed entity print unmarked. The last line counts the changes per plan
class. Both version arguments are required.
3. Check ownership
tide ownersOutput (one row per entity):
ENTITY OWNER SINCE FIELDS
auth.User auth v1 6
auth.Session auth v1 4
auth.ApiKey auth v4 3
consumer.Order consumer v1 5
consumer.Invoice consumer v3 4
vendor.Product vendor v2 8
vendor.Variant vendor v2 6
vendor.Collection vendor v2 5
vendor.VendorImport vendor v5 3Each row shows which caller introduced the entity, the version it was introduced in, and the current field count. Read this before a cross-caller change: it names the caller that owns each entity.
4. Blame a field
tide blame consumer.OrderOutput:
Blame: consumer.Order
FIELD INTRODUCED BY AT MODIFIED BY AT STATUS
(entity) consumer 1 consumer 1 active
id consumer 1 consumer 1 active
user_id consumer 1 consumer 1 active
item_ids consumer 1 consumer 1 active
total consumer 3 consumer 3 active
shipping_label vendor 5 vendor 5 activeEach row shows which caller introduced the field, who last modified it,
and whether it is still active. shipping_label was added by the vendor
caller in version 5. The server merges submissions from several callers,
so git blame on one repository’s .atl file does not show this.
5. Roll back
Preview what a rollback would do:
tide rollback --to=5 --dry-runOutput:
Rollback preview: v7 -> v5
3 change(s) would be applied.
1 additive
1 backfill_required
1 destructive
(use without --dry-run to execute)Executing the rollback happens in the console: the Operations page’s
Rollback tab, admin role. The server refuses tide rollback without
--dry-run from a caller enrolment — executing it needs an operator
capability callers do not hold.
The rollback creates a new version whose IR snapshot matches the target — version 8 here, matching version 5. The versions between remain in history; nothing is deleted.
Verify
tide history --limit=1The newest row is the rollback’s version:
● v8 rollback atlantis-console just now
+3 change(s)Common errors
schema version N not found— no version with that number exists in the registry: a number above the latest, or an empty registry. Runtide historyto see available versions.
Related
- Schema versioning — how the version registry works
- The apply path — the checkpoint the history records.
- Recover a dropped table — when the version you want back parked something