just playing with tangled
at ig/vimdiffwarn 67 lines 3.3 kB view raw view rendered
1# Operation log 2 3 4## Introduction 5 6Jujutsu records each operation that modifies the repo in the "operation log". 7You can see the log with `jj op log`. Each operation object contains a snapshot 8of how the repo looked at the end of the operation. We call this snapshot a 9"view" object. The view contains information about where each bookmark, tag, and 10Git ref (in Git-backed repos) pointed, as well as the set of heads in the repo, 11and the current working-copy commit in each workspace. The operation object also 12(in addition to the view) contains pointers to the operation(s) immediately 13before it, as well as metadata about the operation, such as timestamps, 14username, hostname, description. 15 16The operation log allows you to undo an operation (`jj [op] undo`), which doesn't 17need to be the most recent one. It also lets you restore the entire repo to the 18way it looked at an earlier point (`jj op restore`). 19 20When referring to operations, you can use `@` to represent the current 21operation. 22 23The following operators are supported: 24 25* `x-`: Parents of `x` (e.g. `@-`) 26* `x+`: Children of `x` 27 28 29## divergent operations 30 31One benefit of the operation log (and the reason for its creation) is that it 32allows lock-free concurrency -- you can run concurrent `jj` commands without 33corrupting the repo, even if you run the commands on different machines that 34access the repo via a distributed file system (as long as the file system 35guarantees that a write is only visible once previous writes are visible). When 36you run a `jj` command, it will start by loading the repo at the latest 37operation. It will not see any changes written by concurrent commands. If there 38are conflicts, you will be informed of them by subsequent `jj st` and/or 39`jj log` commands. 40 41As an example, let's say you had started editing the description of a change and 42then also update the contents of the change (maybe because you had forgotten the 43editor). When you eventually close your editor, the command will succeed and 44e.g. `jj log` will indicate that the change has diverged. 45 46 47## Loading an old version of the repo 48 49The top-level `--at-operation/--at-op` option allows you to load the repo at a 50specific operation. This can be useful for understanding how your repo got into 51the current state. It can be even more useful for understanding why someone 52else's repo got into its current state. 53 54When you use `--at-op`, the automatic snapshotting of the working copy will not 55take place. When referring to a revision with the `@` symbol (as many commands 56do by default), that will resolve to the working-copy commit recorded in the 57operation's view (which is actually how it always works -- it's just the 58snapshotting that's skipped with `--at-op`). 59 60As a top-level option, `--at-op` can be passed to any command. However, you 61will typically only want to run read-only commands. For example, `jj log`, 62`jj st`, and `jj diff` all make sense. It's still possible to run e.g. 63`jj --at-op=<some operation ID> describe`. That's equivalent to having started 64`jj describe` back when the specified operation was the most recent operation 65and then let it run until now (which can be done for that particular command by 66not closing the editor). There's practically no good reason to do that other 67than to simulate concurrent commands.