Skip to content
Get started

Commits and versions

Grunddata never overwrites data. Every save appends. This gives you a complete, attributable history of your data without having to configure anything.

Two concepts do the work: commits and versions.

A commit is a single save operation. It does not matter whether it covers one row typed in the web app or five thousand rows uploaded from Excel — it is one commit.

A commit records:

Part Description
Message What the change was for. Supplied by the user or the web app’s editable default.
Author The signed-in user, resolved to a name and email.
Timestamp When the commit was created.
Sequence A monotonically increasing number giving a strict chronological order.
Record versions Every record version the save produced.

Open a table’s overview page. The Recent commits panel lists the latest commits touching that table, with the message, the author and the timestamp. Choose View all to search the table’s commit history.

From commit history you can:

  • View the active records as they were at a selected commit.
  • Compare a commit with the preceding table commit or with the current records.
  • Restore the table to a selected commit. A restore replaces the current table state and is recorded as a new commit with an editable default message.

Snapshots and comparisons load records a page at a time, so large tables do not need to be downloaded all at once.

When saving records or adding/editing attributes in the web app, the commit message is shown inline with the save controls. Each form starts with a short editable default, which can be replaced or cleared before saving. Attribute defaults include the attribute name, such as Counterparty attribute updated.

Every record has a version. It starts at 1 and increments on every change.

Saving a change appends a new row rather than updating the existing one:

id source_id version account_name is_deleted commit
018f…a1 018f…77 1 Nominal amount false Initial load of chart of accounts
018f…b4 018f…77 2 Nominal amount (SEK) false Clarify account names for reporting
018f…c9 018f…77 3 Nominal amount (SEK) true Retire unused accounts

Reading this table:

  • source_id is identical in all three rows. It is the same account throughout.
  • id identifies one version row. It changes each time.
  • version counts the revisions.
  • The current state of a record is simply its highest version.

Deleting a record does not remove anything. It appends a new version flagged as deleted.

The record then:

  • Disappears from the records grid.
  • Is excluded from Excel and Google Sheets downloads.
  • Is excluded from the OData feed.
  • Keeps its full history, attributable to whoever deleted it and why.
  1. Answer “who changed this?” — every version carries its author and its commit message.

  2. Answer “when did this value change?” — versions are ordered, and commits have a strict sequence.

  3. Answer “what did this look like at year end?” — the versions in place at that time are still there.

  4. Recover from a bad bulk edit — the previous values were never destroyed.