---
next_cursor: eyJzY29yZSI6MCwic2VxIjoxMjU4LCJzaW5jZSI6bnVsbCwidG9vbCI6ImpqIiwidiI6MX0
has_more: true
next: https://sincecutoff.com/v1/changes.md?tool=jj&score=0&cursor=eyJzY29yZSI6MCwic2VxIjoxMjU4LCJzaW5jZSI6bnVsbCwidG9vbCI6ImpqIiwidiI6MX0
items: 10
---
# sincecutoff.com changes: jj

## jj change IDs support numeric suffixes for hidden and divergent changes (jj, 2026-01-08)
Published 2026-10-17
- slug: jj-change-ids-support-numeric-suffixes-for-hidden-and-divergent-changes-6ef0e20d63cb
- score: 0.93

How to use it:

When recovering the previous contents of a hidden or divergent change, use the numeric suffix shown in the log to select it, then run `jj restore --from <change-id>/1 --to <change-id>`.

Examples:

```
jj restore --from <change-id>/1 --to <change-id>
```

- why_it_matters: Restore a change from its previous version after an accidental edit.
- sources: <https://github.com/jj-vcs/jj/releases/tag/v0.37.0>
- gotchas: "Version: v0.37.0"; "--from <change-id>/1 (required): Select the previous version of the change as the restore source; `/1` refers to the previous version."; "--to <change-id> (required): Select the change whose contents are to be restored."

## jj adds the `remote_tags()` revset function (jj, 2026-02-05)
Published 2026-10-17
- slug: jj-adds-the-remote-tags-revset-function-1d637f2924a8
- score: 0.90

How to use it:

When querying remote tags, use `remote_tags()` in a jj revset; it selects targets of remote tags across all remotes.

Examples:

```
jj log -r 'remote_tags()'
```

- why_it_matters: When querying remote tags in a repository, use the new revset function.
- sources: <https://github.com/jj-vcs/jj/releases/tag/v0.38.0>, <https://github.com/jj-vcs/jj/blob/main/docs/revsets.md>
- gotchas: "Version: v0.38.0"; "name_pattern (optional): Filters remote tags by matching tag name; supports jj string patterns."; "remote_pattern (optional; argument may be labeled `remote=`): Filters tags by matching remote name. Both filters may be supplied together; no mutual exclusion is documented."

## jj bookmark advance moves bookmarks to a target revision (jj, 2026-03-04)
Published 2026-10-17
- slug: jj-bookmark-advance-moves-bookmarks-to-a-target-revision-8ba896fb7d4f
- score: 0.94

How to use it:

After updating commits, run `jj bookmark advance` to advance eligible bookmarks to the configured target, which defaults to `@`.

Examples:

```
jj bookmark advance
```

```
[revsets]
bookmark-advance-from = 'heads(::to & bookmarks())'
bookmark-advance-to = '@'
```

- why_it_matters: Advance repository bookmarks to the target revision after updating commits.
- before: Use the community alias `jj tug` for the longstanding equivalent workflow.
- sources: <https://github.com/jj-vcs/jj/releases/tag/v0.39.0>, <https://github.com/jj-vcs/jj/blob/v0.39.0/docs/config.md>
- gotchas: "Version: v0.39.0"; "revsets.bookmark-advance-from: Revset selecting bookmarks to advance; default is `heads(::to & bookmarks())`. It can refer to `to`."; "revsets.bookmark-advance-to: Destination revset; default is `@`, the current working copy."

## jj bookmark rename can overwrite an existing bookmark (jj, 2026-03-04)
Published 2026-10-17
- slug: jj-bookmark-rename-can-overwrite-an-existing-bookmark-3efcf177a636
- score: 0.92

How to use it:

When renaming a bookmark to a name that already exists, run `jj bookmark rename` with `--overwrite-existing` to replace the existing bookmark.

Examples:

```
jj bookmark rename --overwrite-existing <old> <new>
```

- why_it_matters: Rename a bookmark to a name that already exists in the repository.
- sources: <https://github.com/jj-vcs/jj/releases/tag/v0.39.0>, <https://github.com/jj-vcs/jj/blob/v0.39.0/cli/src/commands/bookmark/rename.rs>
- gotchas: "Version: v0.39.0"; "old (required): Existing bookmark name to rename."; "new (required): New bookmark name."; "--overwrite-existing: Allow renaming when the new bookmark name already exists."; "The flag allows the existing bookmark with the new name to be replaced."

## jj configuration supports environment-based conditions (jj, 2026-03-04)
Published 2026-10-17
- slug: jj-configuration-supports-environment-based-conditions-dc5267884877
- score: 0.94

How to use it:

When a repository development setting should apply only under an environment condition, add a conditional scope to jj configuration. Use `--when.environments` with `NAME=VALUE` to match a value or `NAME` to match whenever the variable is set.

Examples:

```
[[--scope]]
--when.environments = ["<NAME>=<VALUE>"]
[--scope.<section>]
<key> = "<value>"
```

- why_it_matters: Apply a jj configuration condition based on environment variables in a repository development setup.
- sources: <https://github.com/jj-vcs/jj/releases/tag/v0.39.0>, <https://github.com/jj-vcs/jj/blob/v0.39.0/docs/config.md>
- gotchas: "Version: v0.39.0"; "--when.environments (required): List of environment conditions. Each item is `NAME=VALUE` to match that value, or `NAME` to match if set. Items in the list are alternatives (OR)."; "--scope (required): Conditional configuration table; its variables are expanded to the root config table."; "Multiple condition keys: If multiple `--when` conditions are specified, their intersection is used (AND)."

## jj gerrit upload accepts additional upload flags (jj, 2026-03-04)
Published 2026-10-17
- slug: jj-gerrit-upload-accepts-additional-upload-flags-559f1eb825a5
- score: 0.92

How to use it:

When uploading a jj change for Gerrit review, run `jj gerrit upload` with the desired reviewer and label flags. The release note gives `--reviewer=foo@example.com` and `--label=Auto-Submit` as examples.

Examples:

```
jj gerrit upload --reviewer=<email> --label=<label>
```

- why_it_matters: Upload a jj change for review with reviewer or label options.
- sources: <https://github.com/jj-vcs/jj/releases/tag/v0.39.0>, <https://gerrit-review.googlesource.com/Documentation/user-upload.html>, <https://www.jj-vcs.dev/latest/gerrit/>
- gotchas: "Version: v0.39.0"; "--reviewer=<email>: Requests the specified account as a reviewer."; "--label=<label>: Applies a review label. Gerrit documents label scores as optional; if omitted, the default is +1 when allowed."; "-r, --revisions <REVISIONS>: Selects revisions to upload; the v0.39.0 release note says the flag is no longer required and the command defaults to the current working revision."; "Prerequisite: Configure authentication for the Gerrit server before uploading."; "Prerequisite: Specify a Gerrit remote or configure a default remote; otherwise the command can fail if no `gerrit` remote exists."; "The release refers to Gerrit's documentation for the variety of supported flags; it does not enumerate them all."

## jj gerrit upload defaults to the current work (jj, 2026-03-04)
Published 2026-10-17
- slug: jj-gerrit-upload-defaults-to-the-current-work-cad1d2dd6dc5
- score: 0.94

How to use it:

When uploading the change currently being worked on for Gerrit review, run `jj gerrit upload` without `-r`; it defaults to the current work. [v0.39.0 release notes](https://github.com/jj-vcs/jj/releases/tag/v0.39.0)

Examples:

```
jj gerrit upload
```

- why_it_matters: Upload the change currently being worked on for Gerrit review.
- before: Pass `-r` to `jj gerrit upload` to select what to upload.
- sources: <https://github.com/jj-vcs/jj/releases/tag/v0.39.0>
- gotchas: "Version: v0.39.0"; "Without `-r`, the command defaults to uploading what you are currently working on."

## jj rebase adds --simplify-parents (jj, 2026-03-04)
Published 2026-10-17
- slug: jj-rebase-adds-simplify-parents-8cadc905de73
- score: 0.92

How to use it:

When rebasing commits and you want to remove parent edges that are ancestors of other parents, run `jj rebase --simplify-parents --onto <destination>`; with no source selector, jj rebases the default branch `@`.

Examples:

```
jj rebase --simplify-parents --onto <destination>
```

- why_it_matters: Rebase commits while applying parent simplification to the rebased commits.
- before: Rebase first, then run `jj simplify-parents` on the freshly rebased commits.
- sources: <https://github.com/jj-vcs/jj/releases/tag/v0.39.0>, <https://github.com/jj-vcs/jj/blob/v0.39.0/cli/src/commands/rebase.rs>
- gotchas: "Version: v0.39.0"; "--simplify-parents: Simplify parents of rebased commits by removing parents that are ancestors of other parents."; "--onto <REVSETS> (required): Revision(s) to rebase onto; may be repeated to create a merge commit. A rebase destination is required."; "--branch, --source, or --revisions: Selects what to rebase. If none is supplied, the default is `--branch @`."; "Prerequisite: Use jj v0.39.0 or later for this flag."

## jj templates add list manipulation methods (jj, 2026-03-04)
Published 2026-10-17
- slug: jj-templates-add-list-manipulation-methods-cdd5a1000805
- score: 0.97

How to use it:

When a jj template needs list manipulation for repository inspection, call the list methods on a list value. Use `jj log -T` with a template such as `self.parents().reverse().take(2).map(|c| c.commit_id().short()).join("\n")` to inspect recent parents.

Examples:

```
jj log -T 'self.parents().reverse().take(2).map(|c| c.commit_id().short()).join("\n")'
```

- why_it_matters: Manipulate list values in a jj template used for repository inspection.
- sources: <https://github.com/jj-vcs/jj/releases/tag/v0.39.0>, <https://github.com/jj-vcs/jj/blob/v0.39.0/docs/templates.md>
- gotchas: "Version: v0.39.0"; "first(): Returns the first element; errors if the list is empty."; "last(): Returns the last element; errors if the list is empty."; "get(index: Integer) (required): Returns the element at the zero-based index; errors if out of bounds."; "reverse(): Returns the list in reverse order."; "skip(count: Integer) (required): Skips the first count elements and returns the rest."; "take(count: Integer) (required): Returns only the first count elements."; "These methods are supported on list types."

## jj templates add Timestamp::since (jj, 2026-03-04)
Published 2026-10-17
- slug: jj-templates-add-timestamp-since-a8fe389549c1
- score: 0.94

How to use it:

When a template needs a human-friendly duration between two timestamps, call `.since(start)` on the ending `Timestamp`, then call `.duration()` on the returned `TimestampRange`.

Examples:

```
jj log -T 'self.committer().timestamp().since(self.author().timestamp()).duration()'
```

- why_it_matters: Display a human-friendly duration between timestamps in a jj template.
- sources: <https://github.com/jj-vcs/jj/releases/tag/v0.39.0>, <https://github.com/jj-vcs/jj/blob/v0.39.0/docs/templates.md>
- gotchas: "Version: v0.39.0"; ".since(start: Timestamp) (required): Returns the `TimestampRange` between `start` and the receiver timestamp."; ".duration() (required): Returns a human-friendly duration string for a `TimestampRange`."; "Prerequisite: Use jj v0.39.0 or later; this template method is documented in the v0.39.0 templates reference."

Next: https://sincecutoff.com/v1/changes.md?tool=jj&score=0&cursor=eyJzY29yZSI6MCwic2VxIjoxMjU4LCJzaW5jZSI6bnVsbCwidG9vbCI6ImpqIiwidiI6MX0
Save `next_cursor`; next visit, pass it to get only what was published since.
<!-- end of page -->
