1
# Changelog
2
3
All notable changes to this project will be documented in this file.
4
5
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
and this project adheres
7
to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
9
## [Unreleased]
10
11
### Release highlights
12
13
* Per-repo and per-workspace config is now stored outside the repo, for security
14
reasons. This is not a breaking change because we automatically migrate
15
legacy repos to this new format. `.jj/repo/config.toml` and
16
`.jj/workspace-config.toml` should no longer be used.
17
18
### Breaking changes
19
20
* Deprecated `ui.always-allow-large-revsets` setting and `all:` revset modifier
21
have been removed.
22
23
* `<name>@<remote>` revset symbols can also be resolved to remote tags. Tags are
24
prioritized ahead of bookmarks.
25
26
* Legacy placeholder support used for unset `user.name` or `user.email` has been
27
removed. Commits containing these values will now be pushed with `jj git push`
28
without producing an error.
29
30
* If any side of a conflicted file is missing a terminating newline, then the
31
materialized file in the working copy will no longer be terminated by a
32
newline.
33
34
### Deprecations
35
36
* The revset function `diff_contains()` has been renamed to `diff_lines()`.
37
38
### New features
39
40
* `jj git fetch` now shows details of abandoned commits (change IDs and
41
descriptions) by default, matching the `jj abandon` output format.
42
[#3081](https://github.com/jj-vcs/jj/issues/3081)
43
44
* `jj workspace root` now accepts an optional `--name` argument to show
45
the root path of the specified workspace (defaults to the current one). When
46
given a workspace that was created before this release, it errors out.
47
48
* `jj git push --bookmark <name>` will now automatically track the bookmark if
49
it isn't tracked with any remote already.
50
51
* Add `git_web_url([remote])` template function that converts a git remote URL
52
to a web URL, suitable for opening in a browser. Defaults to the "origin"
53
remote.
54
55
* New `divergent()` revset function for divergent changes.
56
57
* String pattern values in revsets and templates can now be substituted by
58
aliases. For example, `grep(x) = description(regex:x)` now works.
59
60
* A new config option `remotes.<name>.auto-track-created-bookmarks` behaves
61
similarly to `auto-track-bookmarks`, but it only applies to bookmarks created
62
locally. Setting it to `"*"` is now the closest replacement for the deprecated
63
`git.push-new-bookmarks` option.
64
65
* `jj tag list` can now be filtered by revset.
66
67
* Conflict markers will use LF or CRLF as the line ending according to the
68
contents of the file.
69
[#7376](https://github.com/jj-vcs/jj/issues/7376)
70
71
* New *experimental* `jj git fetch --tag` flag to fetch tags in the same way as
72
bookmarks. If specified, tags won't be fetched implicitly, and only tags
73
matching the pattern will be fetched as `<name>@<remote>` tags. The fetched
74
remote tags will be tracked by the local tags of the same name.
75
76
* New `remote_tags()` revset function to query remote tags.
77
78
### Fixed bugs
79
80
* `jj git init --colocate` now refuses to run inside a Git worktree, providing
81
a helpful error message with alternatives.
82
[#8052](https://github.com/jj-vcs/jj/issues/8052)
83
84
* `jj git push` now ensures that tracked remote bookmarks are updated even if
85
there are no mappings in the Git fetch refspecs.
86
[#5115](https://github.com/jj-vcs/jj/issues/5115)
87
88
* `jj git fetch`/`push` now forwards most of `git` stderr outputs such as
89
authentication requests. [#5760](https://github.com/jj-vcs/jj/issues/5760)
90
91
* Conflicted bookmarks and tags in `trunk()` will no longer generate verbose
92
warnings. The configured `trunk()` alias will temporarily be disabled.
93
[#8501](https://github.com/jj-vcs/jj/issues/8501)
94
95
* Dynamic shell completion for `jj config unset` now only completes
96
configuration options which are set.
97
[#7774](https://github.com/jj-vcs/jj/issues/7774)
98
99
* Dynamic shell completion no longer attempts to resolve aliases at the
100
completion position. This previously prevented a fully-typed alias from
101
being accepted on some shells and replaced it entirely with its expansion on
102
bash. Now, the completion will only resolve the alias, and suggest candidates
103
accordingly, after the cursor has been advanced to the next position.
104
[#7773](https://github.com/jj-vcs/jj/issues/7773)
105
106
* Setting the editor via `ui.editor`, `$EDITOR`, or `JJ_EDITOR` now respects shell quoting.
107
108
* `jj gerrit upload` will no longer swallow errors and surface if changes fail
109
to get pushed to gerrit.
110
[#8568](https://github.com/jj-vcs/jj/issues/8568)
111
112
* `jj file track --include-ignored` now works when `fsmonitor.backend="watchman"`.
113
[#8427](https://github.com/jj-vcs/jj/issues/8427)
114
115
* Conflict labels are now preserved correctly when restoring files from commits
116
with different conflict labels.
117
118
* The empty tree is now always written when the working copy is empty.
119
[#8480](https://github.com/jj-vcs/jj/issues/8480)
120
121
* When using the Watchman filesystem monitor, changes to .gitignore now trigger
122
a scan of the affected subtree so newly unignored files are discovered.
123
[#8427](https://github.com/jj-vcs/jj/issues/8427)
124
125
## [0.37.0] - 2026-01-07
126
127
### Release highlights
128
129
* A new syntax for referring to hidden and divergent change IDs is available:
130
`xyz/n` where `n` is a number. For instance, `xyz/0` refers to the latest
131
version of `xyz`, while `xyz/1` refers to the previous version of `xyz`.
132
This allows you to perform actions like `jj restore --from xyz/1 --to xyz` to
133
restore `xyz` to its previous contents, if you made a mistake.
134
135
For divergent changes, the numeric suffix will always be shown in the log,
136
allowing you to disambiguate them in a similar manner.
137
138
### Breaking changes
139
140
* [String patterns](docs/revsets.md#string-patterns) in revsets, command
141
arguments, and configuration are now parsed as globs by default. Use
142
`substring:` or `exact:` prefix as needed.
143
144
* `remotes.<name>.auto-track-bookmarks` is now parsed the same way they
145
are in revsets and can be combined with logical operators.
146
147
* `jj bookmark track`/`untrack` now accepts `--remote` argument. If omitted, all
148
remote bookmarks matching the bookmark names will be tracked/untracked. The
149
old `<bookmark>@<remote>` syntax is deprecated in favor of `<bookmark>
150
--remote=<remote>`.
151
152
* On Windows, symlinks that point to a path with `/` won't be supported. This
153
path is [invalid on Windows](https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions).
154
155
* The template alias `format_short_change_id_with_hidden_and_divergent_info(commit)`
156
has been replaced by `format_short_change_id_with_change_offset(commit)`.
157
158
* The following deprecated config options have been removed:
159
- `git.push-bookmark-prefix`
160
- `ui.default-description`
161
- `ui.diff.format`
162
- `ui.diff.tool`
163
164
* The deprecated `commit_id.normal_hex()` template method has been removed.
165
166
* Template expansion that did not produce a terminating newline will not be
167
fixed up to provide one by `jj log`, `jj evolog`, or `jj op log`.
168
169
* The `diff` conflict marker style can now use `\\\\\\\` markers to indicate
170
the continuation of a conflict label from the previous line.
171
172
### Deprecations
173
174
* The `git_head()` and `git_refs()` functions will be removed from revsets and
175
templates. `git_head()` should point to the `first_parent(@)` revision in
176
colocated repositories. `git_refs()` can be approximated as
177
`remote_bookmarks(remote=glob:*) | tags()`.
178
179
### New features
180
181
* Updated the executable bit representation in the local working copy to allow
182
ignoring executable bit changes on Unix. By default we try to detect the
183
filesystem's behavior, but this can be overridden manually by setting
184
`working-copy.exec-bit-change = "respect" | "ignore"`.
185
186
* `jj workspace add` now also works for empty destination directories.
187
188
* `jj git remote` family of commands now supports different fetch and push URLs.
189
190
* `[colors]` table now supports `dim = true` attribute.
191
192
* In color-words diffs, context line numbers are now rendered with decreased
193
intensity.
194
195
* Hidden and divergent commits can now be unambiguously selected using their
196
change ID combined with a numeric suffix. For instance, if there are two
197
commits with change ID `xyz`, then one can be referred to as `xyz/0` and the
198
other can be referred to as `xyz/1`. These suffixes are shown in the log when
199
necessary to make a change ID unambiguous.
200
201
* `jj util gc` now prunes unreachable files in `.jj/repo/store/extra` to save
202
disk space.
203
204
* Early version of a `jj file search` command for searching for a pattern in
205
files (like `git grep`).
206
207
* Conflict labels now contain information about where the sides of a conflict
208
came from (e.g. `nlqwxzwn 7dd24e73 "first line of description"`).
209
210
* `--insert-before` now accepts a revset that resolves to an empty set when
211
used with `--insert-after`. The behavior is similar to `--onto`.
212
213
* `jj tag list` now supports `--sort` option.
214
215
* `TreeDiffEntry` type now has a `display_diff_path()` method that formats
216
renames/copies appropriately.
217
218
* `TreeDiffEntry` now has a `status_char()` method that returns
219
single-character status codes (M/A/D/C/R).
220
221
* `CommitEvolutionEntry` type now has a `predecessors()` method which
222
returns the predecessor commits (previous versions) of the entry's commit.
223
224
* `CommitEvolutionEntry` type now has a `inter_diff()` method which
225
returns a `TreeDiff` between the entry's commit and its predecessor version.
226
Optionally accepts a fileset literal to limit the diff.
227
228
* `jj file annotate` now reports an error for non-files instead of succeeding
229
and displaying no content.
230
231
* `jj workspace forget` now warns about unknown workspaces instead of failing.
232
233
### Fixed bugs
234
235
* Broken symlink on Windows. [#6934](https://github.com/jj-vcs/jj/issues/6934).
236
237
* Fixed failure on exporting moved/deleted annotated tags to Git. Moved tags are
238
exported as lightweight tags.
239
240
* `jj gerrit upload` now correctly handles mixed explicit and implicit
241
Change-Ids in chains of commits ([#8219](https://github.com/jj-vcs/jj/pull/8219))
242
243
* `jj git push` now updates partially-pushed remote bookmarks accordingly.
244
[#6787](https://github.com/jj-vcs/jj/issues/6787)
245
246
* Fixed problem of loading large Git packfiles.
247
https://github.com/GitoxideLabs/gitoxide/issues/2265
248
249
* The builtin pager won't get stuck when stdin is redirected.
250
251
* `jj workspace add` now prevents creating an empty workspace name.
252
253
* Fixed checkout of symlinks pointing to themselves or `.git`/`.jj` on Unix. The
254
problem would still remain on Windows if symlinks are enabled.
255
[#8348](https://github.com/jj-vcs/jj/issues/8348)
256
257
* Fixed a bug where jj would fail to read git delta objects from pack files.
258
https://github.com/GitoxideLabs/gitoxide/issues/2344
259
260
### Contributors
261
262
Thanks to the people who made this release happen!
263
264
* Anton Älgmyr (@algmyr)
265
* Austin Seipp (@thoughtpolice)
266
* Bryce Berger (@bryceberger)
267
* Carlos Knippschild (@chuim)
268
* Cole Helbling (@cole-h)
269
* David Higgs (@higgsd)
270
* Eekle (@Eekle)
271
* Gaëtan Lehmann (@glehmann)
272
* Ian Wrzesinski (@isuffix)
273
* Ilya Grigoriev (@ilyagr)
274
* Julian Howes (@jlnhws)
275
* Kaiyi Li (@06393993)
276
* Lukas Krejci (@metlos)
277
* Martin von Zweigbergk (@martinvonz)
278
* Matt Stark (@matts1)
279
* Ori Avtalion (@salty-horse)
280
* Scott Taylor (@scott2000)
281
* Shaoxuan (Max) Yuan (@ffyuanda)
282
* Stephen Jennings (@jennings)
283
* Steve Fink (@hotsphink)
284
* Steve Klabnik (@steveklabnik)
285
* Theo Buehler (@botovq)
286
* Thomas Castiglione (@gulbanana)
287
* Vincent Ging Ho Yim (@cenviity)
288
* xtqqczze (@xtqqczze)
289
* Yuantao Wang (@0WD0)
290
* Yuya Nishihara (@yuja)
291
292
## [0.36.0] - 2025-12-03
293
294
### Release highlights
295
296
* The documentation has moved from <https://jj-vcs.github.io/jj/> to
297
<https://docs.jj-vcs.dev/>.
298
299
301 redirects are being issued towards the new domain, so any existing links
300
should not be broken.
301
302
* Fixed race condition that could cause divergent operations when running
303
concurrent `jj` commands in colocated repositories. It is now safe to
304
continuously run e.g. `jj log` without `--ignore-working-copy` in one
305
terminal while you're running other commands in another terminal.
306
[#6830](https://github.com/jj-vcs/jj/issues/6830)
307
308
* `jj` now ignores `$PAGER` set in the environment and uses `less -FRX` on most
309
platforms (`:builtin` on Windows). See [the docs](docs/config.md#pager) for
310
more information, and [#3502](https://github.com/jj-vcs/jj/issues/3502) for
311
motivation.
312
313
### Breaking changes
314
315
* In [filesets or path patterns](docs/filesets.md#file-patterns), glob matching
316
is enabled by default. You can use `cwd:"path"` to match literal paths.
317
318
* In the following commands, [string pattern
319
arguments](docs/revsets.md#string-patterns) are now parsed the same way they
320
are in revsets and can be combined with logical operators: `jj bookmark
321
delete`/`forget`/`list`/`move`, `jj tag delete`/`list`, `jj git
322
clone`/`fetch`/`push`
323
324
* In the following commands, unmatched bookmark/tag names is no longer an
325
error. A warning will be printed instead: `jj bookmark
326
delete`/`forget`/`move`/`track`/`untrack`, `jj tag delete`, `jj git
327
clone`/`push`
328
329
* The default string pattern syntax in revsets will be changed to `glob:` in a
330
future release. You can opt in to the new default by setting
331
`ui.revsets-use-glob-by-default=true`.
332
333
* Upgraded `scm-record` from v0.8.0 to v0.9.0. See release notes at
334
<https://github.com/arxanas/scm-record/releases/tag/v0.9.0>.
335
336
* The minimum supported Rust version (MSRV) is now 1.89.
337
338
* On macOS, the deprecated config directory `~/Library/Application Support/jj`
339
is not read anymore. Use `$XDG_CONFIG_HOME/jj` instead (defaults to
340
`~/.config/jj`).
341
342
* Sub-repos are no longer tracked. Any directory containing `.jj` or `.git`
343
is ignored. Note that Git submodules are unaffected by this.
344
345
### Deprecations
346
347
* The `--destination`/`-d` arguments for `jj rebase`, `jj split`, `jj revert`,
348
etc. were renamed to `--onto`/`-o`. The reasoning is that `--onto`,
349
`--insert-before`, and `--insert-after` are all destination arguments, so
350
calling one of them `--destination` was confusing and unclear. The old names
351
will be removed at some point in the future, but we realize that they are
352
deep in muscle memory, so you can expect an unusually long deprecation period.
353
354
* `jj describe --edit` is deprecated in favor of `--editor`.
355
356
* The config options `git.auto-local-bookmark` and `git.push-new-bookmarks` are
357
deprecated in favor of `remotes.<name>.auto-track-bookmarks`. For example:
358
359
```toml
360
[remotes.origin]
361
auto-track-bookmarks = "glob:*"
362
```
363
364
For more details, refer to
365
[the docs](docs/config.md#automatic-tracking-of-bookmarks).
366
367
* The flag `--allow-new` on `jj git push` is deprecated. In order to push new
368
bookmarks, please track them with `jj bookmark track`. Alternatively, consider
369
setting up an auto-tracking configuration to avoid the chore of tracking
370
bookmarks manually. For example:
371
372
```toml
373
[remotes.origin]
374
auto-track-bookmarks = "glob:*"
375
```
376
377
For more details, refer to
378
[the docs](docs/config.md#automatic-tracking-of-bookmarks).
379
380
### New features
381
382
* `jj commit`, `jj describe`, `jj squash`, and `jj split` now accept
383
`--editor`, which ensures an editor will be opened with the commit
384
description even if one was provided via `--message`/`-m`.
385
386
* All `jj` commands show a warning when the provided `fileset` expression
387
doesn't match any files.
388
389
* Added `files()` template function to `DiffStats`. This supports per-file stats
390
like `lines_added()` and `lines_removed()`
391
392
* Added `join()` template function. This is different from `separate()` in that
393
it adds a separator between all arguments, even if empty.
394
395
* `RepoPath` template type now has a `absolute() -> String` method that returns
396
the absolute path as a string.
397
398
* Added `format_path(path)` template that controls how file paths are printed
399
with `jj file list`.
400
401
* New built-in revset aliases `visible()` and `hidden()`.
402
403
* Unquoted `*` is now allowed in revsets. `bookmarks(glob:foo*)` no longer
404
needs quoting.
405
406
* `jj prev/next --no-edit` now generates an error if the working-copy has some
407
children.
408
409
* A new config option `remotes.<name>.auto-track-bookmarks` can be set to a
410
string pattern. New bookmarks matching it will be automatically tracked for
411
the specified remote. See
412
[the docs](docs/config.md#automatic-tracking-of-bookmarks).
413
414
* `jj log` now supports a `--count` flag to print the number of commits instead
415
of displaying them.
416
417
* `Commit` type now has a `conflicted_files()` method that returns a list of
418
files with merge conflicts.
419
420
* `TreeEntry` type now has a `conflict_side_count()` method that returns the number
421
of sides in a merge conflict (1 for non-conflicted files, 2 or more for
422
conflicts).
423
424
### Fixed bugs
425
426
* `jj fix` now prints a warning if a tool failed to run on a file.
427
[#7971](https://github.com/jj-vcs/jj/issues/7971)
428
429
* Shell completion now works with non‑normalized paths, fixing the previous
430
panic and allowing prefixes containing `.` or `..` to be completed correctly.
431
[#6861](https://github.com/jj-vcs/jj/issues/6861)
432
433
* Shell completion now always uses forward slashes to complete paths, even on
434
Windows. This renders completion results viable when using jj in Git Bash.
435
[#7024](https://github.com/jj-vcs/jj/issues/7024)
436
437
* Unexpected keyword arguments now return a parse failure for the `coalesce()`
438
and `concat()` templating functions.
439
440
* Nushell completion script documentation add `-f` option, to keep it up to
441
date.
442
[#8007](https://github.com/jj-vcs/jj/issues/8007)
443
444
* Ensured that with Git submodules, remnants of your submodules do not show up
445
in the working copy after running `jj new`.
446
[#4349](https://github.com/jj-vcs/jj/issues/4349)
447
448
### Contributors
449
450
Thanks to the people who made this release happen!
451
452
* abgox (@abgox)
453
* ase (@adamse)
454
* Björn Kautler (@Vampire)
455
* Bryce Berger (@bryceberger)
456
* Chase Naples (@cnaples79)
457
* David Higgs (@higgsd)
458
* edef (@edef1c)
459
* Evan Mesterhazy (@emesterhazy)
460
* Fedor (@sheremetyev)
461
* Gaëtan Lehmann (@glehmann)
462
* George Christou (@gechr)
463
* Hubert Lefevre (@Paluche)
464
* Ilya Grigoriev (@ilyagr)
465
* Jonas Greitemann (@jgreitemann)
466
* Joseph Lou (@josephlou5)
467
* Julia DeMille (@judemille)
468
* Kaiyi Li (@06393993)
469
* Kyle Lippincott (@spectral54)
470
* Lander Brandt (@landaire)
471
* Lucio Franco (@LucioFranco)
472
* Luke Randall (@lukerandall)
473
* Martin von Zweigbergk (@martinvonz)
474
* Matt Stark (@matts1)
475
* Mitchell Skaggs (@magneticflux-)
476
* Peter Schilling (@schpet)
477
* Philip Metzger (@PhilipMetzger)
478
* QingyaoLin (@QingyaoLin)
479
* Remo Senekowitsch (@senekor)
480
* Scott Taylor (@scott2000)
481
* Stephen Jennings (@jennings)
482
* Steve Klabnik (@steveklabnik)
483
* Tejas Sanap (@whereistejas)
484
* Tommi Virtanen (@tv42)
485
* Velociraptor115 (@Velociraptor115)
486
* Vincent Ging Ho Yim (@cenviity)
487
* Yuya Nishihara (@yuja)
488
489
## [0.35.0] - 2025-11-05
490
491
### Release highlights
492
493
* Workspaces can now have their own separate configuration. For instance, you
494
can use `jj config set --workspace` to update a configuration option only in
495
the current workspace.
496
497
* After creating a local bookmark, it is now possible to use `jj bookmark track`
498
to associate the bookmark with a specific remote before pushing it. When
499
pushing a tracked bookmark, it is not necessary to use `--allow-new`.
500
501
* The new `jj git colocation enable` and `jj git colocation disable` commands
502
allow converting between colocated and non-colocated workspaces.
503
504
### Breaking changes
505
506
* The `remote_bookmarks(remote=pattern)` revset now includes Git-tracking
507
bookmarks if the specified `pattern` matches `git`. The default is
508
`remote=~exact:"git"` as before.
509
510
* The deprecated flag `--summary` of `jj abandon` has been removed.
511
512
* The deprecated command `jj backout` has been removed, use `jj revert` instead.
513
514
* The following deprecated config options have been removed:
515
- `signing.sign-all`
516
- `core.watchman.register_snapshot_trigger`
517
- `diff.format`
518
519
### Deprecations
520
521
* `jj bisect run --command <cmd>` is deprecated in favor of
522
`jj bisect run -- <cmd>`.
523
524
* `jj metaedit --update-committer-timestamp` was renamed to
525
`jj metaedit --force-rewrite` since the old name (and help text)
526
incorrectly suggested that the committer name and email would _not_
527
be updated.
528
529
### New features
530
531
* Workspaces may have an additional layered configuration, located at
532
`.jj/workspace-config.toml`. `jj config` subcommands which took layer options
533
like `--repo` now also support `--workspace`.
534
535
* `jj bookmark track` can now associate new local bookmarks with remote.
536
Tracked bookmarks can be pushed without `--allow-new`.
537
[#7072](https://github.com/jj-vcs/jj/issues/7072)
538
539
* The new `jj git colocation` command provides sub-commands to show the
540
colocation state (`status`), to convert a non-colocated workspace into
541
a colocated workspace (`enable`), and vice-versa (`disable`).
542
543
* New `jj tag set`/`delete` commands to create/update/delete tags locally.
544
Created/updated tags are currently always exported to Git as lightweight
545
tags. If you would prefer them to be exported as annotated tags, please give
546
us feedback on [#7908](https://github.com/jj-vcs/jj/issues/7908).
547
548
* Templates now support a `.split(separator, [limit])` method on strings to
549
split a string into a list of substrings.
550
551
* `-G` is now available as a short form of `--no-graph` in `jj log`, `jj evolog`,
552
`jj op log`, `jj op show` and `jj op diff`.
553
554
* `jj metaedit` now accepts `-m`/`--message` option to non-interactively update
555
the change description.
556
557
* The `CryptographicSignature.key()` template method now also works for SSH
558
signatures and returns the corresponding public key fingerprint.
559
560
* Added `template-aliases.empty_commit_marker`. Users can override this value in
561
their config to change the "(empty)" label on empty commits.
562
563
* Add support for `--when.workspaces` config scopes.
564
565
* Add support for `--when.hostnames` config scopes. This allows configuration to
566
be conditionally applied based on the hostname set in `operation.hostname`.
567
568
* `jj bisect run` accepts the command and arguments to pass to the command
569
directly as positional arguments, such as
570
`jj bisect --range=..main -- cargo check --all-targets`.
571
572
* Divergent changes are no longer marked red in immutable revisions. Since the
573
revision is immutable, the user shouldn't take any action, so the red color
574
was unnecessarily alarming.
575
576
* New commit template keywords `local`/`remote_tags` to show only local/remote
577
tags. These keywords may be useful in non-colocated Git repositories where
578
local and exported `@git` tags can point to different revisions.
579
580
* `jj git clone` now supports the `--branch` option to specify the branch(es)
581
to fetch during clone. If present, the first matching branch is used as the
582
working-copy parent.
583
584
* Revsets now support logical operators in string patterns.
585
586
* `jj file track` now accepts an `--include-ignored` flag to track files that
587
are ignored by `.gitignore` or exceed the `snapshot.max-new-file-size` limit.
588
[#2837](https://github.com/jj-vcs/jj/issues/2837)
589
590
### Fixed bugs
591
592
* `jj metaedit --author-timestamp` twice with the same value no longer
593
edits the change twice in some cases.
594
595
* `jj squash`: fixed improper revision rebase when both `--insert-after` and
596
`--insert-before` were used.
597
598
* `jj undo` can now revert "fetch"/"import" operation that involves tag updates.
599
[#6325](https://github.com/jj-vcs/jj/issues/6325)
600
601
* Fixed parsing of `files(expr)` revset expression including parentheses.
602
[#7747](https://github.com/jj-vcs/jj/issues/7747)
603
604
* Fixed `jj describe --stdin` to append a final newline character.
605
606
### Contributors
607
608
Thanks to the people who made this release happen!
609
610
* Alpha Chen (@kejadlen)
611
* Angel Ezquerra (@AngelEzquerra)
612
* ase (@adamse)
613
* Austin Seipp (@thoughtpolice)
614
* Benjamin Brittain (@benbrittain)
615
* bipul (@bipulmgr)
616
* Brian Schroeder (@bts)
617
* Bryce Berger (@bryceberger)
618
* Cole Helbling (@cole-h)
619
* Daniel Luz (@mernen)
620
* David Higgs (@higgsd)
621
* Defelo (@Defelo)
622
* Fedor (@sheremetyev)
623
* Gabriel Goller (@kaffarell)
624
* Gaëtan Lehmann (@glehmann)
625
* George Christou (@gechr)
626
* Ilya Grigoriev (@ilyagr)
627
* Isaac Corbrey (@icorbrey)
628
* James Coman (@jamescoman)
629
* Joseph Lou (@josephlou5)
630
* Lander Brandt (@landaire)
631
* Martin von Zweigbergk (@martinvonz)
632
* Michael Chirico (@MichaelChirico)
633
* Owen Brooks (@owenbrooks)
634
* Peter Schilling (@schpet)
635
* Philip Metzger (@PhilipMetzger)
636
* Remo Senekowitsch (@senekor)
637
* Ross Smyth (@RossSmyth)
638
* Scott Taylor (@scott2000)
639
* Steve Fink (@hotsphink)
640
* Steve Klabnik (@steveklabnik)
641
* Theo Buehler (@botovq)
642
* Theodore Dubois (@tbodt)
643
* Theodore Keloglou (@sirodoht)
644
* Yuya Nishihara (@yuja)
645
646
## [0.34.0] - 2025-10-01
647
648
### Release highlights
649
650
* Support for uploading changes to Gerrit Code Review with `jj gerrit upload`.
651
This lets you submit trees or multiple stacks of work at once. Support
652
for fetching changes, submitting changes, and other operations is not yet
653
implemented. This should be considered experimental, and we welcome feedback
654
on using it.
655
656
* Support for automated bisection using `jj bisect run`; this will continuously
657
bisect a commit range until a given commit is found to trigger a bug.
658
659
### Breaking changes
660
661
* Git-based repositories are now colocated by default. Configure `git.colocate =
662
false` to keep the previous behavior.
663
664
* Conflicts written by jj < 0.11 are no longer supported. They will now appear
665
as regular files with a `.jjconflict` suffix and JSON contents.
666
667
* The minimum supported Rust version (MSRV) is now 1.88.
668
669
### Deprecations
670
671
* Various flags on `jj describe` and `jj commit` have been deprecated in favor
672
of `jj metaedit`. They are:
673
* `describe`: `--author`, `--reset-author`, `--no-edit`
674
* `commit`: `--author`, `--reset-author`
675
676
* The storage format of remote bookmarks and tags has changed. Remote bookmarks
677
will be written in both old and new formats to retain forward compatibility.
678
Git-tracking tags are also recorded for future native tagging support. This
679
change should be transparent, but let us know if you see anything odd.
680
681
### New features
682
683
* The new command `jj bisect run` uses binary search to find a commit that
684
introduced a bug.
685
686
* The default editor on Unix is now `nano` instead of `pico`.
687
688
* New config option `merge.hunk-level = "word"` to enable word-level merging.
689
690
* New config option `merge.same-change = "keep"` to disable lossy resolution
691
rule for same-change conflicts.
692
[#6369](https://github.com/jj-vcs/jj/issues/6369)
693
694
* Templates now support a `replace()` method on strings for pattern-based
695
string replacement with optional limits. Supports all string patterns, including
696
regex with capture groups (e.g. `"hello world".replace(regex:'(\w+) (\w+)', "$2 $1")`).
697
698
* A new builtin `hyperlink(url, text)` template alias creates clickable
699
hyperlinks using [OSC8 escape sequences](https://github.com/Alhadis/OSC8-Adoption)
700
for terminals that support them.
701
702
* Added a new conditional configuration `--when.platforms` to include
703
settings only on certain platforms.
704
705
* External diff commands now support substitution variable `$width` for the
706
number of available terminal columns.
707
708
* The new `jj gerrit upload` command allows you to upload given revisions to an
709
instance of Gerrit Code Review.
710
711
* `jj bookmark create/set/move` use the working copy as a default again and
712
no longer require an explicit revision argument. This walks back a
713
deprecation from `jj 0.26`, as the community feedback was mostly negative.
714
Instead, bookmarking an empty revision now produces a warning, to help you
715
catch the case where you meant to bookmark the parent revision.
716
717
* The revset function `exactly(x, n)` will now evaluate `x` and error if it does
718
not have exactly `n` elements.
719
720
* `jj util exec` now matches the exit status of the program it runs, and
721
doesn't print anything.
722
723
* `jj config get` now supports displaying array and table config values.
724
725
* `jj util exec` sets the environment variable `JJ_WORKSPACE_ROOT`
726
727
### Fixed bugs
728
729
* Fetching repositories that have submodules no longer errors even if
730
`submodule.recurse=true` is set in `.gitconfig` (but jj still isn't able to
731
fetch the submodules or to operate on them).
732
733
### Contributors
734
735
Thanks to the people who made this release happen!
736
737
* Angel Ezquerra (@AngelEzquerra)
738
* Anton Älgmyr (@algmyr)
739
* Antonin Delpeuch (@wetneb)
740
* Austin Seipp (@thoughtpolice)
741
* Benjamin Tan (@bnjmnt4n)
742
* Conner Petzold (@ConnerPetzold)
743
* Daniel Luz (@mernen)
744
* Daniele Sassoli (@DanieleSassoli)
745
* David Barsky (@davidbarsky)
746
* Dinu Blanovschi (@dnbln)
747
* Gaëtan Lehmann (@glehmann)
748
* George Christou (@gechr)
749
* Ian Wrzesinski (@isuffix)
750
* Ilya Grigoriev (@ilyagr)
751
* Isaac Corbrey (@icorbrey)
752
* Ivan Petkov (@ipetkov)
753
* Jonas Fierlings (@PigeonF)
754
* loudgolem (@phanirithvij)
755
* Martin von Zweigbergk (@martinvonz)
756
* Matt Stark (@matts1)
757
* Matt T. Proud (@matttproud)
758
* Michael Pratt (@prattmic)
759
* MochikoNyan (@MochikoNyan)
760
* Philip Metzger (@PhilipMetzger)
761
* Reilly Brogan (@ReillyBrogan)
762
* Remo Senekowitsch (@senekor)
763
* Reuven Lazarus (@rlazarus)
764
* Scott Taylor (@scott2000)
765
* Stephen Jennings (@jennings)
766
* Steven Sherry (@Steven0351)
767
* Theo Buehler (@botovq)
768
* Yuya Nishihara (@yuja)
769
770
## [0.33.0] - 2025-09-03
771
772
### Release highlights
773
774
* `jj undo` is now *sequential*: invoking it multiple times in sequence
775
repeatedly undoes actions in the operation log. Previously, `jj undo` would
776
only undo *the most recent* operation in the operation log. As a result, a new
777
`jj redo` command has been added.
778
779
* Experimental support for improving query performance over filesets and file
780
queries (like `jj log path/to/file.txt`) has been added. This is not enabled
781
by default. To enable this, you must use the `jj debug index-changed-paths`
782
command.
783
784
### Breaking changes
785
786
* `jj evolog` templates now accept `CommitEvolutionEntry` as context type. To
787
get `Commit` properties, use `commit.<method>()`. To customize the default
788
output, set `templates.evolog` instead of `templates.log`.
789
790
* `jj op show` now uses `templates.op_show` configuration for its default template
791
instead of `templates.op_log`.
792
793
* The deprecated config option `git.auto-local-branch` has been removed. Use
794
`git.auto-local-bookmark` instead.
795
796
* The deprecated `Signature.username()` template method has been removed. Use
797
`Signature.email().local()` instead.
798
799
* The deprecated `--config-toml` flag has been removed. Use
800
`--config=NAME=VALUE` or `--config-file=PATH` instead.
801
802
* `jj undo` can now undo multiple operations progressively by calling it
803
repeatedly, whereas previously, running `jj undo` twice was previously a no-op
804
(it only undid the last change).
805
806
* `jj git fetch` will now only fetch the refspec patterns configured on remotes
807
when the `--branch` option is omitted. Only simple refspec patterns are
808
currently supported, and anything else (like refspecs which rename branches)
809
will be ignored.
810
811
* The `conflict` label used for coloring log graph nodes was renamed to
812
`conflicted`.
813
814
### Deprecations
815
816
* The on-disk index format has changed. `jj` will write index files in both old
817
and new formats, so old `jj` versions should be able to read these index
818
files. This compatibility layer will be removed in a future release.
819
820
* `jj op undo` is deprecated in favor of `jj op revert`. (`jj undo` is still
821
available, but with new semantics. See also the breaking changes above.)
822
823
* The argument `<operation>` of `jj undo` is deprecated in favor of
824
`jj op revert <operation>`.
825
826
* The `--what` flag on `jj undo` is deprecated. Consider using
827
`jj op restore --what` instead.
828
829
### New features
830
831
* The new command `jj redo` can progressively redo operations that were
832
previously undone by multiple calls to `jj undo`.
833
834
* Templates now support `any()` and `all()` methods on lists to check whether
835
any or all elements satisfy a predicate. Example: `parents.any(|c| c.mine())`
836
returns true if any parent commit is authored by the user.
837
838
* Add experimental support for indexing changed paths, which will speed up `jj
839
log PATH` query, `jj file annotate`, etc. The changed-path index can be
840
enabled by `jj debug index-changed-paths` command. Indexing may take tens of
841
minutes depending on the number of merge commits. The indexing command UI is
842
subject to change. [#4674](https://github.com/jj-vcs/jj/issues/4674)
843
844
* `jj config list` now supports `-T'json(self) ++ "\n"'` serialization output.
845
846
* `jj file show` now accepts `-T`/`--template` option to insert file metadata.
847
848
* The template language now allows arbitrary whitespace between any operators.
849
850
* The new configuration option `git.colocate=boolean` controls whether or not
851
Git repositories are colocated by default.
852
853
* Both `jj git clone` and `jj git init` now take a `--no-colocate` flag to
854
disable colocation (in case `git.colocate` is set to `true`.)
855
856
* `jj git remote add` and `jj git clone` now support `--fetch-tags` to control
857
when tags are fetched for all subsequent fetches.
858
859
* `jj git fetch` now supports `--tracked` to fetch only tracked bookmarks.
860
861
* `jj diff --stat` now shows the change in size to binary files.
862
863
* `jj interdiff`, `jj evolog -p`, and `jj op log -p` now show diff of commit
864
descriptions.
865
866
* `jj log` and `jj op log` output can now be anonymized with the
867
`builtin_log_redacted` and `builtin_op_log_redacted` templates.
868
869
* `jj git init` now checks for an `upstream` remote in addition to `origin` when
870
setting the repository-level `trunk()` alias. The `upstream` remote takes
871
precedence over `origin` if both exist.
872
873
* Add the `jj metaedit` command, which modifies a revision's metadata. This can
874
be used to generate a new change-id, which may help resolve some divergences.
875
It also has options to modify author name, email and timestamp, as well as to
876
modify committer timestamp.
877
878
* Filesets now support case-insensitive glob patterns with the `glob-i:`,
879
`cwd-glob-i:`, and `root-glob-i:` pattern kinds. For example, `glob-i:"*.rs"`
880
will match both `file.rs` and `FILE.RS`.
881
882
* `jj op show` now accepts `-T`/`--template` option to customize the operation
883
output using template expressions, similar to `jj op log`. Also added
884
`--no-op-diff` flag to suppress the operation diff.
885
886
* A nearly identical string pattern system as revsets is now supported in the
887
template language, and is exposed as `string.match(pattern)`.
888
889
* Merge tools can use the `$path` argument to learn where the file they
890
are merging will end up in the repository.
891
892
### Fixed bugs
893
894
* `jj git clone` now correctly fetches all tags, unless `--fetch-tags` is
895
explicitly specified, in which case the specified option will apply for both
896
the initial clone and subsequent fetches.
897
898
* Operation and working-copy state files are now synchronized to disk on save.
899
This will mitigate data corruption on system crash.
900
[#4423](https://github.com/jj-vcs/jj/issues/4423)
901
902
### Packaging changes
903
904
* The test suite no longer optionally uses Taplo CLI or jq, and packagers can
905
remove them as dependencies if present.
906
907
### Contributors
908
909
* Austin Seipp (@thoughtpolice)
910
* Benjamin Tan (@bnjmnt4n)
911
* Christian Hufnagel (@OvidiusCicero)
912
* Clément (@drawbu)
913
* Daniel Luz (@mernen)
914
* Emily (@emilazy)
915
* Evan Martin (@evmar)
916
* Gaëtan Lehmann (@glehmann)
917
* George Christou (@gechr)
918
* Graham Christensen (@grahamc)
919
* Hegui Dai (@Natural-selection1)
920
* Ian Wrzesinski (@isuffix)
921
* Ilya Grigoriev (@ilyagr)
922
* Isaac Corbrey (@icorbrey)
923
* Ivan Petkov (@ipetkov)
924
* Joaquín Triñanes (@JoaquinTrinanes)
925
* Kaiyi Li (@06393993)
926
* Martin von Zweigbergk (@martinvonz)
927
* Nigthknight (@nigthknight)
928
* Nikhil Marathe (@nikhilm)
929
* Remo Senekowitsch (@senekor)
930
* Tijs-B (@Tijs-B)
931
* Yuya Nishihara (@yuja)
932
933
## [0.32.0] - 2025-08-06
934
935
### Breaking changes
936
937
* In revsets, symbol expressions (such as change ID prefix) no longer resolve to
938
multiple revisions, and error out if resolved to more than one revisions. Use
939
`change_id(prefix)` or `bookmarks(exact:name)` to query divergent changes or
940
conflicted bookmarks. Commands like `jj rebase` no longer require `all:` to
941
specify multiple destination revisions.
942
943
* `jj op abandon` now discards previous versions of a change (or predecessors)
944
if they become unreachable from the operation history. The evolution history
945
is truncated accordingly.
946
947
Once `jj op abandon` and `jj util gc` are run in a repository, old versions of
948
`jj` might get "commit not found" error on `jj evolog`.
949
950
* `commit.working_copies()` template method now returns `List<WorkspaceRef>`
951
952
* The previously predefined `amend` alias has been removed. You can restore it
953
by setting the config `aliases.amend = ["squash"]`.
954
955
### Deprecations
956
957
* The `all:` revset modifier and `ui.always-allow-large-revsets` setting is
958
planned to be removed in a future release.
959
[#6016](https://github.com/jj-vcs/jj/issues/6016)
960
961
* Rename the `core.fsmonitor` and `core.watchman` settings to
962
`fsmonitor.backend`, and `fsmonitor.watchman` respectively.
963
964
### New features
965
966
* `jj workspace list` now accepts `-T`/`--template` option to customize its
967
output via templates.
968
969
* Added `templates.workspace_list` template to customize the output of
970
`jj workspace list`.
971
972
* `jj fix` now buffers the standard error stream from subprocesses and emits
973
the output from each all at once. The file name is printed before the output.
974
975
* `jj status` now collapses fully untracked directories into one line.
976
It still fully traverses them while snapshotting but they won't clutter up
977
the output with all of their contents.
978
979
* Add the `working-copy.eol-conversion` config which is similar to the git
980
`core.autocrlf` config. A heuristics is used to detect if a file is a binary
981
file to prevent the EOL conversion from changing binary files unexpectedly.
982
983
* Add a `.parents()` method to the
984
[`Operation`](docs/templates.md#operation-type) type in the templating
985
language.
986
987
* Merge tools config can now explicitly forbid using them as diff editors or
988
diff formatters. Built-in tools that do not function well as diff editing
989
tools or as diff formatters will now report an error when used as such.
990
991
* `jj diffedit` now accepts filesets to edit only the specified paths.
992
993
* AnnotationLine objects in templates now have a `original_line_number() ->
994
Integer` method.
995
996
* Commit templates now support `.files()` to list all existing files at that
997
revision.
998
999
* Glob patterns now support `{foo,bar}` syntax. There may be subtle behavior
1000
changes as we use the [globset](https://crates.io/crates/globset) library now.
1001
1002
* The new `bisect(x)` revset function can help bisect a range of commits to
1003
find when a bug was introduced.
1004
1005
* New `first_parent()` and `first_ancestors()` revset functions which are
1006
similar to `parents()` and `ancestors()`, but only traverse the first parent
1007
of each commit (similar to Git's `--first-parent` option).
1008
1009
* New `signing.backends.ssh.revocation-list` config for specifying a list of revoked
1010
public keys for commit signature verification.
1011
1012
* `jj fix` commands now replace `$root` with the workspace's root path. This is
1013
useful for tools stored inside the workspace.
1014
1015
### Fixed bugs
1016
1017
* Fixed an error in `jj util gc` caused by the empty blob being missing from
1018
the Git store. [#7062](https://github.com/jj-vcs/jj/issues/7062)
1019
1020
* `jj op diff -p` and `jj op log -p` now show content diffs from the first
1021
predecessor only. [#7090](https://github.com/jj-vcs/jj/issues/7090)
1022
1023
* `jj git fetch` no longer shows `NaN%` progress when connecting to slow remotes.
1024
[#7155](https://github.com/jj-vcs/jj/issues/7155)
1025
1026
### Contributors
1027
1028
Thanks to the people who made this release happen!
1029
1030
* adamnemecek (@adamnemecek)
1031
* Alexander Kobjolke (@jakalx)
1032
* Apromixately (@Apromixately)
1033
* Austin Seipp (@thoughtpolice)
1034
* Bryce Berger (@bryceberger)
1035
* Daniel Danner (@dnnr)
1036
* Daniel Luz (@mernen)
1037
* Evan Martin (@evmar)
1038
* George Christou (@gechr)
1039
* George Elliott-Hunter (@george-palmsens)
1040
* Hubert Głuchowski (@afishhh)
1041
* Ilya Grigoriev (@ilyagr)
1042
* Jade Lovelace (@lf-)
1043
* Jake Martin (@jake-m-commits)
1044
* Jan Klass (@Kissaki)
1045
* Joaquín Triñanes (@JoaquinTrinanes)
1046
* Josh Steadmon (@steadmon)
1047
* Kaiyi Li (@06393993)
1048
* Martin von Zweigbergk (@martinvonz)
1049
* Nigthknight (@nigthknight)
1050
* Ori Avtalion (@salty-horse)
1051
* Pablo Brasero (@pablobm)
1052
* Pavan Kumar Sunkara (@pksunkara)
1053
* Philip Metzger (@PhilipMetzger)
1054
* phoebe (@phoreverpheebs)
1055
* Remo Senekowitsch (@senekor)
1056
* Scott Taylor (@scott2000)
1057
* Stephen Jennings (@jennings)
1058
* Theo Buehler (@botovq)
1059
* Tyarel8 (@Tyarel8)
1060
* Yuya Nishihara (@yuja)
1061
1062
## [0.31.0] - 2025-07-02
1063
1064
### Breaking changes
1065
1066
* Revset expressions like `hidden_id | description(x)` now [search the specified
1067
hidden revision and its ancestors](docs/revsets.md#hidden-revisions) as well
1068
as all visible revisions.
1069
1070
* Commit templates no longer normalize `description` by appending final newline
1071
character. Use `description.trim_end() ++ "\n"` if needed.
1072
1073
### Deprecations
1074
1075
* The `git.push-bookmark-prefix` setting is deprecated in favor of
1076
`templates.git_push_bookmark`, which supports templating. The old setting can
1077
be expressed in template as `"<prefix>" ++ change_id.short()`.
1078
1079
### New features
1080
1081
* New `change_id(prefix)`/`commit_id(prefix)` revset functions to explicitly
1082
query commits by change/commit ID prefix.
1083
1084
* The `parents()` and `children()` revset functions now accept an optional
1085
`depth` argument. For instance, `parents(x, 3)` is equivalent to `x---`, and
1086
`children(x, 3)` is equivalent to `x+++`.
1087
1088
* `jj evolog` can now follow changes from multiple revisions such as divergent
1089
revisions.
1090
1091
* `jj diff` now accepts `-T`/`--template` option to customize summary output.
1092
1093
* Log node templates are now specified in toml rather than hardcoded.
1094
1095
* Templates now support `json(x)` function to serialize values in JSON format.
1096
1097
* The ANSI 256-color palette can be used when configuring colors. For example,
1098
`colors."diff removed token" = { bg = "ansi-color-52", underline = false }`
1099
will apply a dark red background on removed words in diffs.
1100
1101
### Fixed bugs
1102
1103
* `jj file annotate` can now process files at a hidden revision.
1104
1105
* `jj op log --op-diff` no longer fails at displaying "reconcile divergent
1106
operations." [#4465](https://github.com/jj-vcs/jj/issues/4465)
1107
1108
* `jj util gc --expire=now` now passes the corresponding flag to `git gc`.
1109
1110
* `change_id`/`commit_id.shortest()` template functions now take conflicting
1111
bookmark and tag names into account.
1112
[#2416](https://github.com/jj-vcs/jj/issues/2416)
1113
1114
* Fixed lockfile issue on stale file handles observed with NFS.
1115
1116
### Packaging changes
1117
1118
* `aarch64-windows` builds (release binaries and `main` snapshots) are now provided.
1119
1120
### Contributors
1121
1122
Thanks to the people who made this release happen!
1123
1124
* Anton Älgmyr (@algmyr)
1125
* Austin Seipp (@thoughtpolice)
1126
* Benjamin Brittain (@benbrittain)
1127
* Cyril Plisko (@imp)
1128
* Daniel Luz (@mernen)
1129
* Gaëtan Lehmann (@glehmann)
1130
* Gilad Woloch (@giladwo)
1131
* Greg Morenz (@gmorenz)
1132
* Igor Velkov (@iav)
1133
* Ilya Grigoriev (@ilyagr)
1134
* Jade Lovelace (@lf-)
1135
* Jonas Greitemann (@jgreitemann)
1136
* Josh Steadmon (@steadmon)
1137
* juemrami (@juemrami)
1138
* Kaiyi Li (@06393993)
1139
* Lars Francke (@lfrancke)
1140
* Martin von Zweigbergk (@martinvonz)
1141
* Osama Qarem (@osamaqarem)
1142
* Philip Metzger (@PhilipMetzger)
1143
* raylu (@raylu)
1144
* Scott Taylor (@scott2000)
1145
* Vincent Ging Ho Yim (@cenviity)
1146
* Yuya Nishihara (@yuja)
1147
1148
## [0.30.0] - 2025-06-04
1149
1150
### Release highlights
1151
1152
* The experimental support from release 0.29.0 for transferring the change ID
1153
to/from Git remotes has been enabled by default. The change ID is stored in
1154
the Git commit itself (in a commit header called `change-id`), which means
1155
it will be transferred by regular `git push` etc. Please let us know if you
1156
run into any problems with it. You can disable it setting
1157
`git.write-change-id-header`. Note that some Git remotes (e.g GitLab) and
1158
some Git commands (e.g. `git rebase`) do not preserve the change ids when
1159
they rewrite commits.
1160
1161
* `jj rebase` now automatically abandons divergent commits if another commit
1162
with the same change ID is already present in the destination with identical
1163
changes.
1164
1165
* `jj split` has gained `--message`, `--insert-before`, `--insert-after`, and
1166
`--destination` options.
1167
1168
* `jj evolog` can show associated operations for commits created by new jj
1169
versions.
1170
1171
### Breaking changes
1172
1173
* The old `libgit2` code path for fetches and pushes has been removed,
1174
and the `git.subprocess` setting along with it.
1175
1176
* In templates, bookmark/tag/remote names are now formatted in revset symbol
1177
notation. The type of `bookmark.remote()` is changed to `Option<_>`.
1178
`bookmark.remote() == "foo"` still works, but `bookmark.remote().<method>()`
1179
might need `if(bookmark.remote(), ..)` to suppress error.
1180
1181
* `jj rebase` now automatically abandons divergent commits if another commit
1182
with the same change ID is already present in the destination with identical
1183
changes. To keep these divergent commits, use the `--keep-divergent` flag.
1184
1185
* The deprecated `--skip-empty` flag for `jj rebase` has been removed. Use the
1186
`--skip-emptied` flag instead.
1187
1188
* The deprecated `jj branch` subcommands have been removed. Use the `jj
1189
bookmark` subcommands instead.
1190
1191
* `jj util completion` now requires the name of the shell as a positional
1192
argument and no longer produces Bash completions by default. The deprecated
1193
optional arguments for different shells have been removed.
1194
1195
* External diff tools are now run in the temporary directory containing
1196
the before (`left`) and after (`right`) directories, making diffs appear
1197
more pleasing for tools that display file paths prominently. Users can
1198
opt out of this by setting `merge-tools.<tool>.diff-do-chdir = false`,
1199
but this will likely be removed in a future release. Please report any
1200
issues you run into.
1201
1202
* The minimum supported Rust version (MSRV) is now 1.85.0.
1203
1204
### Deprecations
1205
1206
* The `ui.diff.format` and `ui.diff.tool` config options have been merged as
1207
`ui.diff-formatter`. The builtin format can be specified as `:<format>`
1208
(e.g. `ui.diff-formatter=":git"` for Git diffs.)
1209
1210
* The `.normal_hex()` method will be removed from the `CommitId` template type.
1211
It's useful only for the `ChangeId` type.
1212
1213
### New features
1214
1215
* `jj split` has gained a `--message` option to set the description of the
1216
commit with the selected changes.
1217
1218
* `jj split` has gained the ability to place the revision with the selected
1219
changes anywhere in the revision tree with the `--insert-before`,
1220
`--insert-after` and `--destination` command line flags.
1221
1222
* Added `git.track-default-bookmark-on-clone` setting to control whether to
1223
track the default remote bookmark on `jj git clone`.
1224
1225
* Templates can now do arithmetic on integers with the `+`, `-`, `*`, `/`, and
1226
`%` infix operators.
1227
1228
* Evolution history is now stored in the operation log. `jj evolog` can show
1229
associated operations for commits created by new jj versions.
1230
1231
### Fixed bugs
1232
1233
* Work around a git issue that could cause subprocess operations to hang if the
1234
`core.fsmonitor` gitconfig is set in the global or system gitconfigs.
1235
[#6440](https://github.com/jj-vcs/jj/issues/6440)
1236
1237
* `jj parallelize` can now parallelize groups of changes that _start_ with an
1238
immutable change, but do not contain any other immutable changes.
1239
1240
* `jj` will no longer warn about deprecated paths on macOS if the configured
1241
XDG directory is the deprecated one (~/Library/Application Support).
1242
1243
* The builtin diff editor now correctly handles splitting changes where a file
1244
is replaced by a directory of the same name.
1245
[#5189](https://github.com/jj-vcs/jj/issues/5189)
1246
1247
### Packaging changes
1248
1249
* Due to the removal of the `libgit2` code path, packagers should remove any
1250
dependencies on `libgit2`, `libssh2`, Zlib, OpenSSL, and `pkg-config`, and
1251
ensure they are not setting the Cargo `git2` or `vendored-openssl` features.
1252
1253
### Contributors
1254
1255
Thanks to the people who made this release happen!
1256
1257
* Alper Cugun (@alper)
1258
* Austin Seipp (@thoughtpolice)
1259
* Benjamin Brittain (@benbrittain)
1260
* Benjamin Tan (@bnjmnt4n)
1261
* Bryce Berger (@bryceberger)
1262
* Colin Nelson (@orthros)
1263
* Doug Stephen (@dljsjr)
1264
* Emily (@emilazy)
1265
* Eyvind Bernhardsen (@eyvind)
1266
* Felix Geisendörfer (@felixge)
1267
* Gaëtan Lehmann (@glehmann)
1268
* Ilya Grigoriev (@ilyagr)
1269
* Isaac Corbrey (@icorbrey)
1270
* Jonas Greitemann (@jgreitemann)
1271
* Josep Mengual (@truita)
1272
* kkoang (@kkoang)
1273
* Manuel Mendez (@mmlb)
1274
* Marshall Bowers (@maxdeviant)
1275
* Martin von Zweigbergk (@martinvonz)
1276
* Mateus Auler (@mateusauler)
1277
* Michael Pratt (@prattmic)
1278
* Nicole Patricia Mazzuca (@strega-nil)
1279
* Philip Metzger (@PhilipMetzger)
1280
* Scott Taylor (@scott2000)
1281
* T6 (@tjjfvi)
1282
* Vincent Ging Ho Yim (@cenviity)
1283
* Winter (@winterqt)
1284
* Yuya Nishihara (@yuja)
1285
1286
## [0.29.0] - 2025-05-07
1287
1288
### Release highlights
1289
1290
* Experimental support for transferring the change ID to/from Git remotes behind configuration
1291
setting `git.write-change-id-header`. If this is enabled, the change ID will be stored in the Git
1292
commit itself (in a commit header called `change-id`), which means it will be transferred by
1293
regular `git push` etc. This is an evolving feature that currently defaults to "false". This
1294
default will likely change in the future as we gain confidence with forge support and user
1295
expectations.
1296
1297
### Breaking changes
1298
1299
* `jj git push -c`/`--change` no longer moves existing local bookmarks.
1300
1301
* The `editor-*.jjdescription` files passed to your editor by e.g. `jj describe`
1302
are now written to your system's temporary directory instead of `.jj/repo/`.
1303
1304
### Deprecations
1305
1306
* `git.subprocess = false` has been deprecated, and the old `libgit2`
1307
code path for fetches and pushes will be removed entirely in 0.30.
1308
Please report any remaining issues you have with the Git
1309
subprocessing path.
1310
1311
* `ui.default-description` has been deprecated, and will be migrated to
1312
`template-aliases.default_commit_description`. Please also consider using
1313
[`templates.draft_commit_description`](docs/config.md#default-description),
1314
and/or [`templates.commit_trailers`](docs/config.md#commit-trailers).
1315
1316
* On macOS, config.toml files in `~/Library/Application Support/jj` are
1317
deprecated; one should instead use `$XDG_CONFIG_HOME/jj`
1318
(defaults to `~/.config/jj`)
1319
1320
### New features
1321
1322
* Color-words diff has gained [an option to compare conflict pairs without
1323
materializing](docs/config.md#color-words-diff-options).
1324
1325
* `jj show` patches can now be suppressed with `--no-patch`.
1326
1327
* Added `ui.bookmark-list-sort-keys` setting to configure default sort keys for the
1328
`jj bookmark list` command.
1329
1330
* New `signed` revset function to filter for cryptographically signed commits.
1331
1332
* `jj describe`, `jj commit`, `jj new`, `jj squash` and `jj split` add the
1333
commit trailers, configured in the `commit_trailers` template, to the commit
1334
description. Use cases include DCO Sign Off and Gerrit Change Id.
1335
1336
* Added `duplicate_description` template, which allows [customizing the descriptions
1337
of the commits `jj duplicate` creates](docs/config.md#duplicate-commit-description).
1338
1339
* `jj absorb` can now squash a deleted file if it was added by one of the
1340
destination revisions.
1341
1342
* Added `ui.streampager.show-ruler` setting to configure whether the ruler should be
1343
shown when the builtin pager starts up.
1344
1345
* `jj git fetch` now warns instead of erroring for unknown `git.fetch` remotes
1346
if other remotes are available.
1347
1348
* Commit objects in templates now have `trailers() -> List<Trailer>`, the Trailer
1349
objects have `key() -> String` and `value() -> String`.
1350
1351
* `jj config edit` will now roll back to previous version if a syntax error has been introduced in the new config.
1352
1353
* When using dynamic command-line completion, revision names will be completed
1354
in more complex expressions. For example, typing
1355
`jj log -r first-bookmark..sec` and then pressing Tab could complete the
1356
expression to `first-bookmark..second-bookmark`.
1357
1358
### Fixed bugs
1359
1360
* Fixed crash on change-delete conflict resolution.
1361
[#6250](https://github.com/jj-vcs/jj/issues/6250)
1362
1363
* The builtin diff editor now tries to preserve unresolved conflicts.
1364
[#4963](https://github.com/jj-vcs/jj/issues/4963)
1365
1366
* Fixed bash and zsh shell completion when completing aliases of multiple arguments.
1367
[#5377](https://github.com/jj-vcs/jj/issues/5377)
1368
1369
### Packaging changes
1370
1371
* Jujutsu now uses
1372
[`zlib-rs`](https://github.com/trifectatechfoundation/zlib-rs), a
1373
fast compression library written in Rust. Packagers should remove any
1374
dependency on CMake and drop the `packaging` Cargo feature.
1375
1376
### Contributors
1377
1378
Thanks to the people who made this release happen!
1379
1380
* Aleksey Kuznetsov (@zummenix)
1381
* Austin Seipp (@thoughtpolice)
1382
* Benjamin Brittain (@benbrittain)
1383
* Benjamin Tan (@bnjmnt4n)
1384
* Caleb White (@calebdw)
1385
* Daniel Luz (@mernen)
1386
* Emily (@emilazy)
1387
* Emily (@neongreen)
1388
* Gaëtan Lehmann (@glehmann)
1389
* George Christou (@gechr)
1390
* Ilya Grigoriev (@ilyagr)
1391
* Jacob Hayes (@JacobHayes)
1392
* Jonas Greitemann (@jgreitemann)
1393
* Josh Steadmon (@steadmon)
1394
* Martin von Zweigbergk (@martinvonz)
1395
* Mateus Auler (@mateusauler)
1396
* Nicole Patricia Mazzuca (@strega-nil)
1397
* Nils Koch (@nilskch)
1398
* Philip Metzger (@PhilipMetzger)
1399
* Remo Senekowitsch (@senekor)
1400
* Sam (@Samasaur1)
1401
* Steve Fink (@hotsphink)
1402
* Théo Daron (@tdaron)
1403
* TimerErTim (@TimerErTim)
1404
* Vincent Ging Ho Yim (@cenviity)
1405
* Winter (@winterqt)
1406
* Yuya Nishihara (@yuja)
1407
1408
## [0.28.2] - 2025-04-07
1409
1410
### Fixed bugs
1411
1412
* Fixed problem that old commits could be re-imported from Git.
1413
https://github.com/GitoxideLabs/gitoxide/issues/1928
1414
1415
## [0.28.1] - 2025-04-04
1416
1417
### Security fixes
1418
1419
* Fixed SHA-1 collision attacks not being detected.
1420
([GHSA-794x-2rpg-rfgr](https://github.com/jj-vcs/jj/security/advisories/GHSA-794x-2rpg-rfgr))
1421
1422
### Fixed bugs
1423
1424
* Resolved some potential build issues for packagers.
1425
[#6232](https://github.com/jj-vcs/jj/pull/6232)
1426
1427
* Fix a bug with `:ours` and `:theirs` merge tools involving conflicted trees
1428
with more than two sides. [#6227](https://github.com/jj-vcs/jj/pull/6227)
1429
1430
### Contributors
1431
1432
Thanks to the people who made this release happen!
1433
1434
* Emily (@emilazy)
1435
* Ilya Grigoriev (@ilyagr)
1436
* Nicole Patricia Mazzuca (@strega-nil)
1437
* Scott Taylor (@scott2000)
1438
* Yuya Nishihara (@yuja)
1439
1440
## [0.28.0] - 2025-04-02
1441
1442
### Release highlights
1443
1444
* jj's configuration can now be split into multiple files more easily.
1445
1446
* `jj resolve` now accepts built-in tools `:ours` and `:theirs`.
1447
1448
* In colocated repos, newly-created files will now appear in `git diff`.
1449
1450
* A long-standing bug relating to empty files in the built-in diff editor was
1451
fixed. [#3702](https://github.com/jj-vcs/jj/issues/3702)
1452
1453
### Breaking changes
1454
1455
* The minimum supported Rust version (MSRV) is now 1.84.0.
1456
1457
* The `git.push-branch-prefix` config has been removed in favor of
1458
`git.push-bookmark-prefix`.
1459
1460
* `jj abandon` no longer supports `--summary` to suppress the list of abandoned
1461
commits. The list won't show more than 10 commits to not clutter the console.
1462
1463
* `jj unsquash` has been removed in favor of `jj squash` and
1464
`jj diffedit --restore-descendants`.
1465
1466
* The `jj untrack` subcommand has been removed in favor of `jj file untrack`.
1467
1468
* The following deprecated revset functions have been removed:
1469
- `branches()`, `remote_branches()`, `tracked_remote_branches()`, and
1470
`untracked_remote_branches()`, which were renamed to "bookmarks".
1471
- `file()` and `conflict()`, which were renamed to plural forms.
1472
- `files(x, y, ..)` with multiple patterns. Use `files(x|y|..)` instead.
1473
1474
* The following deprecated template functions have been removed:
1475
- `branches()`, `local_branches()`, and `remote_branches()`, which were
1476
renamed to "bookmarks".
1477
1478
* The flags `--all` and `--tracked` on `jj git push` by themself do not cause
1479
deleted bookmarks to be pushed anymore, as an additional safety measure. They
1480
can now be combined with `--deleted` instead.
1481
1482
### Deprecations
1483
1484
* `core.watchman.register_snapshot_trigger` has been renamed to `core.watchman.register-snapshot-trigger` for consistency with other configuration options.
1485
1486
* `jj backout` is deprecated in favor of `jj revert`.
1487
1488
### New features
1489
1490
* `jj sign` can now sign with PKCS#12 certificates through the `gpgsm` backend.
1491
1492
* `jj sign` will automatically use the gpg key associated with the author's email
1493
in the absence of a `signing.key` configuration.
1494
1495
* Multiple user configs are now supported and are loaded in the following precedence order:
1496
- `$HOME/.jjconfig.toml`
1497
- `$XDG_CONFIG_HOME/jj/config.toml`
1498
- `$XDG_CONFIG_HOME/jj/conf.d/*.toml`
1499
1500
* The `JJ_CONFIG` environment variable can now contain multiple paths separated
1501
by a colon (or semicolon on Windows).
1502
1503
* The command `jj config list` now supports showing the origin of each variable
1504
via the `builtin_config_list_detailed` template.
1505
1506
* `jj config {edit,set,unset}` now prompt when multiple config files are found.
1507
1508
* `jj diff -r` now allows multiple revisions (as long as there are no gaps in
1509
the revset), such as `jj diff -r 'mutable()'`.
1510
1511
* `jj git push` now accepts a `--named NAME=REVISION` argument to create a named
1512
bookmark and immediately push it.
1513
1514
* The 'how to resolve conflicts' hint that is shown when conflicts appear can
1515
be hidden by setting `hints.resolving-conflicts = false`.
1516
1517
* `jj op diff` and `jj op log --op-diff` now show changes to which commits
1518
correspond to working copies.
1519
1520
* `jj op log -d` is now an alias for `jj op log --op-diff`.
1521
1522
* `jj bookmark move --to/--from` can now be abbreviated to `jj bookmark move -t/-f`
1523
1524
* `jj bookmark list` now supports `--sort` option. Similar to `git branch --sort`.
1525
See `jj bookmark list --help` for more details.
1526
1527
* A new command `jj revert` is added, which is similar to `jj backout` but
1528
adds the `--destination`, `--insert-after`, and `--insert-before` options to
1529
customize the location of reverted commits.
1530
1531
* A new command `jj git root` is added, which prints the location of the Git
1532
directory of a repository using the Git backend.
1533
1534
* In colocated repos, any files that jj considers added in the working copy will
1535
now show up in `git diff` (as if you had run `git add --intent-to-add` on
1536
them).
1537
1538
* Reversing colors is now supported. For example, to highlight words by
1539
reversing colors rather than underlining, you can set
1540
`colors."diff token"={ underline = false, reverse = true }` in your config.
1541
1542
* Added `revsets.log-graph-prioritize`, which can be used to configure
1543
which branch in the `jj log` graph is displayed on the left instead of `@`
1544
(e.g. `coalesce(description("megamerge\n"), trunk())`)
1545
1546
* `jj resolve` now accepts new built-in merge tools `:ours` and `:theirs`.
1547
These merge tools accept side #1 and side #2 of the conflict respectively.
1548
1549
### Fixed bugs
1550
1551
* `jj log -p --stat` now shows diff stats as well as the default color-words/git
1552
diff output. [#5986](https://github.com/jj-vcs/jj/issues/5986)
1553
1554
* The built-in diff editor now correctly handles deleted files.
1555
[#3702](https://github.com/jj-vcs/jj/issues/3702)
1556
1557
* The built-in diff editor now correctly retains the executable bit on newly
1558
added files when splitting. [#3846](https://github.com/jj-vcs/jj/issues/3846)
1559
1560
* `jj config set`/`--config` value parsing rule is relaxed in a way that
1561
unquoted apostrophes are allowed.
1562
[#5748](https://github.com/jj-vcs/jj/issues/5748)
1563
1564
* `jj fix` could previously create new conflicts when a descendant of a fixed
1565
revision was already correctly formatted.
1566
1567
### Contributors
1568
1569
Thanks to the people who made this release happen!
1570
1571
* Aleksey Kuznetsov (@zummenix)
1572
* Anton Älgmyr (@algmyr)
1573
* Austin Seipp (@thoughtpolice)
1574
* Baltasar Dinis (@bsdinis)
1575
* Benjamin Tan (@bnjmnt4n)
1576
* Brandon Hall (@tenkabuto)
1577
* Caleb White (@calebdw)
1578
* Daniel Luz (@mernen)
1579
* David Rieber (@drieber)
1580
* demize (@demize)
1581
* Emily (@emilazy)
1582
* Evan Mesterhazy (@emesterhazy)
1583
* Fedor Sheremetyev (@sheremetyev)
1584
* George Christou (@gechr)
1585
* Ilya Grigoriev (@ilyagr)
1586
* Jakob Hellermann (@jakobhellermann)
1587
* Jo Liss (@joliss)
1588
* Joachim Desroches (@jedesroches)
1589
* Johannes Altmanninger (@krobelus)
1590
* Jonathan Gilchrist (@jgilchrist)
1591
* Kenyon Ralph (@kenyon)
1592
* Lucas Garron (@lgarron)
1593
* Martin von Zweigbergk (@martinvonz)
1594
* Nick Pupko (@npupko)
1595
* Philip Metzger (@PhilipMetzger)
1596
* Raphael Borun Das Gupta (@das-g)
1597
* Remo Senekowitsch (@senekor)
1598
* Robin Stocker (@robinst)
1599
* Scott Taylor (@scott2000)
1600
* Siva Mahadevan (@svmhdvn)
1601
* Vincent Ging Ho Yim (@cenviity)
1602
* Yuya Nishihara (@yuja)
1603
1604
## [0.27.0] - 2025-03-05
1605
1606
### Release highlights
1607
1608
* `git.subprocess` is now enabled by default, improving compatibility with Git
1609
fetches and pushes by spawning an external `git` process. Users can opt out
1610
of this by setting `git.subprocess = false`, but this will likely be removed
1611
in a future release. Please report any issues you run into.
1612
1613
### Breaking changes
1614
1615
* Bookmark name to be created/updated is now parsed as [a revset
1616
symbol](docs/revsets.md#symbols). Quotation may be needed in addition to shell
1617
quotes. Example: `jj bookmark create -r@- "'name with space'"`
1618
1619
* `jj bookmark create`, `jj bookmark set` and `jj bookmark move` onto a hidden
1620
commit make it visible.
1621
1622
* `jj bookmark forget` now untracks any corresponding remote bookmarks instead
1623
of forgetting them, since forgetting a remote bookmark can be unintuitive.
1624
The old behavior is still available with the new `--include-remotes` flag.
1625
1626
* `jj fix` now always sets the working directory of invoked tools to be the
1627
workspace root, instead of the working directory of the `jj fix`.
1628
1629
* The `ui.allow-filesets` configuration option has been removed.
1630
[The "fileset" language](docs/filesets.md) has been enabled by default since v0.20.
1631
1632
* `templates.annotate_commit_summary` is renamed to `templates.file_annotate`,
1633
and now has an implicit `self` parameter of type `AnnotationLine`, instead of
1634
`Commit`. All methods on `Commit` can be accessed with `commit.method()`, or
1635
`self.commit().method()`.
1636
1637
### Deprecations
1638
1639
* This release takes the first steps to make target revision required in
1640
`bookmark create`, `bookmark move` and `bookmark set`. Those commands will display
1641
a warning if the user does not specify target revision explicitly. In the near
1642
future those commands will fail if target revision is not specified.
1643
1644
* The `signing.sign-all` config option has been deprecated in favor of
1645
`signing.behavior`. The new option accepts `drop` (never sign), `keep` (preserve
1646
existing signatures), `own` (sign own commits), or `force` (sign all commits).
1647
Existing `signing.sign-all = true` translates to `signing.behavior = "own"`, and
1648
`false` translates to `"keep"`. Invalid configuration is now an error.
1649
1650
### New features
1651
1652
* The new `jj sign` and `jj unsign` commands allow for signing/unsigning commits.
1653
`jj sign` supports configuring the default revset through `revsets.sign` when
1654
no `--revisions` arguments are provided.
1655
1656
* `jj git fetch` now supports [string pattern syntax](docs/revsets.md#string-patterns)
1657
on `--remote` option and `git.fetch` configuration.
1658
1659
* Template functions `truncate_start()` and `truncate_end()` gained an optional
1660
`ellipsis` parameter; passing this prepends or appends the ellipsis to the
1661
content if it is truncated to fit the maximum width.
1662
1663
* Templates now support `stringify(x)` function and string method
1664
`.escape_json()`. The latter serializes the string in JSON format. It is
1665
useful for making machine-readable templates by escaping problematic
1666
characters like `\n`.
1667
1668
* Templates now support `trim()`, `trim_start()` and `trim_end()` methods
1669
which remove whitespace from the start and end of a `String` type.
1670
1671
* The description of commits backed out by `jj backout` can now be configured
1672
using `templates.backout_description`.
1673
1674
* New `AnnotationLine` templater type. Used in `templates.file_annotate`.
1675
Provides `self.commit()`, `.content()`, `.line_number()`, and
1676
`.first_line_in_hunk()`.
1677
1678
* Templates now have `format_short_operation_id(id)` function for users to
1679
customize the default operation id representation.
1680
1681
* The `jj init`/`jj revert` stubs that print errors can now be overridden with
1682
aliases. All of `jj clone/init/revert` add a hint to a generic error.
1683
1684
* Help text is now colored (when stdout is a terminal).
1685
1686
* Commands that used to suggest `--ignore-immutable` now print the number of
1687
immutable commits that would be rewritten if used and a link to the docs.
1688
1689
* `jj undo` now shows a hint when undoing an undo operation that the user may
1690
be looking for `jj op restore` instead.
1691
1692
### Fixed bugs
1693
1694
* `jj status` now shows untracked files under untracked directories.
1695
[#5389](https://github.com/jj-vcs/jj/issues/5389)
1696
1697
* Added workaround for the bug that untracked files are ignored when watchman is
1698
enabled. [#5728](https://github.com/jj-vcs/jj/issues/5728)
1699
1700
* The `signing.backends.ssh.allowed-signers` configuration option will now
1701
expand `~/` to `$HOME/`.
1702
[#5626](https://github.com/jj-vcs/jj/pull/5626)
1703
1704
* `config-schema.json` now allows arrays of strings for the settings `ui.editor`
1705
and `ui.diff.tool`.
1706
1707
* `config-schema.json` now allows an array of strings or nested table for the
1708
`ui.pager` setting.
1709
1710
### Contributors
1711
1712
Thanks to the people who made this release happen!
1713
1714
* Alain Leufroy (@aleufroy)
1715
* Aleksey Kuznetsov (@zummenix)
1716
* Alexander Mikhailov (@AM5800)
1717
* Andrew Gilbert (@andyg0808)
1718
* Antoine Martin (@alarsyo)
1719
* Anton Bulakh (@necauqua)
1720
* Austin Seipp (@thoughtpolice)
1721
* Baltasar Dinis (@bsdinis)
1722
* Benjamin Tan (@bnjmnt4n)
1723
* Bryce Berger (@bryceberger)
1724
* Burak Varlı (@unexge)
1725
* David Rieber (@drieber)
1726
* Emily (@emilazy)
1727
* Evan Mesterhazy (@emesterhazy)
1728
* George Christou (@gechr)
1729
* HKalbasi (@HKalbasi)
1730
* Ilya Grigoriev (@ilyagr)
1731
* Jacob Hayes (@JacobHayes)
1732
* Jonathan Frere (@MrJohz)
1733
* Jonathan Tan (@jonathantanmy)
1734
* Josh Steadmon (@steadmon)
1735
* maan2003 (@maan2003)
1736
* Martin von Zweigbergk (@martinvonz)
1737
* Matthew Davidson (@KingMob)
1738
* Philip Metzger (@PhilipMetzger)
1739
* Philipp Albrecht (@pylbrecht)
1740
* Roman Timushev (@rtimush)
1741
* Samuel Tardieu (@samueltardieu)
1742
* Scott Taylor (@scott2000)
1743
* Stephan Hügel (@urschrei)
1744
* Vincent Ging Ho Yim (@cenviity)
1745
* Yuya Nishihara (@yuja)
1746
1747
## [0.26.0] - 2025-02-05
1748
1749
### Release highlights
1750
1751
* Improved Git push/fetch compatibility by spawning an external `git` process.
1752
This can be enabled by the `git.subprocess=true` config knob, and will be the
1753
default in a future release.
1754
1755
* `jj log` can now show cryptographic commit signatures. The output can be
1756
controlled by the `ui.show-cryptographic-signatures=true` config knob.
1757
1758
### Breaking changes
1759
1760
* `jj abandon` now deletes bookmarks pointing to the revisions to be abandoned.
1761
Use `--retain-bookmarks` to move bookmarks backwards. If deleted bookmarks
1762
were tracking remote bookmarks, the associated bookmarks (or branches) will be
1763
deleted from the remote on `jj git push --all`.
1764
[#3505](https://github.com/jj-vcs/jj/issues/3505)
1765
1766
* `jj init --git` and `jj init --git-repo` have been removed. They were
1767
deprecated in early 2024. Use `jj git init` instead.
1768
1769
* The following deprecated commands have been removed:
1770
- `jj cat` is replaced by `jj file show`.
1771
- `jj chmod` is replaced by `jj file chmod`.
1772
- `jj files` is replaced by `jj file list`.
1773
1774
* The deprecated `-l` short alias for `--limit` in `jj log`, `jj op log`
1775
and `jj obslog` has been removed. The `-n` short alias can be used instead.
1776
1777
* The deprecated `--siblings` options for `jj split` has been removed.
1778
`jj split --parallel` can be used instead.
1779
1780
* The deprecated `fix.tool-command` config option has been removed.
1781
1782
* In colocated repos, the Git index now contains the changes from all parents
1783
of the working copy instead of just the first parent (`HEAD`). 2-sided
1784
conflicts from the merged parents are now added to the Git index as conflicts
1785
as well.
1786
1787
* The following change introduced in 0.25.0 is reverted:
1788
- `jj config list` now prints inline tables `{ key = value, .. }` literally.
1789
Inner items of inline tables are no longer merged across configuration
1790
files.
1791
1792
* `jj resolve` will now attempt to resolve all conflicted files instead of
1793
resolving the first conflicted file. To resolve a single file, pass a file
1794
path to `jj resolve`.
1795
1796
* `jj util mangen` is replaced with `jj util install-man-pages`, which can
1797
install man pages for all `jj` subcommands to a given path.
1798
1799
* In `jj config list` template, `value` is now typed as `ConfigValue`, not as
1800
`String` serialized in TOML syntax.
1801
1802
* `jj git remote add`/`set-url` now converts relative Git remote path to
1803
absolute path.
1804
1805
* `jj log`/`op log` now applies `-n`/`--limit` *before* the items are reversed.
1806
Rationale: It's more useful to see the N most recent commits/operations, and
1807
is more performant. The old behavior can be achieved by `jj log .. | head`.
1808
[#5403](https://github.com/jj-vcs/jj/issues/5403)
1809
1810
* Upgraded `scm-record` from v0.4.0 to v0.5.0. See release notes at
1811
<https://github.com/arxanas/scm-record/releases/tag/v0.5.0>.
1812
1813
* The builtin pager is switched to
1814
[streampager](https://github.com/markbt/streampager/). It can handle large
1815
inputs better and can be configured.
1816
1817
* Conflicts materialized in the working copy before `jj 0.19.0` may no longer
1818
be parsed correctly. If you are using version 0.18.0 or earlier, check out a
1819
non-conflicted commit before upgrading to prevent issues.
1820
1821
### Deprecations
1822
1823
### New features
1824
1825
* `jj git {push,clone,fetch}` can now spawn an external `git` subprocess, via
1826
the `git.subprocess = true` config knob. This provides an alternative that,
1827
when turned on, fixes SSH bugs when interacting with Git remotes due to
1828
`libgit2`s limitations [#4979](https://github.com/jj-vcs/jj/issues/4979).
1829
1830
* `jj describe` now accepts `--edit`.
1831
1832
* `jj evolog` and `jj op log` now accept `--reversed`.
1833
1834
* `jj restore` now supports `-i`/`--interactive` selection.
1835
1836
* `jj file list` now supports templating.
1837
1838
* There is a new `builtin_op_log_oneline` template alias you can pass to `jj op
1839
log -T` for a more compact output. You can use `format_operation_oneline` and
1840
`format_snapshot_operation_oneline` to customize parts of it.
1841
1842
* New template function `config(name)` to access to configuration variable from
1843
template.
1844
1845
* New template function `pad_centered()` to center content within a minimum
1846
width.
1847
1848
* Templater now supports `list.filter(|x| ..)` method.
1849
1850
* The `diff` commit template keyword now supports custom formatting via
1851
`diff.files()`. For example, `diff.files().map(|e| e.path().display())` prints
1852
changed file paths.
1853
1854
* The `diff.stat()` template method now provides methods to get summary values.
1855
1856
* `jj log` can now show cryptographic commit signatures. The output can be
1857
controlled by the `ui.show-cryptographic-signatures=true` config knob. The
1858
signature template can be customized using
1859
`format_detailed_cryptographic_signature(signature)` and
1860
`format_short_cryptographic_signature(signature)`.
1861
1862
* New `git.sign-on-push` config option to automatically sign commits which are
1863
being pushed to a Git remote.
1864
1865
* New `git.push-new-bookmarks` config option to push new bookmarks without
1866
`--allow-new`.
1867
1868
* `jj status` now shows untracked files when they reside directly under a
1869
tracked directory. There's still an issue that files under untracked
1870
directories aren't listed. [#5389](https://github.com/jj-vcs/jj/issues/5389)
1871
1872
* New `merge-tools.<TOOL>.diff-expected-exit-codes` config option to suppress
1873
warnings from tools exiting with non-zero exit codes.
1874
1875
* New `fix.tools.TOOL.enabled` config option to enable/disable tools. This is
1876
useful for defining disabled tools in user configuration that can be enabled
1877
in individual repositories with one config setting.
1878
1879
* Added `--into` flag to `jj restore`, similarly to `jj squash` and `jj
1880
absorb`. It is equivalent to `--to`, but `--into` is the recommended name.
1881
1882
* Italic text is now supported. You can set e.g. `colors.error = { fg = "red",
1883
italic = true }` in your config.
1884
1885
* New `author_name`/`author_email`/`committer_name`/`committer_email(pattern)`
1886
revset functions to match either name or email field explicitly.
1887
1888
* New `subject(pattern)` revset function that matches first line of commit
1889
descriptions.
1890
1891
* Conditional configuration now supports `--when.commands` to change
1892
configuration based on subcommand.
1893
1894
* The Jujutsu documentation site now publishes a schema for the official
1895
configuration file, which can be integrated into your editor for autocomplete,
1896
inline errors, and more.
1897
Please [see the documentation](docs/config.md#json-schema-support) for more
1898
on this.
1899
1900
### Fixed bugs
1901
1902
* `jj git fetch` with multiple remotes will now fetch from all remotes before
1903
importing refs into the jj repo. This fixes a race condition where the
1904
treatment of a commit that is found in multiple fetch remotes depended on the
1905
order the remotes were specified.
1906
1907
* Fixed diff selection by external tools with `jj split`/`commit -i FILESETS`.
1908
[#5252](https://github.com/jj-vcs/jj/issues/5252)
1909
1910
* Conditional configuration now applies when initializing new repository.
1911
[#5144](https://github.com/jj-vcs/jj/issues/5144)
1912
1913
* `[diff.<format>]` configuration now applies to `.diff().<format>()` commit
1914
template methods.
1915
1916
* Conflicts at the end of files which don't end with a newline character are
1917
now materialized in a way that can be parsed correctly.
1918
[#3968](https://github.com/jj-vcs/jj/issues/3968)
1919
1920
* Bookmark and remote names written by `jj git clone` to
1921
`revset-aliases.'trunk()'` are now escaped if necessary.
1922
[#5359](https://github.com/jj-vcs/jj/issues/5359)
1923
1924
### Contributors
1925
1926
Thanks to the people who made this release happen!
1927
1928
* Angel Ezquerra (@AngelEzquerra)
1929
* Antoine Martin (@alarsyo)
1930
* Anton Bulakh (@necauqua)
1931
* Austin Seipp (@thoughtpolice)
1932
* Baltasar Dinis (@bsdinis)
1933
* Benjamin Tan (@bnjmnt4n)
1934
* blinry (@blinry)
1935
* Bryce Berger (@bryceberger)
1936
* Charlie-83 (@Charlie-83)
1937
* Christian Stoitner (@cstoitner)
1938
* Evan Martin (@evmar)
1939
* George Christou (@gechr)
1940
* Ilya Grigoriev (@ilyagr)
1941
* Jakob Hellermann (@jakobhellermann)
1942
* JDSeiler (@JDSeiler)
1943
* Jonathan Frere (@MrJohz)
1944
* Jonathan Gilchrist (@jgilchrist)
1945
* Josh Steadmon (@steadmon)
1946
* Martin von Zweigbergk (@martinvonz)
1947
* Matt Kulukundis (@fowles)
1948
* Ollivier Robert (@keltia)
1949
* Philip Metzger (@PhilipMetzger)
1950
* Philipp Albrecht (@pylbrecht)
1951
* Robert Jackson (@rwjblue)
1952
* Samuel Tardieu (@samueltardieu)
1953
* Scott Taylor (@scott2000)
1954
* Stephen Jennings (@jennings)
1955
* Valentin Gatien-Baron (@v-gb)
1956
* Vincent Ging Ho Yim (@cenviity)
1957
* Waleed Khan (@arxanas)
1958
* Yuya Nishihara (@yuja)
1959
1960
## [0.25.0] - 2025-01-01
1961
1962
### Release highlights
1963
1964
It's the holidays, and this release was overall pretty quiet, without many major
1965
changes. Two select improvements:
1966
1967
* Improvements to configuration management, including support for [conditional
1968
variables](docs/config.md#conditional-variables) in config files.
1969
1970
* Large files in the working copy will no longer cause commands to fail; instead
1971
the large files will remain intact but untracked in the working copy.
1972
1973
### Breaking changes
1974
1975
* Configuration variables are no longer "stringly" typed. For example, `true` is
1976
not converted to a string `"true"`, and vice versa.
1977
1978
* The following configuration variables are now parsed strictly:
1979
`colors.<labels>`, `git.abandon-unreachable-commits`,
1980
`git.auto-local-bookmark`, `git.push-bookmark-prefix`, `revsets.log`,
1981
`revsets.short-prefixes`, `signing.backend`, `operation.hostname`,
1982
`operation.username`, `ui.allow-init-native`, `ui.color`,
1983
`ui.default-description`, `ui.progress-indicator`, `ui.quiet`, `user.email`,
1984
`user.name`
1985
1986
* `jj config list` now prints inline tables `{ key = value, .. }` literally.
1987
Inner items of inline tables are no longer merged across configuration files.
1988
See [the table syntax
1989
documentation](docs/config.md#dotted-style-and-headings) for
1990
details.
1991
1992
* `jj config edit --user` now opens a file even if `$JJ_CONFIG` points to a
1993
directory. If there are multiple config files, the command will fail.
1994
1995
* `jj config set` no longer accepts a bare string value that looks like a TOML
1996
expression. For example, `jj config set NAME '[foo]'` must be quoted as `jj
1997
config set NAME '"[foo]"'`.
1998
1999
* The deprecated `[alias]` config section is no longer respected. Move command
2000
aliases to the `[aliases]` section.
2001
2002
* `jj absorb` now abandons the source commit if it becomes empty and has no
2003
description.
2004
2005
### Deprecations
2006
2007
* `--config-toml=TOML` is deprecated in favor of `--config=NAME=VALUE` and
2008
`--config-file=PATH`.
2009
2010
* The `Signature.username()` template method is deprecated for
2011
`Signature.email().local()`.
2012
2013
### New features
2014
2015
* `jj` command no longer fails due to new working-copy files larger than the
2016
`snapshot.max-new-file-size` config option. It will print a warning and large
2017
files will be left untracked.
2018
2019
* Configuration files now support [conditional
2020
variables](docs/config.md#conditional-variables).
2021
2022
* New command options `--config=NAME=VALUE` and `--config-file=PATH` to set
2023
string value without quoting and to load additional configuration from files.
2024
2025
* Templates now support the `>=`, `>`, `<=`, and `<` relational operators for
2026
`Integer` types.
2027
2028
* A new Email template type is added. `Signature.email()` now returns an Email
2029
template type instead of a String.
2030
2031
* Adds a new template alias `commit_timestamp(commit)` which defaults to the
2032
committer date.
2033
2034
* Conflict markers are now allowed to be longer than 7 characters, allowing
2035
conflicts to be materialized and parsed correctly in files which already
2036
contain lines that look like conflict markers.
2037
2038
* New `$marker_length` variable to allow merge tools to support longer conflict
2039
markers (equivalent to "%L" for Git merge drivers).
2040
2041
* `jj describe` now accepts a `JJ: ignore-rest` line that ignores everything
2042
below it, similar to a "scissor line" in git. When editing multiple commits,
2043
only ignore until the next `JJ: describe` line.
2044
2045
### Fixed bugs
2046
2047
* The `$NO_COLOR` environment variable must now be non-empty to be respected.
2048
2049
* Fixed incompatible rendering of empty hunks in git/unified diffs.
2050
[#5049](https://github.com/jj-vcs/jj/issues/5049)
2051
2052
* Fixed performance of progress bar rendering when fetching from Git remote.
2053
[#5057](https://github.com/jj-vcs/jj/issues/5057)
2054
2055
* `jj config path --user` no longer creates new file at the default config path.
2056
2057
* On Windows, workspace paths (printed by `jj root`) no longer use UNC-style
2058
`\\?\` paths unless necessary.
2059
2060
* On Windows, `jj git clone` now converts local Git remote path to
2061
slash-separated path.
2062
2063
* `jj resolve` no longer removes the executable bit on resolved files when using
2064
an external merge tool.
2065
2066
### Contributors
2067
2068
Thanks to the people who made this release happen!
2069
2070
* Alex Stefanov (@umnikos)
2071
* Anton Älgmyr (@algmyr)
2072
* Austin Seipp (@thoughtpolice)
2073
* Benjamin Tan (@bnjmnt4n)
2074
* Bryce Berger (@bryceberger)
2075
* Daniel Ploch (@torquestomp)
2076
* David Crespo (@david-crespo)
2077
* George Tsiamasiotis (@gtsiam)
2078
* Jochen Kupperschmidt (@homeworkprod)
2079
* Keane Nguyen (@keanemind)
2080
* Martin von Zweigbergk (@martinvonz)
2081
* Matt Kulukundis (@fowles)
2082
* Milo Moisson (@mrnossiom)
2083
* petricavalry (@petricavalry)
2084
* Philip Metzger (@PhilipMetzger)
2085
* Remo Senekowitsch (@senekor)
2086
* Scott Taylor (@scott2000)
2087
* Shane Sveller (@shanesveller)
2088
* Stephen Jennings (@jennings)
2089
* Tim Janik (@tim-janik)
2090
* Vamsi Avula (@avamsi)
2091
* Waleed Khan (@arxanas)
2092
* Yuya Nishihara (@yuja)
2093
2094
## [0.24.0] - 2024-12-04
2095
2096
### Release highlights
2097
2098
* New [`jj absorb`](https://jj-vcs.github.io/jj/latest/cli-reference/#jj-absorb) command automatically squashes changes from the current commit into relevant ancestor commits.
2099
2100
* Experimental dynamic shell completions have been added; see [the docs](https://jj-vcs.github.io/jj/latest/install-and-setup/#command-line-completion) for configuration.
2101
2102
* [`jj duplicate`](https://jj-vcs.github.io/jj/latest/cli-reference/#jj-duplicate) now accepts `--destination`/`--insert-before`/`--insert-after`.
2103
2104
* Some deprecated commands have been removed (`jj move`, `jj checkout`, `jj merge`).
2105
2106
### Breaking changes
2107
2108
* `jj move` has been removed. It was deprecated in 0.16.0.
2109
2110
* `jj checkout` and the built-in alias `jj co` have been removed.
2111
It was deprecated in 0.14.0.
2112
2113
* `jj merge` has been removed. It was deprecated in 0.14.0.
2114
2115
* `jj git push` no longer pushes new bookmarks by default. Use `--allow-new` to
2116
bypass this restriction.
2117
2118
* Lines prefixed with "JJ:" in commit descriptions and in sparse patterns (from
2119
`jj sparse edit`) are now stripped even if they are not immediately followed
2120
by a space. [#5004](https://github.com/jj-vcs/jj/issues/5004)
2121
2122
### Deprecations
2123
2124
### New features
2125
2126
* Templates now support the `==` and `!=` logical operators for `Boolean`,
2127
`Integer`, and `String` types.
2128
2129
* New command `jj absorb` that moves changes to stack of mutable revisions.
2130
2131
* New command `jj util exec` that can be used for arbitrary aliases.
2132
2133
* `jj rebase -b` can now be used with the `--insert-after` and `--insert-before`
2134
options, like `jj rebase -r` and `jj rebase -s`.
2135
2136
* A preview of improved shell completions was added. Please refer to the
2137
[documentation](https://jj-vcs.github.io/jj/latest/install-and-setup/#command-line-completion)
2138
to activate them. They additionally complete context-dependent, dynamic values
2139
like bookmarks, aliases, revisions, operations and files.
2140
2141
* Added the config setting `snapshot.auto-update-stale` for automatically
2142
running `jj workspace update-stale` when applicable.
2143
2144
* `jj duplicate` now accepts `--destination`, `--insert-after` and
2145
`--insert-before` options to customize the location of the duplicated
2146
revisions.
2147
2148
* `jj log` now displays the working-copy branch first.
2149
2150
* New `fork_point()` revset function can be used to obtain the fork point
2151
of multiple commits.
2152
2153
* The `tags()` revset function now takes an optional `pattern` argument,
2154
mirroring that of `bookmarks()`.
2155
2156
* Several commands now support `-f/-t` shorthands for `--from/--to`:
2157
- `diff`
2158
- `diffedit`
2159
- `interdiff`
2160
- `op diff`
2161
- `restore`
2162
2163
* New `ui.conflict-marker-style` config option to change how conflicts are
2164
materialized in the working copy. The default option ("diff") renders
2165
conflicts as a snapshot with a list of diffs to apply to the snapshot.
2166
The new "snapshot" option renders conflicts as a series of snapshots, showing
2167
each side and base of the conflict. The new "git" option replicates Git's
2168
"diff3" conflict style, meaning it is more likely to work with external tools,
2169
but it doesn't support conflicts with more than 2 sides.
2170
2171
* New `merge-tools.<TOOL>.conflict-marker-style` config option to override the
2172
conflict marker style used for a specific merge tool.
2173
2174
* New `merge-tools.<TOOL>.merge-conflict-exit-codes` config option to allow a
2175
merge tool to exit with a non-zero code to indicate that not all conflicts
2176
were resolved.
2177
2178
* `jj simplify-parents` now supports configuring the default revset when no
2179
`--source` or `--revisions` arguments are provided with the
2180
`revsets.simplify-parents` config.
2181
2182
### Fixed bugs
2183
2184
* `jj config unset <TABLE-NAME>` no longer removes a table (such as `[ui]`.)
2185
2186
### Contributors
2187
2188
Thanks to the people who made this release happen!
2189
2190
* Austin Seipp (@thoughtpolice)
2191
* Benjamin Tan (@bnjmnt4n)
2192
* Daniel Ploch (@torquestomp)
2193
* Emily (@neongreen)
2194
* Essien Ita Essien (@essiene)
2195
* Herman J. Radtke III (@hjr3)
2196
* Ilya Grigoriev (@ilyagr)
2197
* Joaquín Triñanes (@JoaquinTrinanes)
2198
* Lars Francke (@lfrancke)
2199
* Luke Randall (@lukerandall)
2200
* Martin von Zweigbergk (@martinvonz)
2201
* Nathanael Huffman (@nathanaelhuffman)
2202
* Philip Metzger (@PhilipMetzger)
2203
* Remo Senekowitsch (@senekor)
2204
* Robin Stocker (@robinst)
2205
* Scott Taylor (@scott2000)
2206
* Shane Sveller (@shanesveller)
2207
* Tim Janik (@tim-janik)
2208
* Yuya Nishihara (@yuja)
2209
2210
## [0.23.0] - 2024-11-06
2211
2212
### Security fixes
2213
2214
* Fixed path traversal by cloning/checking out crafted Git repository containing
2215
`..`, `.jj`, `.git` paths.
2216
([GHSA-88h5-6w7m-5w56](https://github.com/jj-vcs/jj/security/advisories/GHSA-88h5-6w7m-5w56);CVE-2024-51990)
2217
2218
### Breaking changes
2219
2220
* Revset function names can no longer start with a number.
2221
2222
* Evaluation error of `revsets.short-prefixes` configuration is now reported.
2223
2224
* The `HEAD@git` symbol no longer resolves to the Git HEAD revision. Use
2225
`git_head()` or `@-` revset expression instead. The `git_head` template
2226
keyword now returns a boolean.
2227
2228
* Help command doesn't work recursively anymore, i.e. `jj workspace help root`
2229
doesn't work anymore.
2230
2231
* The color label `op_log` from the `[colors]` config section now **only**
2232
applies to the op log and not to the other places operations are displayed. In
2233
almost all cases, if you configured `op_log` before, you should use the new
2234
`operation` label instead.
2235
2236
* Default operation log template now shows end times of operations instead of
2237
start times.
2238
2239
### Deprecations
2240
2241
* `git.auto-local-bookmark` replaces `git.auto-local-branch`. The latter remains
2242
supported for now (at lower precedence than the former).
2243
2244
### New features
2245
2246
* Added diff options to ignore whitespace when comparing lines. Whitespace
2247
changes are still highlighted.
2248
2249
* New command `jj simplify-parents` will remove redundant parent edges.
2250
2251
* `jj squash` now supports `-f/-t` shorthands for `--from/--[in]to`.
2252
2253
* Initial support for shallow Git repositories has been implemented. However,
2254
deepening the history of a shallow repository is not yet supported.
2255
2256
* `jj git clone` now accepts a `--depth <DEPTH>` option, which
2257
allows to clone the repository with a given depth.
2258
2259
* New command `jj file annotate` that annotates files line by line. This is similar
2260
in functionality to `git blame`. Invoke the command with `jj file annotate <file_path>`.
2261
The output can be customized via the `templates.annotate_commit_summary`
2262
config variable.
2263
2264
* `jj bookmark list` gained a `--remote REMOTE` option to display bookmarks
2265
belonging to a remote. This option can be combined with `--tracked` or
2266
`--conflicted`.
2267
2268
* New command `jj config unset` that unsets config values. For example,
2269
`jj config unset --user user.name`.
2270
2271
* `jj help` now has the flag `--keyword` (shorthand `-k`), which can give help
2272
for some keywords (e.g. `jj help -k revsets`). To see a list of the available
2273
keywords you can do `jj help --help`.
2274
2275
* New `at_operation(op, expr)` revset can be used in order to query revisions
2276
based on historical state.
2277
2278
* String literals in filesets, revsets and templates now support hex bytes
2279
(with `\e` as escape / shorthand for `\x1b`).
2280
2281
* New `coalesce(revsets...)` revset which returns commits in the first revset
2282
in the `revsets` list that does not evaluate to `none()`.
2283
2284
* New template function `raw_escape_sequence(...)` preserves escape sequences.
2285
2286
* Timestamp objects in templates now have `after(date) -> Boolean` and
2287
`before(date) -> Boolean` methods for comparing timestamps to other dates.
2288
2289
* New template functions `pad_start()`, `pad_end()`, `truncate_start()`, and
2290
`truncate_end()` are added.
2291
2292
* Add a new template alias `builtin_log_compact_full_description()`.
2293
2294
* Added the config settings `diff.color-words.context` and `diff.git.context` to
2295
control the default number of lines of context shown.
2296
2297
### Fixed bugs
2298
2299
* Error on `trunk()` revset resolution is now handled gracefully.
2300
[#4616](https://github.com/jj-vcs/jj/issues/4616)
2301
2302
* Updated the built-in diff editor `scm-record` to version
2303
[0.4.0](https://github.com/arxanas/scm-record/releases/tag/v0.4.0), which
2304
includes multiple fixes.
2305
2306
### Contributors
2307
2308
Thanks to the people who made this release happen!
2309
2310
* Alec Snyder (@allonsy)
2311
* Arthur Grillo (Grillo-0)
2312
* Austin Seipp (@thoughtpolice)
2313
* Benjamin Tan (@bnjmnt4n)
2314
* Dave Townsend (@Mossop)
2315
* Daniel Ploch (@torquestomp)
2316
* Emily (@neongreen)
2317
* Essien Ita Essien (@essiene)
2318
* Fedor Sheremetyev (@sheremetyev)
2319
* Ilya Grigoriev (@ilyagr)
2320
* Jakub Okoński (@farnoy)
2321
* Jcparkyn (@Jcparkyn)
2322
* Joaquín Triñanes (@JoaquinTrinanes)
2323
* Lukas Wirth (@Veykril)
2324
* Marco Neumann (@crepererum)
2325
* Martin von Zweigbergk (@martinvonz)
2326
* Matt Stark (@matts1)
2327
* Philip Metzger (@PhilipMetzger)
2328
* Philipp Albrecht (@pylbrecht)
2329
* Remo Senekowitsch (@senekor)
2330
* Richard Macklin (@rmacklin)
2331
* Robin Stocker (@robinst)
2332
* Samuel Tardieu (@samueltardieu)
2333
* Sora (@SoraTenshi)
2334
* Stephen Jennings (@jennings)
2335
* Theodore Ehrenborg (@TheodoreEhrenborg)
2336
* Vamsi Avula (@avamsi)
2337
* Vincent Ging Ho Yim (@cenviity)
2338
* Yuya Nishihara (@yuja)
2339
2340
## [0.22.0] - 2024-10-02
2341
2342
### Breaking changes
2343
2344
* Fixing [#4239](https://github.com/jj-vcs/jj/issues/4239) means the
2345
ordering of some messages have changed.
2346
2347
* Invalid `ui.graph.style` configuration is now an error.
2348
2349
* The builtin template `branch_list` has been renamed to `bookmark_list` as part
2350
of the `jj branch` deprecation.
2351
2352
### Deprecations
2353
2354
* `jj branch` has been deprecated in favor of `jj bookmark`.
2355
2356
**Rationale:** Jujutsu's branches don't behave like Git branches, which a
2357
confused many newcomers, as they expected a similar behavior given the name.
2358
We've renamed them to "bookmarks" to match the actual behavior, as we think
2359
that describes them better, and they also behave similar to Mercurial's
2360
bookmarks.
2361
2362
* `jj obslog` is now called `jj evolution-log`/`jj evolog`. `jj obslog` remains
2363
as an alias.
2364
2365
* `jj unsquash` has been deprecated in favor of `jj squash` and
2366
`jj diffedit --restore-descendants`.
2367
2368
**Rationale:** `jj squash` can be used in interactive mode to pull
2369
changes from one commit to another, including from a parent commit
2370
to a child commit. For fine-grained dependent diffs, such as when
2371
the parent and the child commits must successively modify the same
2372
location in a file, `jj diffedit --restore-descendants` can be used
2373
to set the parent commit to the desired content without altering the
2374
content of the child commit.
2375
2376
* The `git.push-branch-prefix` config has been deprecated in favor of
2377
`git.push-bookmark-prefix`.
2378
2379
* `conflict()` and `file()` revsets have been renamed to `conflicts()` and `files()`
2380
respectively. The old names are still around and will be removed in a future
2381
release.
2382
2383
### New features
2384
2385
* The new config option `snapshot.auto-track` lets you automatically track only
2386
the specified paths (all paths by default). Use the new `jj file track`
2387
command to manually tracks path that were not automatically tracked. There is
2388
no way to list untracked files yet. Use `git status` in a colocated workspace
2389
as a workaround.
2390
[#323](https://github.com/jj-vcs/jj/issues/323)
2391
2392
* `jj fix` now allows fixing unchanged files with the `--include-unchanged-files` flag. This
2393
can be used to more easily introduce automatic formatting changes in a new
2394
commit separate from other changes.
2395
2396
* `jj workspace add` now accepts a `--sparse-patterns=<MODE>` option, which
2397
allows control of the sparse patterns for a newly created workspace: `copy`
2398
(inherit from parent; default), `full` (full working copy), or `empty` (the
2399
empty working copy).
2400
2401
* New command `jj workspace rename` that can rename the current workspace.
2402
2403
* `jj op log` gained an option to include operation diffs.
2404
2405
* `jj git clone` now accepts a `--remote <REMOTE NAME>` option, which
2406
allows to set a name for the remote instead of using the default
2407
`origin`.
2408
2409
* `jj op undo` now reports information on the operation that has been undone.
2410
2411
* `jj squash`: the `-k` flag can be used as a shorthand for `--keep-emptied`.
2412
2413
* CommitId / ChangeId template types now support `.normal_hex()`.
2414
2415
* `jj commit` and `jj describe` now accept `--author` option allowing to quickly change
2416
author of given commit.
2417
2418
* `jj diffedit`, `jj abandon`, and `jj restore` now accept a `--restore-descendants`
2419
flag. When used, descendants of the edited or deleted commits will keep their original
2420
content.
2421
2422
* `jj git fetch -b <remote-git-branch-name>` will now warn if the branch(es)
2423
can not be found in any of the specified/configured remotes.
2424
2425
* `jj split` now lets the user select all changes in interactive mode. This may be used
2426
to keeping all changes into the first commit while keeping the current commit
2427
description for the second commit (the newly created empty one).
2428
2429
* Author and committer names are now yellow by default.
2430
2431
### Fixed bugs
2432
2433
* Update working copy before reporting changes. This prevents errors during reporting
2434
from leaving the working copy in a stale state.
2435
2436
* Fixed panic when parsing invalid conflict markers of a particular form.
2437
([#2611](https://github.com/jj-vcs/jj/pull/2611))
2438
2439
* Editing a hidden commit now makes it visible.
2440
2441
* The `present()` revset now suppresses missing working copy error. For example,
2442
`present(@)` evaluates to `none()` if the current workspace has no
2443
working-copy commit.
2444
2445
### Contributors
2446
2447
Thanks to the people who made this release happen!
2448
2449
* Austin Seipp (@thoughtpolice)
2450
* Danny Hooper (@hooper)
2451
* Emily Shaffer (@nasamuffin)
2452
* Essien Ita Essien (@essiene)
2453
* Ethan Brierley (@eopb)
2454
* Ilya Grigoriev (@ilyagr)
2455
* Kevin Liao (@kevincliao)
2456
* Lukas Wirth (@Veykril)
2457
* Martin von Zweigbergk (@martinvonz)
2458
* Mateusz Mikuła (@mati865)
2459
* mlcui (@mlcui-corp)
2460
* Philip Metzger (@PhilipMetzger)
2461
* Samuel Tardieu (@samueltardieu)
2462
* Stephen Jennings (@jennings)
2463
* Tyler Goffinet (@qubitz)
2464
* Vamsi Avula (@avamsi)
2465
* Yuya Nishihara (@yuja)
2466
2467
## [0.21.0] - 2024-09-04
2468
2469
### Breaking changes
2470
2471
* `next/prev` will no longer infer when to go into edit mode when moving from
2472
commit to commit. It now either follows the flags `--edit|--no-edit` or it
2473
gets the mode from `ui.movement.edit`.
2474
2475
### Deprecations
2476
2477
* `jj untrack` has been renamed to `jj file untrack`.
2478
2479
### New features
2480
2481
* Add new boolean config knob, `ui.movement.edit` for controlling the behavior
2482
of `prev/next`. The flag turns `edit` mode `on` and `off` permanently when set
2483
respectively to `true` or `false`.
2484
2485
* All diff formats except `--name-only` now include information about copies and
2486
moves. So do external diff tools in file-by-file mode. `jj status` also
2487
includes information about copies and moves.
2488
2489
* Color-words diff has gained [an option to display complex changes as separate
2490
lines](docs/config.md#color-words-diff-options). It's enabled by default. To
2491
restore the old behavior, set `diff.color-words.max-inline-alternation = -1`.
2492
2493
* A tilde (`~`) at the start of the path will now be expanded to the user's home
2494
directory when configuring a `signing.key` for SSH commit signing.
2495
2496
* When reconfiguring the author, warn that the working copy won't be updated
2497
2498
* `jj rebase -s` can now be used with the `--insert-after` and `--insert-before`
2499
options, like `jj rebase -r`.
2500
2501
### Fixed bugs
2502
2503
* Release binaries for Intel Macs have been restored. They were previously
2504
broken due to using a sunset version of GitHub's macOS runners (but nobody had
2505
previously complained.)
2506
2507
### Contributors
2508
2509
Thanks to the people who made this release happen!
2510
2511
* Aaron Bull Schaefer (@elasticdog)
2512
* Austin Seipp (@thoughtpolice)
2513
* Benjamin Tan (@bnjmnt4n)
2514
* Raniz Daniel Raneland (@Raniz85)
2515
* Daniel Ploch (@torquestomp)
2516
* Essien Ita Essien (@essiene)
2517
* Ilya Grigoriev (@ilyagr)
2518
* Kaleb Pace (@kalebpace)
2519
* Marie (@NyCodeGHG)
2520
* Marijan Smetko (@InCogNiTo124)
2521
* Martin von Zweigbergk (@martinvonz)
2522
* Matt Kulukundis (@fowles)
2523
* Scott Taylor (@scott2000)
2524
* Stephen Jennings (@jennings)
2525
* tingerrr (@tingerrr)
2526
* Yuya Nishihara (@yuja)
2527
2528
## [0.20.0] - 2024-08-07
2529
2530
### Note to packagers
2531
2532
* `jj` now links `libgit2` statically by default. To use dynamic linking, you
2533
need to set the environment variable `LIBGIT2_NO_VENDOR=1` while compiling.
2534
([#4163](https://github.com/jj-vcs/jj/pull/4163))
2535
2536
### Breaking changes
2537
2538
* `jj rebase --skip-empty` has been renamed to `jj rebase --skip-emptied`
2539
2540
* `jj backout --revision` has been renamed to `jj backout --revisions`.
2541
The short alias `-r` is still supported.
2542
2543
* [The default `immutable_heads()` set](docs/config.md#set-of-immutable-commits)
2544
now includes `untracked_remote_branches()` with the assumption that untracked
2545
branches aren't managed by you. Therefore, untracked branches are no longer
2546
displayed in `jj log` by default.
2547
2548
* Updated defaults for graph node symbol templates `templates.log_node` and
2549
`templates.op_log_node`.
2550
2551
* [The "fileset" language](docs/filesets.md) is now enabled by default. It can
2552
still be disabled by setting `ui.allow-filesets=false`.
2553
2554
* On `jj git fetch`/`import`, commits referred to by `HEAD@git` are no longer
2555
preserved. If a checked-out named branch gets deleted locally or remotely, the
2556
corresponding commits will be abandoned.
2557
2558
* `jj --at-op=@` no longer merges concurrent operations if explicitly specified.
2559
2560
* `jj obslog -p` no longer shows diffs at non-partial squash operations.
2561
Previously, it showed the same diffs as the second predecessor.
2562
2563
### Deprecations
2564
2565
* The original configuration syntax for `jj fix` is now deprecated in favor of
2566
one that allows defining multiple tools that can affect different filesets.
2567
These can be used in combination for now. See `jj help fix` for details.
2568
2569
### New features
2570
2571
* Define `immutable_heads()` revset alias in terms of a new `builtin_immutable_heads()`.
2572
This enables users to redefine `immutable_heads()` as they wish, but still
2573
have `builtin_immutable_heads()` which should not be redefined.
2574
2575
* External diff tools can now be configured to invoke the tool on each file
2576
individually instead of being passed a directory by setting
2577
`merge-tools.$TOOL.diff-invocation-mode="file-by-file"` in config.toml.
2578
2579
* In git diffs, word-level hunks are now highlighted with underline. See [diff
2580
colors and styles](docs/config.md#diff-colors-and-styles) for customization.
2581
2582
* New `.diff().<format>()` commit template methods are added. They can be used
2583
in order to show diffs conditionally. For example,
2584
`if(current_working_copy, diff.summary())`.
2585
2586
* `jj git clone` and `jj git init` with an existing git repository adds the
2587
default branch of the remote as repository settings for
2588
`revset-aliases."trunk()"`.`
2589
2590
* `jj workspace forget` now abandons the workspace's working-copy commit if it
2591
was empty.
2592
2593
* `jj backout` now includes the backed out commit's subject in the new commit
2594
message.
2595
2596
* `jj backout` can now back out multiple commits at once.
2597
2598
* `jj git clone some/nested/path` now creates the full directory tree for
2599
nested destination paths if they don't exist.
2600
2601
* String patterns now support case‐insensitive matching by suffixing any
2602
pattern kind with `-i`. `mine()` uses case‐insensitive matching on your email
2603
address unconditionally. Only ASCII case folding is currently implemented,
2604
but this will likely change in the future.
2605
2606
* String patterns now support `regex:"pattern"`.
2607
2608
* New `tracked_remote_branches()` and `untracked_remote_branches()` revset
2609
functions can be used to select tracked/untracked remote branches.
2610
2611
* The `file()` revset function now accepts fileset as argument.
2612
2613
* New `diff_contains()` revset function can be used to search diffs.
2614
2615
* New command `jj operation diff` that can compare changes made between two
2616
operations.
2617
2618
* New command `jj operation show` that can show the changes made in a single
2619
operation.
2620
2621
* New config setting `git.private-commits` to prevent commits from being pushed.
2622
2623
* [The default commit description template](docs/config.md#default-description)
2624
can now be configured by `templates.draft_commit_description`.
2625
2626
* `jj fix` can now be configured to run different tools on different filesets.
2627
This simplifies the use case of configuring code formatters for specific file
2628
types. See `jj help fix` for details.
2629
2630
* Added revset functions `author_date` and `committer_date`.
2631
2632
* `jj describe` can now update the description of multiple commits.
2633
2634
### Fixed bugs
2635
2636
* `jj status` will show different messages in a conflicted tree, depending
2637
on the state of the working commit. In particular, if a child commit fixes
2638
a conflict in the parent, this will be reflected in the hint provided
2639
by `jj status`
2640
2641
* `jj diff --git` no longer shows the contents of binary files.
2642
2643
* Windows binaries no longer require `vcruntime140.dll` to be installed
2644
(normally through Visual Studio.)
2645
2646
* On quit, the builtin pager no longer waits for all outputs to be discarded.
2647
2648
* `jj branch rename` no longer shows a warning in colocated repos.
2649
2650
### Contributors
2651
2652
Thanks to the people who made this release happen!
2653
2654
* Anton Älgmyr (@algmyr)
2655
* Austin Seipp (@thoughtpolice)
2656
* Benjamin Tan (@bnjmnt4n)
2657
* Daniel Ploch (@torquestomp)
2658
* Danny Hooper (@hooper)
2659
* Emily (@emilazy)
2660
* Essien Ita Essien (@essiene)
2661
* Fedor Sheremetyev (@sheremetyev)
2662
* Ilya Grigoriev (@ilyagr)
2663
* Jonathan Tan (@jonathantanmy)
2664
* Julien Vincent (@julienvincent)
2665
* Martin von Zweigbergk (@martinvonz)
2666
* Matt Kulukundis (@fowles)
2667
* Matt Stark (@matts1)
2668
* mlcui (@mlcui-corp)
2669
* Philip Metzger (@PhilipMetzger)
2670
* Scott Taylor (@scott2000)
2671
* Skyler Grey (@Minion3665)
2672
* Stephen Jennings (@jennings)
2673
* Tim Janik (@tim-janik)
2674
* Vincent Ging Ho Yim (@cenviity)
2675
* Vladimír Čunát (@vcunat)
2676
* Vladimir (@0xdeafbeef)
2677
* Yuya Nishihara (@yuja)
2678
2679
## [0.19.0] - 2024-07-03
2680
2681
### Breaking changes
2682
2683
* In revset aliases, top-level `kind:pattern` expression is now parsed as
2684
modifier. Surround with parentheses if it should be parsed as string/file
2685
pattern.
2686
2687
* Dropped support for automatic upgrade of repo formats used by versions before
2688
0.12.0.
2689
2690
* `jj fix` now defaults to the broader revset `-s reachable(@, mutable())`
2691
instead of `-s @`.
2692
2693
* Dropped support for deprecated `jj branch delete`/`forget` `--glob` option.
2694
2695
* `jj branch set` now creates new branch if it doesn't exist. Use `jj branch
2696
move` to ensure that the target branch already exists.
2697
[#3584](https://github.com/jj-vcs/jj/issues/3584)
2698
2699
### Deprecations
2700
2701
* Replacing `-l` shorthand for `--limit` with `-n` in `jj log`, `jj op log`
2702
and `jj obslog`.
2703
2704
* `jj split --siblings` is deprecated in favor of `jj split --parallel` (to
2705
match `jj parallelize`).
2706
2707
* A new `jj file` subcommand now replaces several existing uncategorized
2708
commands, which are deprecated.
2709
- `jj file show` replaces `jj cat`.
2710
- `jj file chmod` replaces `jj chmod`.
2711
- `jj file list` replaces `jj files`.
2712
2713
### New features
2714
2715
* Support background filesystem monitoring via watchman triggers enabled with
2716
the `core.watchman.register_snapshot_trigger = true` config.
2717
2718
* Show paths to config files when configuration errors occur.
2719
2720
* `jj fix` now supports configuring the default revset for `-s` using the
2721
`revsets.fix` config.
2722
2723
* The `descendants()` revset function now accepts an optional `depth` argument;
2724
like the `ancestors()` depth argument, it limits the depth of the set.
2725
2726
* Revset/template aliases now support function overloading.
2727
[#2966](https://github.com/jj-vcs/jj/issues/2966)
2728
2729
* Conflicted files are individually simplified before being materialized.
2730
2731
* The `jj file` subcommand now contains several existing file utilities.
2732
- `jj file show`, replacing `jj cat`.
2733
- `jj file chmod` replacing `jj chmod`.
2734
- `jj file list` replacing `jj files`.
2735
2736
* New command `jj branch move` let you update branches by name pattern or source
2737
revision.
2738
2739
* New diff option `jj diff --name-only` allows for easier shell scripting.
2740
2741
* In color-words diffs, hunks are now highlighted with underline. See [diff
2742
colors and styles](docs/config.md#diff-colors-and-styles) for customization.
2743
2744
* `jj git push -c <arg>` can now accept revsets that resolve to multiple
2745
revisions. This means that `jj git push -c xyz -c abc` is now equivalent to
2746
`jj git push -c 'all:(xyz | abc)'`.
2747
2748
* `jj prev` and `jj next` have gained a `--conflict` flag which moves you
2749
to the next conflict in a child commit.
2750
2751
* New command `jj git remote set-url` that sets the url of a git remote.
2752
2753
* Author timestamp is now reset when rewriting discardable commits (empty
2754
commits with no description) if authored by the current user.
2755
[#2000](https://github.com/jj-vcs/jj/issues/2000)
2756
2757
* `jj commit` now accepts `--reset-author` option to match `jj describe`.
2758
2759
* `jj squash` now accepts a `--keep-emptied` option to keep the source commit.
2760
2761
### Fixed bugs
2762
2763
* `jj git push` now ignores immutable commits when checking whether a
2764
to-be-pushed commit has conflicts, or has no description / committer / author
2765
set. [#3029](https://github.com/jj-vcs/jj/issues/3029)
2766
2767
* `jj` will look for divergent changes outside the short prefix set even if it
2768
finds the change id inside the short prefix set.
2769
[#2476](https://github.com/jj-vcs/jj/issues/2476)
2770
2771
### Contributors
2772
2773
Thanks to the people who made this release happen!
2774
2775
* Austin Seipp (@thoughtpolice)
2776
* Benjamin Tan (@bnjmnt4n)
2777
* Daniel Ploch (@torquestomp)
2778
* Danny Hooper (@hooper)
2779
* Ilya Grigoriev (@ilyagr)
2780
* James Sully (@sullyj3)
2781
* Jonathan Tan (@jonathantanmy)
2782
* Kyle J Strand (@BatmanAoD)
2783
* Manuel Caldeira (@KiitoX)
2784
* Martin von Zweigbergk (@martinvonz)
2785
* Matt Kulukundis (@fowles)
2786
* Matt Stark (@matts1)
2787
* mlcui (@mlcui-corp)
2788
* Philip Metzger (@PhilipMetzger)
2789
* Scott Taylor (@scott2000)
2790
* Simon Wollwage (@Kintaro)
2791
* Tal Pressman (@tp-woven)
2792
* Yuya Nishihara (@yuja)
2793
2794
## [0.18.0] - 2024-06-05
2795
2796
### Breaking changes
2797
2798
* Dropped support for `ui.default-revset` config (replaced by `revsets.log` in
2799
0.8.0).
2800
2801
* The `commit_summary_no_branches` template is superseded by
2802
`templates.branch_list`.
2803
2804
* `jj split` will now refuse to split an empty commit.
2805
2806
* `jj config list` now uses multi-line strings and single-quoted strings in the
2807
output when appropriate.
2808
2809
* `jj config get`/`list`/`set` now parse `name` argument as [TOML
2810
key](https://toml.io/en/v1.0.0#keys). Quote meta characters as needed.
2811
Example: `jj config get "revset-aliases.'trunk()'"`
2812
2813
* When updating the working copy away from an empty and undescribed commit, it
2814
is now abandoned even if it is a merge commit.
2815
2816
* If a new working-copy commit is created because the old one was abandoned, and
2817
the old commit was merge, then the new commit will now also be.
2818
[#2859](https://github.com/jj-vcs/jj/issues/2859)
2819
2820
* `jj new`'s `--insert-before`/`--insert-after` options must now be set for each
2821
commit the new commit will be inserted before/after. Previously, those options
2822
were global flags and specifying them once would insert the new commit before/
2823
after all the specified commits.
2824
2825
### Deprecations
2826
2827
* Attempting to alias a built-in command now gives a warning, rather than being
2828
silently ignored.
2829
2830
### New features
2831
2832
* `jj branch list`/`tag list` now accept `-T`/`--template` option. The tag list
2833
prints commit summary along with the tag name by default.
2834
2835
* Conflict markers now include an explanation of what each part of the conflict
2836
represents.
2837
2838
* `ui.color = "debug"` prints active labels alongside the regular colored
2839
output.
2840
2841
* `jj branch track` now show conflicts if there are some.
2842
2843
* A new revset `reachable(srcs, domain)` will return all commits that are
2844
reachable from `srcs` within `domain`.
2845
2846
* There are now prebuilt binaries for `aarch64-linux-unknown-musl`.
2847
Note, these are cross compiled and currently untested.
2848
We plan on providing fully tested builds later once our CI system allows it.
2849
2850
* Added new revsets `mutable()` and `immutable()`.
2851
2852
* Upgraded `scm-record` from v0.2.0 to v0.3.0. See release notes at
2853
<https://github.com/arxanas/scm-record/releases/tag/v0.3.0>
2854
2855
* New command `jj fix` that can be configured to update commits by running code
2856
formatters (or similar tools) on changed files. The configuration schema and
2857
flags are minimal for now, with a number of improvements planned (for example,
2858
[#3800](https://github.com/jj-vcs/jj/issues/3800) and
2859
[#3801](https://github.com/jj-vcs/jj/issues/3801)).
2860
2861
* `jj new`'s `--insert-before` and `--insert-after` options can now be used
2862
simultaneously.
2863
2864
* `jj git push` now can push commits with empty descriptions with the
2865
`--allow-empty-description` flag
2866
2867
### Fixed bugs
2868
2869
* Previously, `jj git push` only made sure that the branch is in the expected
2870
location on the remote server when pushing a branch forward (as opposed to
2871
sideways or backwards). Now, `jj git push` makes a safety check in all cases
2872
and fails whenever `jj git fetch` would have introduced a conflict.
2873
2874
In other words, previously branches that moved sideways or backward were
2875
pushed similarly to Git's `git push --force`; now they have protections
2876
similar to `git push --force-with-lease` (though not identical to it, to match
2877
the behavior of `jj git fetch`). Note also that because of the way `jj git
2878
fetch` works, `jj` does not suffer from the same problems as Git's `git push
2879
--force-with-lease` in situations when `git fetch` is run in the background.
2880
2881
* When the working copy commit becomes immutable, a new one is automatically
2882
created
2883
on top of it to avoid letting the user edit the immutable one.
2884
2885
* `jj config list` now properly escapes TOML keys (#1322).
2886
2887
* Files with conflicts are now checked out as executable if all sides of the
2888
conflict are executable.
2889
2890
* The progress bar (visible when using e.g. `jj git clone`) clears the
2891
remainder of the cursor row after drawing rather than clearing the entire row
2892
before drawing, eliminating the "flicker" effect seen on some terminals.
2893
2894
### Contributors
2895
2896
Thanks to the people who made this release happen!
2897
2898
* Alexander Potashev (@aspotashev)
2899
* Austin Seipp (@thoughtpolice)
2900
* Benjamin Tan (@bnjmnt4n)
2901
* Charles Crete (@Cretezy)
2902
* Daniel Ploch (@torquestomp)
2903
* Danny Hooper (@hooper)
2904
* Eidolon (@HybridEidolon)
2905
* Glen Choo (@chooglen)
2906
* Gregory Anders (@gpanders)
2907
* Ilya Grigoriev (@ilyagr)
2908
* jyn (@jyn514)
2909
* Martin von Zweigbergk (@martinvonz)
2910
* Matt Stark (@matts1)
2911
* Matthew Davidson (@KingMob)
2912
* Michael Gattozzi (@mgattozzi)
2913
* mlcui (@mlcui-corp)
2914
* Philip Metzger (@PhilipMetzger)
2915
* Remo Senekowitsch (@senekor)
2916
* Thomas Castiglione (@gulbanana)
2917
* Théo Daron (@tdaron)
2918
* tinger (@tingerrr)
2919
* Waleed Khan (@arxanas)
2920
* Yuya Nishihara (@yuja)
2921
2922
## [0.17.1] - 2024-05-07
2923
2924
### Fixed bugs
2925
2926
* `jj status` no longer scans through the entire history to look for ancestors
2927
with conflicts.
2928
2929
## [0.17.0] - 2024-05-01
2930
2931
### Breaking changes
2932
2933
* The default template aliases were replaced as follows:
2934
* `builtin_op_log_root(op_id: OperationId)` ->
2935
`format_root_operation(root: Operation)`
2936
* `builtin_log_root(change_id: ChangeId, commit_id: CommitId)` ->
2937
`format_root_commit(root: Commit)`
2938
* `builtin_change_id_with_hidden_and_divergent_info` ->
2939
`format_short_change_id_with_hidden_and_divergent_info(commit: Commit)`
2940
2941
* The `--revision` option of `jj rebase` is renamed to `--revisions`. The short
2942
alias `-r` is still supported.
2943
2944
### New features
2945
2946
* The list of conflicted paths is printed whenever the working copy changes.
2947
This can be disabled with the `--quiet` option.
2948
2949
* Commit objects in templates now have a `mine() -> Boolean` method analog to
2950
the same function in revsets. It evaluates to true if the email of the commit
2951
author matches the current `user.email`.
2952
2953
* Commit objects in templates now have a `contained_in(revset: String) ->
2954
Boolean` method.
2955
2956
* Operation objects in templates now have a `snapshot() -> Boolean` method that
2957
evaluates to true if the operation was a snapshot created by a non-mutating
2958
command (e.g. `jj log`).
2959
2960
* Revsets and templates now support single-quoted raw string literals.
2961
2962
* A new config option `ui.always-allow-large-revsets` has been added to
2963
allow large revsets expressions in some commands, without the `all:` prefix.
2964
2965
* A new config option `ui.allow-filesets` has been added to enable ["fileset"
2966
expressions](docs/filesets.md). Note that filesets are currently experimental,
2967
but will be enabled by default in a future release.
2968
2969
* A new global flag `--ignore-immutable` lets you rewrite immutable commits.
2970
2971
* New command `jj parallelize` that rebases a set of revisions into siblings.
2972
2973
* `jj status` now supports filtering by paths. For example, `jj status .` will
2974
only list changed files that are descendants of the current directory.
2975
2976
* `jj prev` and `jj next` now work when the working copy revision is a merge.
2977
2978
* `jj squash` now accepts a `--use-destination-message/-u` option that uses the
2979
description of the destination for the new squashed revision and discards the
2980
descriptions of the source revisions.
2981
2982
* You can check whether Watchman fsmonitor is enabled or installed with the new
2983
`jj debug watchman status` command.
2984
2985
* `jj rebase` now accepts revsets resolving to multiple revisions with the
2986
`--revisions`/`-r` option.
2987
2988
* `jj rebase -r` now accepts `--insert-after` and `--insert-before` options to
2989
customize the location of the rebased revisions.
2990
2991
### Fixed bugs
2992
2993
* Revsets now support `\`-escapes in string literal.
2994
2995
* The builtin diff editor now allows empty files to be selected during
2996
`jj split`.
2997
2998
* Fixed a bug with `jj split` introduced in 0.16.0 that caused it to incorrectly
2999
rebase the children of the revision being split if they had other parents
3000
(i.e. if the child was a merge).
3001
3002
* The `snapshot.max-new-file-size` option can now handle raw integer literals,
3003
interpreted as a number of bytes, where previously it could only handle string
3004
literals. This means that `snapshot.max-new-file-size="1"` and
3005
`snapshot.max-new-file-size=1` are now equivalent.
3006
3007
* `jj squash <path>` is now a no-op if the path argument didn't match any paths
3008
(it used to create new commits with bumped timestamp).
3009
[#3334](https://github.com/jj-vcs/jj/issues/3334)
3010
3011
### Contributors
3012
3013
Thanks to the people who made this release happen!
3014
3015
* Anton Älgmyr (@algmyr)
3016
* Anton Bulakh (@necauqua)
3017
* Austin Seipp (@thoughtpolice)
3018
* Benjamin Tan (@bnjmnt4n)
3019
* Cretezy (@Cretezy)
3020
* Daniel Ploch (@torquestomp)
3021
* Evan Mesterhazy (@emesterhazy)
3022
* Ilya Grigoriev (@ilyagr)
3023
* Martin von Zweigbergk (@martinvonz)
3024
* Noah Mayr (@noahmayr)
3025
* Jeremy O'Brien (@neutralinsomniac)
3026
* Jonathan Lorimer (@JonathanLorimer)
3027
* Philip Metzger (@PhilipMetzger)
3028
* Poliorcetics (@poliorcetics)
3029
* Rowan Walsh (@rowan-walsh)
3030
* Scott Olson (@solson)
3031
* Théo Daron (@tdaron)
3032
* Yuya Nishihara (@yuja)
3033
3034
## [0.16.0] - 2024-04-03
3035
3036
### Deprecations
3037
3038
* `jj move` was deprecated in favor of `jj squash`.
3039
3040
### Breaking changes
3041
3042
* The `git_head` template keyword now returns an optional value instead of a
3043
list of 0 or 1 element.
3044
3045
* The `jj sparse set --edit`/`--reset` flags were split up into `jj sparse
3046
edit`/`reset` subcommands respectively.
3047
3048
* The `jj sparse` subcommands now parse and print patterns as workspace-relative
3049
paths.
3050
3051
* The `jj log` command no longer uses the default revset when a path is
3052
specified.
3053
3054
### New features
3055
3056
* Config now supports rgb hex colors (in the form `#rrggbb`) wherever existing
3057
color names are supported.
3058
3059
* `ui.default-command` now accepts multiple string arguments, for more complex
3060
default `jj` commands.
3061
3062
* Graph node symbols are now configurable via templates
3063
* `templates.log_node`
3064
* `templates.op_log_node`
3065
3066
* `jj log` now includes synthetic nodes in the graph where some revisions were
3067
elided.
3068
3069
* `jj squash` now accepts `--from` and `--into` (also aliased as `--to`) if `-r`
3070
is not specified. It can now be used for all use cases where `jj move` could
3071
previously be used. The `--from` argument accepts a revset that resolves to
3072
more than one revision.
3073
3074
* Commit templates now support `immutable` keyword.
3075
3076
* New template function `coalesce(content, ..)` is added.
3077
3078
* Timestamps are now shown in local timezone and without milliseconds and
3079
timezone offset by default.
3080
3081
* `jj git push` now prints messages from the remote.
3082
3083
* `jj branch list` now supports a `--conflicted/-c` option to show only
3084
conflicted branches.
3085
3086
* `jj duplicate` and `jj abandon` can now take more than a single `-r` argument,
3087
for consistency with other commands.
3088
3089
* `jj branch list` now allows combining `-r REVISIONS`/`NAMES` and `-a` options.
3090
3091
* `--all` is now named `--all-remotes` for `jj branch list`
3092
3093
* There is a new global `--quiet` flag to silence commands' non-primary output.
3094
3095
* `jj split` now supports a `--siblings/-s` option that splits the target
3096
revision into siblings with the same parents and children.
3097
3098
* New function `working_copies()` for revsets to show the working copy commits
3099
of all workspaces.
3100
3101
### Fixed bugs
3102
3103
None.
3104
3105
### Contributors
3106
3107
Thanks to the people who made this release happen!
3108
3109
* Aleksey Kuznetsov (@zummenix)
3110
* Anton Älgmyr (@algmyr)
3111
* Austin Seipp (@thoughtpolice)
3112
* Benjamin Tan (@bnjmnt4n)
3113
* Chris Krycho (@chriskrycho)
3114
* Christoph Koehler (@ckoehler)
3115
* Daniel Ploch (@torquestomp)
3116
* Evan Mesterhazy (@emesterhazy)
3117
* Ilya Grigoriev (@ilyagr)
3118
* Khionu Sybiern (@khionu)
3119
* Martin von Zweigbergk (@martinvonz)
3120
* Matthew Davidson (@KingMob)
3121
* mrstanwell (@mrstanwell)
3122
* Noah Mayr (@noahmayr)
3123
* Patric Stout (@TrueBrain)
3124
* Poliorcetics (@poliorcetics)
3125
* Simon Wollwage (@Kintaro)
3126
* Steve Klabnik (@steveklabnik)
3127
* Tom Ward (@tomafro)
3128
* TrashCan (@TrashCan69420)
3129
* Yuya Nishihara (@yuja)
3130
3131
## [0.15.1] - 2024-03-06
3132
3133
No code changes (fixing Rust `Cargo.toml` stuff).
3134
3135
## [0.15.0] - 2024-03-06
3136
3137
### Breaking changes
3138
3139
* The minimum supported Rust version (MSRV) is now 1.76.0.
3140
3141
* The on-disk index format changed. New index files will be created
3142
automatically, but it can fail if the repository is colocated and predates
3143
Git GC issues [#815](https://github.com/jj-vcs/jj/issues/815). If
3144
reindexing failed, you'll need to clean up corrupted operation history by
3145
`jj op abandon ..<bad operation ID>`.
3146
3147
* Dropped support for the "legacy" graph-drawing style. Use "ascii" for a very
3148
similar result.
3149
3150
* The default log output no longer lists all tagged heads. Set `revsets.log =
3151
"@ | ancestors(immutable_heads().., 2) | heads(immutable_heads())"` to restore
3152
the old behavior.
3153
3154
* Dropped support for the deprecated `:` revset operator. Use `::` instead.
3155
3156
* `jj rebase --skip-empty` no longer abandons commits that were already empty
3157
before the rebase.
3158
3159
### New features
3160
3161
* Partial support for commit signing. Currently you can configure jj to "keep"
3162
commit signatures by making new ones for rewritten commits, and to sign new
3163
commits when they are created.
3164
3165
This comes with out-of-the-box support for the following backends:
3166
* GnuPG
3167
* SSH
3168
3169
Signature verification and an explicit sign command will hopefully come soon.
3170
3171
* Templates now support logical operators: `||`, `&&`, `!`
3172
3173
* Templates now support the `self` keyword, which is the current commit in `jj
3174
log`/`obslog` templates.
3175
3176
* `jj show` now accepts `-T`/`--template` option to render its output using
3177
template
3178
3179
* `jj config list` now accepts `-T`/`--template` option.
3180
3181
* `jj git fetch` now accepts `-b` as a shorthand for `--branch`, making it more
3182
consistent with other commands that accept a branch
3183
3184
* In the templating language, Timestamps now have a `.local()` method for
3185
converting to the local timezone.
3186
3187
* `jj next/prev` now infer `--edit` when you're already editing a non-head
3188
commit (a commit with children).
3189
3190
* A new built-in pager named `:builtin` is available on all platforms,
3191
implemented with [minus](https://github.com/arijit79/minus/)
3192
3193
* Set config `ui.log-synthetic-elided-nodes = true` to make `jj log` include
3194
synthetic nodes in the graph where some revisions were elided
3195
([#1252](https://github.com/jj-vcs/jj/issues/1252),
3196
[#2971](https://github.com/jj-vcs/jj/issues/2971)). This may become the
3197
default depending on feedback.
3198
3199
* When creating a new workspace, the sparse patterns are now copied over from
3200
the current workspace.
3201
3202
* `jj git init --colocate` can now import an existing Git repository. This is
3203
equivalent to `jj git init --git-repo=.`.
3204
3205
* `jj git fetch` now automatically prints new remote branches and tags by
3206
default.
3207
3208
* `--verbose/-v` is now `--debug` (no short option since it's not intended to be
3209
used often)
3210
3211
* `jj move --from/--to` can now be abbreviated to `jj move -f/-t`
3212
3213
* `jj commit`/`diffedit`/`move`/`resolve`/`split`/`squash`/`unsquash` now accept
3214
`--tool=<NAME>` option to override the default.
3215
[#2575](https://github.com/jj-vcs/jj/issues/2575)
3216
3217
* Added completions for [Nushell](https://nushell.sh) to `jj util completion`
3218
3219
* `jj branch list` now supports a `--tracked/-t` option which can be used to
3220
show tracked branches only. Omits local Git-tracking branches by default.
3221
3222
* Commands producing diffs now accept a `--context` flag for the number of
3223
lines of context to show.
3224
3225
* `jj` commands with the `-T`/`--template` option now provide a hint containing
3226
defined template names when no argument is given, assisting the user in making
3227
a selection.
3228
3229
### Fixed bugs
3230
3231
* On Windows, symlinks in the repo are now supported when Developer Mode is
3232
enabled.
3233
When symlink support is unavailable, they will be materialized as regular
3234
files in the
3235
working copy (instead of resulting in a crash).
3236
[#2](https://github.com/jj-vcs/jj/issues/2)
3237
3238
* On Windows, the `:builtin` pager is now used by default, rather than being
3239
disabled entirely.
3240
3241
* Auto-rebase now preserves the shape of history even for merge commits where
3242
one parent is an ancestor of another.
3243
[#2600](https://github.com/jj-vcs/jj/issues/2600)
3244
3245
### Contributors
3246
3247
Thanks to the people who made this release happen!
3248
3249
* Aleksey Kuznetsov (@zummenix)
3250
* Anton Bulakh (@necauqua)
3251
* Anton Älgmyr (@algmyr)
3252
* Austin Seipp (@thoughtpolice)
3253
* Benjamin Brittain (@benbrittain)
3254
* Benjamin Tan (@bnjmnt4n)
3255
* Daehyeok Mun (@daehyeok)
3256
* Daniel Ploch (@torquestomp)
3257
* Evan Mesterhazy (@emesterhazy)
3258
* gulbanana (@gulbanana)
3259
* Ilya Grigoriev (@ilyagr)
3260
* Jonathan Tan (@jonathantanmy)
3261
* Julien Vincent (@julienvincent)
3262
* jyn (@jyn514)
3263
* Martin von Zweigbergk (@martinvonz)
3264
* Paulo Coelho (@prscoelho)
3265
* Philip Metzger (@PhilipMetzger)
3266
* Poliorcetics (@poliorcetics)
3267
* Stephen Jennings (@jennings)
3268
* Vladimir (@0xdeafbeef)
3269
* Yuya Nishihara (@yuja)
3270
3271
## [0.14.0] - 2024-02-07
3272
3273
### Deprecations
3274
3275
* `jj checkout` and `jj merge` are both deprecated; use `jj new` instead to
3276
replace both of these commands in all instances.
3277
3278
**Rationale**: `jj checkout` and `jj merge` both implement identical
3279
functionality, which is a subset of `jj new`. `checkout` creates a new working
3280
copy commit on top of a single specified revision, i.e. with one parent.
3281
`merge` creates a new working copy commit on top of *at least* two specified
3282
revisions, i.e. with two or more parents.
3283
3284
The only difference between these commands and `jj new`, which *also* creates
3285
a new working copy commit, is that `new` can create a working copy commit on
3286
top of any arbitrary number of revisions, so it can handle both the previous
3287
cases at once. The only actual difference between these three commands is the
3288
command syntax and their name. These names were chosen to be familiar to users
3289
of other version control systems, but we instead encourage all users to adopt
3290
`jj new` instead; it is more general and easier to remember than both of
3291
these.
3292
3293
`jj checkout` and `jj merge` will no longer be shown as part of `jj help`, but
3294
will still function for now, emitting a warning about their deprecation.
3295
3296
**Deadline**: `jj checkout` and `jj merge` will be deleted and are expected
3297
become a **hard error later in 2024**.
3298
3299
* `jj init --git` and `jj init --git-repo` are now deprecated and will be
3300
removed
3301
in the near future.
3302
3303
Use `jj git init` instead.
3304
3305
### Breaking changes
3306
3307
* (Minor) Diff summaries (e.g. `jj diff -s`) now use `D` for "Deleted" instead
3308
of `R` for "Removed". @joyously pointed out that `R` could also mean
3309
"Renamed".
3310
3311
* `jj util completion` now takes the shell as a positional argument, not a flag.
3312
the previous behavior is deprecated, but supported for now. it will be removed
3313
in the future.
3314
3315
* `jj rebase` now preserves the shape of history even for merge commits where
3316
one parent is an ancestor of another. You can follow the `jj rebase` by
3317
`jj rebase -s <merge commit> -d <single parent>` if you want to linearize the
3318
history.
3319
3320
### New features
3321
3322
* `jj util completion` now supports powershell and elvish.
3323
3324
* Official binaries for macOS running on Apple Silicon (`aarch64-apple-darwin`)
3325
are now available, alongside the existing macOS x86 binaries.
3326
3327
* New `jj op abandon` command is added to clean up the operation history. Git
3328
refs and commit objects can be further compacted by `jj util gc`.
3329
3330
* `jj util gc` now removes unreachable operation, view, and Git objects.
3331
3332
* `jj branch rename` will now warn if the renamed branch has a remote branch,
3333
since
3334
those will have to be manually renamed outside of `jj`.
3335
3336
* `jj git push` gained a `--tracked` option, to push all the tracked branches.
3337
3338
* There's now a virtual root operation, similar to the [virtual root
3339
commit](docs/glossary.md#root-commit). It appears at the end of `jj op log`.
3340
3341
* `jj config list` gained a `--include-overridden` option to allow
3342
printing overridden config values.
3343
3344
* `jj config list` now accepts `--user` or `--repo` option to specify
3345
config origin.
3346
3347
* New `jj config path` command to print the config file path without launching
3348
an editor.
3349
3350
* `jj tag list` command prints imported git tags.
3351
3352
* `jj next` and `jj prev` now prompt in the event of the next/previous commit
3353
being ambiguous, instead of failing outright.
3354
3355
* `jj resolve` now displays the file being resolved.
3356
3357
* `jj workspace root` was aliased to `jj root`, for ease of discoverability
3358
3359
* `jj diff` no longer shows the contents of binary files.
3360
3361
* `jj git` now has an `init` command that initializes a git backed repo.
3362
3363
* New template function `surround(prefix, suffix, content)` is added.
3364
3365
### Fixed bugs
3366
3367
* Fixed snapshots of symlinks in `gitignore`-d directory.
3368
[#2878](https://github.com/jj-vcs/jj/issues/2878)
3369
3370
* Fixed data loss in dirty working copy when checked-out branch is rebased or
3371
abandoned by Git.
3372
[#2876](https://github.com/jj-vcs/jj/issues/2876)
3373
3374
### Contributors
3375
3376
Thanks to the people who made this release happen!
3377
3378
* Austin Seipp (@thoughtpolice)
3379
* Benjamin Brittain (@benbrittain)
3380
* Chris Krycho (@chriskrycho)
3381
* Daehyeok Mun (@daehyeok)
3382
* Daniel Ploch (@torquestomp)
3383
* Essien Ita Essien (@essiene)
3384
* Ikko Eltociear Ashimine (@eltociear)
3385
* Ilya Grigoriev (@ilyagr)
3386
* Jonathan Tan (@jonathantanmy)
3387
* jyn (@jyn514)
3388
* Martin von Zweigbergk (@martinvonz)
3389
* Matt Stark (@matts1)
3390
* Michael Pratt (prattmic)
3391
* Philip Metzger (@PhilipMetzger)
3392
* Stephen Jennings (@jennings)
3393
* Valentin Gatien-Baron (@v-gb)
3394
* vwkd (@vwkd)
3395
* Yuya Nishihara (@yuja)
3396
3397
## [0.13.0] - 2024-01-03
3398
3399
### Breaking changes
3400
3401
* `jj git fetch` no longer imports new remote branches as local branches. Set
3402
`git.auto-local-branch = true` to restore the old behavior.
3403
3404
### New features
3405
3406
* Information about new and resolved conflicts is now printed by every command.
3407
3408
* `jj branch` has gained a new `rename` subcommand that allows changing a branch
3409
name atomically. `jj branch help rename` for details.
3410
3411
### Fixed bugs
3412
3413
* Command aliases can now be loaded from repository config relative to the
3414
current working directory.
3415
[#2414](https://github.com/jj-vcs/jj/issues/2414)
3416
3417
### Contributors
3418
3419
Thanks to the people who made this release happen!
3420
3421
* Austin Seipp (@thoughtpolice)
3422
* Essien Ita Essien (@essiene)
3423
* Gabriel Scherer (@gasche)
3424
* Ilya Grigoriev (@ilyagr)
3425
* Martin von Zweigbergk (@martinvonz)
3426
* Philip Metzger (@PhilipMetzger)
3427
* Waleed Khan (@arxanas)
3428
* Yuya Nishihara (@yuja)
3429
3430
## [0.12.0] - 2023-12-05
3431
3432
### Breaking changes
3433
3434
* The `remote_branches()` revset no longer includes branches exported to the Git
3435
repository (so called Git-tracking branches.)
3436
3437
* `jj branch set` no longer creates a new branch. Use `jj branch create`
3438
instead.
3439
3440
* `jj init --git` in an existing Git repository now errors and exits rather than
3441
creating a second Git store.
3442
3443
### New features
3444
3445
* `jj workspace add` can now take _multiple_ `--revision` arguments, which will
3446
create a new workspace with its working-copy commit on top of all the parents,
3447
as if you had run `jj new r1 r2 r3 ...`.
3448
3449
* You can now set `git.abandon-unreachable-commits = false` to disable the
3450
usual behavior where commits that became unreachable in the Git repo are
3451
abandoned ([#2504](https://github.com/jj-vcs/jj/pull/2504)).
3452
3453
* `jj new` gained a `--no-edit` option to prevent editing the newly created
3454
commit. For example, `jj new a b --no-edit -m Merge` creates a merge commit
3455
without affecting the working copy.
3456
3457
* `jj rebase` now takes the flag `--skip-empty`, which doesn't copy over commits
3458
that would become empty after a rebase.
3459
3460
* There is a new `jj util gc` command for cleaning up the repository storage.
3461
For now, it simply runs `git gc` on the backing Git repo (when using the Git
3462
backend).
3463
3464
### Fixed bugs
3465
3466
* Fixed another file conflict resolution issue where `jj status` would disagree
3467
with the actual file content.
3468
[#2654](https://github.com/jj-vcs/jj/issues/2654)
3469
3470
### Contributors
3471
3472
Thanks to the people who made this release happen!
3473
3474
* Antoine Cezar (@AntoineCezar)
3475
* Anton Bulakh (@necauqua)
3476
* Austin Seipp (@thoughtpolice)
3477
* Benjamin Saunders (@Ralith)
3478
* Carlos Precioso (@cprecioso)
3479
* Chris Krycho (@chriskrycho)
3480
* Ilya Grigoriev (@ilyagr)
3481
* Jason R. Coombs (@jaraco)
3482
* Jesse Somerville (@jessesomerville)
3483
* Łukasz Kurowski (@crackcomm)
3484
* Martin von Zweigbergk (@martinvonz)
3485
* mlcui (@mlcui-corp)
3486
* Philip Metzger (@PhilipMetzger)
3487
* Waleed Khan (@arxanas)
3488
* Yuya Nishihara (@yuja)
3489
3490
## [0.11.0] - 2023-11-01
3491
3492
### Breaking changes
3493
3494
* Conflicts are now stored in a different way. Commits written by a new `jj`
3495
binary will not be read correctly by older `jj` binaries. The new model
3496
solves some performance problems with the old model. For example, `jj log`
3497
should be noticeably faster on large repos. You may need to create a new
3498
clone to see the full speedup.
3499
3500
* The `remote_branches()` revset now includes branches exported to the Git
3501
repository (so called Git-tracking branches.) *This change will be reverted
3502
in 0.12.0.*
3503
3504
* Status messages are now printed to stderr.
3505
3506
* `jj config set` now interprets the value as TOML also if it's a valid TOML
3507
array or table. For example, `jj config set --user 'aliases.n' '["new"]'`
3508
3509
* Remote branches now have tracking or non-tracking flags. The
3510
`git.auto-local-branch` setting is applied only to newly fetched remote
3511
branches. Existing remote branches are migrated as follows:
3512
3513
* If local branch exists, the corresponding remote branches are considered
3514
tracking branches.
3515
* Otherwise, the remote branches are non-tracking branches.
3516
3517
If the deduced tracking flags are wrong, use `jj branch track`/`untrack`
3518
commands to fix them up.
3519
3520
* Non-tracking remote branches aren't listed by default. Use `jj branch list
3521
--all` to show all local and remote branches.
3522
3523
* It's not allowed to push branches if non-tracking remote branches of the same
3524
name exist.
3525
3526
* Pushing deleted/moved branches no longer abandons the local commits referenced
3527
by the remote branches.
3528
3529
* `jj git fetch --branch` now requires `glob:` prefix to expand `*` in branch
3530
name.
3531
3532
### New features
3533
3534
* `jj`'s stable release can now be installed
3535
with [`cargo binstall jj-cli`](https://github.com/cargo-bins/cargo-binstall).
3536
3537
* `jj workspace add` now takes a `--revision` argument.
3538
3539
* `jj workspace forget` can now forget multiple workspaces at once.
3540
3541
* `branches()`/`remote_branches()`/`author()`/`committer()`/`description()`
3542
revsets now support glob matching.
3543
3544
* `jj branch delete`/`forget`/`list`, and `jj git push --branch` now support
3545
[string pattern syntax](docs/revsets.md#string-patterns). The `--glob` option
3546
is deprecated in favor of `glob:` pattern.
3547
3548
* The `branches`/`tags`/`git_refs`/`git_head` template keywords now return a
3549
list of `RefName`s. They were previously pre-formatted strings.
3550
3551
* The new template keywords `local_branches`/`remote_branches` are added to show
3552
only local/remote branches.
3553
3554
* `jj workspace add` now preserves all parents of the old working-copy commit
3555
instead of just the first one.
3556
3557
* `jj rebase -r` gained the ability to rebase a revision `A` onto a descendant
3558
of `A`.
3559
3560
### Fixed bugs
3561
3562
* Updating the working copy to a commit where a file that's currently ignored
3563
in the working copy no longer leads to a crash
3564
([#976](https://github.com/jj-vcs/jj/issues/976)).
3565
3566
* Conflicts in executable files can now be resolved just like conflicts in
3567
non-executable files ([#1279](https://github.com/jj-vcs/jj/issues/1279)).
3568
3569
* `jj new --insert-before` and `--insert-after` now respect immutable revisions
3570
([#2468](https://github.com/jj-vcs/jj/pull/2468)).
3571
3572
### Contributors
3573
3574
Thanks to the people who made this release happen!
3575
3576
* Antoine Cezar (@AntoineCezar)
3577
* Austin Seipp (@thoughtpolice)
3578
* Benjamin Saunders (@Ralith)
3579
* Gabriel Scherer (@gasche)
3580
* Ilya Grigoriev (@ilyagr)
3581
* Infra (@1011X)
3582
* Isabella Basso (@isinyaaa)
3583
* Martin von Zweigbergk (@martinvonz)
3584
* Tal Pressman (@talpr)
3585
* Waleed Khan (@arxanas)
3586
* Yuya Nishihara (@yuja)
3587
3588
## [0.10.0] - 2023-10-04
3589
3590
### Breaking changes
3591
3592
* A default revset-alias function `trunk()` now exists. If you previously
3593
defined
3594
your own `trunk()` alias it will continue to overwrite the built-in one.
3595
Check [revsets.toml](docs/revsets.toml)
3596
and [revsets.md](docs/revsets.md)
3597
to understand how the function can be adapted.
3598
3599
### New features
3600
3601
* The `ancestors()` revset function now takes an optional `depth` argument
3602
to limit the depth of the ancestor set. For example, use `jj log -r
3603
'ancestors(@, 5)` to view the last 5 commits.
3604
3605
* Support for the Watchman filesystem monitor is now bundled by default. Set
3606
`core.fsmonitor = "watchman"` in your repo to enable.
3607
3608
* You can now configure the set of immutable commits via
3609
`revset-aliases.immutable_heads()`. For example, set it to
3610
`"remote_branches() | tags()"` to prevent rewriting those those. Their
3611
ancestors are implicitly also immutable.
3612
3613
* `jj op log` now supports `--no-graph`.
3614
3615
* Templates now support an additional escape: `\0`. This will output a literal
3616
null byte. This may be useful for e.g.
3617
`jj log -T 'description ++ "\0"' --no-graph` to output descriptions only, but
3618
be able to tell where the boundaries are
3619
3620
* jj now bundles a TUI tool to use as the default diff and merge editors. (The
3621
previous default was `meld`.)
3622
3623
* `jj split` supports the `--interactive` flag. (This is already the default if
3624
no paths are provided.)
3625
3626
* `jj commit` accepts an optional list of paths indicating a subset of files to
3627
include in the first commit
3628
3629
* `jj commit` accepts the `--interactive` flag.
3630
3631
### Fixed bugs
3632
3633
### Contributors
3634
3635
Thanks to the people who made this release happen!
3636
3637
* Austin Seipp (@thoughtpolice)
3638
* Emily Kyle Fox (@emilykfox)
3639
* glencbz (@glencbz)
3640
* Hong Shin (@honglooker)
3641
* Ilya Grigoriev (@ilyagr)
3642
* James Sully (@sullyj3)
3643
* Martin von Zweigbergk (@martinvonz)
3644
* Philip Metzger (@PhilipMetzger)
3645
* Ruben Slabbert (@rslabbert)
3646
* Vamsi Avula (@avamsi)
3647
* Waleed Khan (@arxanas)
3648
* Willian Mori (@wmrmrx))
3649
* Yuya Nishihara (@yuja)
3650
* Zachary Dremann (@Dr-Emann)
3651
3652
## [0.9.0] - 2023-09-06
3653
3654
### Breaking changes
3655
3656
* The minimum supported Rust version (MSRV) is now 1.71.0.
3657
3658
* The storage format of branches, tags, and git refs has changed. Newly-stored
3659
repository data will no longer be loadable by older binaries.
3660
3661
* The `:` revset operator is deprecated. Use `::` instead. We plan to delete the
3662
`:` form in jj 0.15+.
3663
3664
* The `--allow-large-revsets` flag for `jj rebase` and `jj new` was replaced by
3665
a `all:` before the revset. For example, use `jj rebase -d 'all:foo-'`
3666
instead of `jj rebase --allow-large-revsets -d 'foo-'`.
3667
3668
* The `--allow-large-revsets` flag for `jj rebase` and `jj new` can no longer be
3669
used for allowing duplicate destinations. Include the potential duplicates
3670
in a single expression instead (e.g. `jj new 'all:x|y'`).
3671
3672
* The `push.branch-prefix` option was renamed to `git.push-branch-prefix`.
3673
3674
* The default editor on Windows is now `Notepad` instead of `pico`.
3675
3676
* `jj` will fail attempts to snapshot new files larger than 1MiB by default.
3677
This behavior
3678
can be customized with the `snapshot.max-new-file-size` config option.
3679
3680
* Author and committer signatures now use empty strings to represent unset
3681
names and email addresses. The `author`/`committer` template keywords and
3682
methods also return empty strings.
3683
Older binaries may not warn user when attempting to `git push` commits
3684
with such signatures.
3685
3686
* In revsets, the working-copy or remote symbols (such as `@`, `workspace_id@`,
3687
and `branch@remote`) can no longer be quoted as a unit. If a workspace or
3688
branch name contains whitespace, quote the name like `"branch name"@remote`.
3689
Also, these symbols will not be resolved as revset aliases or function
3690
parameters. For example, `author(foo@)` is now an error, and the revset alias
3691
`'revset-aliases.foo@' = '@'` will be failed to parse.
3692
3693
* The `root` revset symbol has been converted to function `root()`.
3694
3695
* The `..x` revset is now evaluated to `root()..x`, which means the root commit
3696
is no longer included.
3697
3698
* `jj git push` will now push all branches in the range `remote_branches()..@`
3699
instead of only branches pointing to `@` or `@-`.
3700
3701
* It's no longer allowed to create a Git remote named "git". Use `jj git remote
3702
rename` to rename the existing remote.
3703
[#1690](https://github.com/jj-vcs/jj/issues/1690)
3704
3705
* Revset expression like `origin/main` will no longer resolve to a
3706
remote-tracking branch. Use `main@origin` instead.
3707
3708
### New features
3709
3710
* Default template for `jj log` now does not show irrelevant information
3711
(timestamp, empty, message placeholder etc.) about the root commit.
3712
3713
* Commit templates now support the `root` keyword, which is `true` for the root
3714
commit and `false` for every other commit.
3715
3716
* `jj init --git-repo` now works with bare repositories.
3717
3718
* `jj config edit --user` and `jj config set --user` will now pick a default
3719
config location if no existing file is found, potentially creating parent
3720
directories.
3721
3722
* `jj log` output is now topologically grouped.
3723
[#242](https://github.com/jj-vcs/jj/issues/242)
3724
3725
* `jj git clone` now supports the `--colocate` flag to create the git repo
3726
in the same directory as the jj repo.
3727
3728
* `jj restore` gained a new option `--changes-in` to restore files
3729
from a merge revision's parents. This undoes the changes that `jj diff -r`
3730
would show.
3731
3732
* `jj diff`/`log` now supports `--tool <name>` option to generate diffs by
3733
external program. For configuration, see [the documentation](docs/config.md).
3734
[#1886](https://github.com/jj-vcs/jj/issues/1886)
3735
3736
* A new experimental diff editor `meld-3` is introduced that sets up Meld to
3737
allow you to see both sides of the original diff while editing. This can be
3738
used with `jj split`, `jj move -i`, etc.
3739
3740
* `jj log`/`obslog`/`op log` now supports `--limit N` option to show the first
3741
`N` entries.
3742
3743
* Added the `ui.paginate` option to enable/disable pager usage in commands
3744
3745
* `jj checkout`/`jj describe`/`jj commit`/`jj new`/`jj squash` can take repeated
3746
`-m/--message` arguments. Each passed message will be combined into paragraphs
3747
(separated by a blank line)
3748
3749
* It is now possible to set a default description using the new
3750
`ui.default-description` option, to use when describing changes with an empty
3751
description.
3752
3753
* `jj split` will now leave the description empty on the second part if the
3754
description was empty on the input commit.
3755
3756
* `branches()`/`remote_branches()`/`author()`/`committer()`/`description()`
3757
revsets now support exact matching. For example, `branch(exact:main)`
3758
selects the branch named "main", but not "maint". `description(exact:"")`
3759
selects commits whose description is empty.
3760
3761
* Revsets gained a new function `mine()` that
3762
aliases `author(exact:"your_email")`.
3763
3764
* Added support for `::` and `..` revset operators with both left and right
3765
operands omitted. These expressions are equivalent to `all()` and `~root()`
3766
respectively.
3767
3768
* `jj log` timestamp format now accepts `.utc()` to convert a timestamp to UTC.
3769
3770
* templates now support additional string
3771
methods `.starts_with(x)`, `.ends_with(x)`
3772
`.remove_prefix(x)`, `.remove_suffix(x)`, and `.substr(start, end)`.
3773
3774
* `jj next` and `jj prev` are added, these allow you to traverse the history
3775
in a linear style. For people coming from Sapling and `git-branchles`
3776
see [#2126](https://github.com/jj-vcs/jj/issues/2126) for
3777
further pending improvements.
3778
3779
* `jj diff --stat` has been implemented. It shows a histogram of the changes,
3780
same as `git diff --stat`.
3781
Fixes [#2066](https://github.com/jj-vcs/jj/issues/2066)
3782
3783
* `jj git fetch --all-remotes` has been implemented. It fetches all remotes
3784
instead of just the default remote
3785
3786
### Fixed bugs
3787
3788
* Fix issues related to .gitignore handling of untracked directories
3789
[#2051](https://github.com/jj-vcs/jj/issues/2051).
3790
3791
* `jj config set --user` and `jj config edit --user` can now be used outside of
3792
any repository.
3793
3794
* SSH authentication could hang when ssh-agent couldn't be reached
3795
[#1970](https://github.com/jj-vcs/jj/issues/1970)
3796
3797
* SSH authentication can now use ed25519 and ed25519-sk keys. They still need
3798
to be password-less.
3799
3800
* Git repository managed by the repo tool can now be detected as a "colocated"
3801
repository.
3802
[#2011](https://github.com/jj-vcs/jj/issues/2011)
3803
3804
### Contributors
3805
3806
Thanks to the people who made this release happen!
3807
3808
* Alexander Potashev (@aspotashev)
3809
* Anton Bulakh (@necauqua)
3810
* Austin Seipp (@thoughtpolice)
3811
* Benjamin Brittain (@benbrittain)
3812
* Benjamin Saunders (@Ralith)
3813
* Christophe Poucet (@poucet)
3814
* Emily Kyle Fox (@emilykfox)
3815
* Glen Choo (@chooglen)
3816
* Ilya Grigoriev (@ilyagr)
3817
* Kevin Liao (@kevincliao)
3818
* Linus Arver (@listx)
3819
* Martin Clausen (@maacl)
3820
* Martin von Zweigbergk (@martinvonz)
3821
* Matt Freitas-Stavola (@mbStavola)
3822
* Oscar Bonilla (@ob)
3823
* Philip Metzger (@PhilipMetzger)
3824
* Piotr Kufel (@qfel)
3825
* Preston Van Loon (@prestonvanloon)
3826
* Tal Pressman (@talpr)
3827
* Vamsi Avula (@avamsi)
3828
* Vincent Breitmoser (@Valodim)
3829
* Vladimir (@0xdeafbeef)
3830
* Waleed Khan (@arxanas)
3831
* Yuya Nishihara (@yuja)
3832
* Zachary Dremann (@Dr-Emann)
3833
3834
## [0.8.0] - 2023-07-09
3835
3836
### Breaking changes
3837
3838
* The `jujutsu` and `jujutsu-lib` crates were renamed to `jj-cli` and `jj-lib`,
3839
respectively.
3840
3841
* The `ui.oplog-relative-timestamps` option has been removed. Use the
3842
`format_time_range()` template alias instead. For details, see
3843
[the documentation](docs/config.md).
3844
3845
* Implicit concatenation of template expressions has been disabled. Use
3846
`++` operator, `concat()`, or `separate()` function instead.
3847
Example: `description ++ "\n"`
3848
3849
* `jj git push` will consider pushing the parent commit only when the
3850
current commit has no content and no description, such as right after
3851
a `jj squash`.
3852
3853
* The minimum supported Rust version (MSRV) is now 1.64.0.
3854
3855
* The `heads()` revset function was split up into two functions. `heads()`
3856
without arguments is now called `visible_heads()`. `heads()` with one argument
3857
is unchanged.
3858
3859
* The `ui.default-revset` config was renamed to `revsets.log`.
3860
3861
* The `jj sparse` command was split up into `jj sparse list` and
3862
`jj sparse set`.
3863
3864
* `jj hide` (alias for `jj abandon`) is no longer available. Use `jj abandon`
3865
instead.
3866
3867
* `jj debug completion`, `jj debug mangen` and `jj debug config-schema` have
3868
been moved from `jj debug` to `jj util`.
3869
3870
* `jj` will no longer parse `br` as a git_ref `refs/heads/br` when a branch `br`
3871
does not exist but the git_ref does (this is rare). Use `br@git` instead.
3872
3873
* `jj git fetch` will no longer import unrelated branches from the underlying
3874
Git repo.
3875
3876
### New features
3877
3878
* `jj git push --deleted` will remove all locally deleted branches from the
3879
remote.
3880
3881
* `jj restore` without `--from` works correctly even if `@` is a merge
3882
commit.
3883
3884
* `jj rebase` now accepts multiple `-s` and `-b` arguments. Revsets with
3885
multiple commits are allowed with `--allow-large-revsets`.
3886
3887
* `jj git fetch` now supports a `--branch` argument to fetch some of the
3888
branches only.
3889
3890
* `jj config get` command allows retrieving config values for use in scripting.
3891
3892
* `jj config set` command allows simple config edits like
3893
`jj config set --repo user.email "somebody@example.com"`
3894
3895
* Added `ui.log-word-wrap` option to wrap `jj log`/`obslog`/`op log` content
3896
based on terminal width. [#1043](https://github.com/jj-vcs/jj/issues/1043)
3897
3898
* Nodes in the (text-based) graphical log output now use a `◉` symbol instead
3899
of the letter `o`. The ASCII-based graph styles still use `o`.
3900
3901
* Commands that accept a diff format (`jj diff`, `jj interdiff`, `jj show`,
3902
`jj log`, and `jj obslog`) now accept `--types` to show only the type of file
3903
before and after.
3904
3905
* `jj describe` now supports `--reset-author` for resetting a commit's author
3906
to the configured user. `jj describe` also gained a `--no-edit` option to
3907
avoid opening the editor.
3908
3909
* Added `latest(x[, n])` revset function to select the latest `n` commits.
3910
3911
* Added `conflict()` revset function to select commits with conflicts.
3912
3913
* `jj squash` AKA `jj amend` now accepts a `--message` option to set the
3914
description of the squashed commit on the command-line.
3915
3916
* The progress display on `jj git clone/fetch` now includes the downloaded size.
3917
3918
* The formatter now supports a "default" color that can override another color
3919
defined by a parent style.
3920
3921
* `jj obslog` and `jj log` now show abandoned commits as hidden.
3922
3923
* `jj git fetch` and `jj git push` will now use the single defined remote even
3924
if it is not named "origin".
3925
3926
* `jj git push` now accepts `--branch` and `--change` arguments together.
3927
3928
* `jj git push` now accepts a `-r/--revisions` flag to specify revisions to
3929
push. All branches pointing to any of the specified revisions will be pushed.
3930
The flag can be used together with `--branch` and `--change`.
3931
3932
* `jj` with no subcommand now defaults to `jj log` instead of showing help. This
3933
command can be overridden by setting `ui.default-command`.
3934
3935
* Description tempfiles created via `jj describe` now have the file extension
3936
`.jjdescription` to help external tooling detect a unique filetype.
3937
3938
* The shortest unique change ID prefixes and commit ID prefixes in `jj log` are
3939
now shorter within the default log revset. You can override the default by
3940
setting the `revsets.short-prefixes` config to a different revset.
3941
3942
* The last seen state of branches in the underlying git repo is now presented by
3943
`jj branch list`/`jj log` as a remote called `git` (e.g. `main@git`). They can
3944
also be referenced in revsets. Such branches exist in colocated repos or if
3945
you use `jj git export`.
3946
3947
* The new `jj chmod` command allows setting or removing the executable bit on
3948
paths. Unlike the POSIX `chmod`, it works on Windows, on conflicted files, and
3949
on arbitrary revisions. Bits other than the executable bit are not planned to
3950
be supported.
3951
3952
* `jj sparse set` now accepts an `--edit` flag which brings up the `$EDITOR` to
3953
edit sparse patterns.
3954
3955
* `jj branch list` can now be filtered by revset.
3956
3957
* Initial support for the Watchman filesystem monitor. Set
3958
`core.fsmonitor = "watchman"` in your repo to enable.
3959
3960
### Fixed bugs
3961
3962
* Modify/delete conflicts now include context lines
3963
[#1244](https://github.com/jj-vcs/jj/issues/1244).
3964
3965
* It is now possible to modify either side of a modify/delete conflict (any
3966
change used to be considered a resolution).
3967
3968
* Fixed a bug that could get partially resolved conflicts to be interpreted
3969
incorrectly.
3970
3971
* `jj git fetch`: when re-adding a remote repository that had been previously
3972
removed, in some situations the remote branches were not recreated.
3973
3974
* `jj git remote rename`: the git remote references were not rewritten with
3975
the new name. If a new remote with the old name and containing the same
3976
branches was added, the remote branches may not be recreated in some cases.
3977
3978
* `jj workspace update-stale` now snapshots the working-copy changes before
3979
updating to the new working-copy commit.
3980
3981
* It is no longer allowed to create branches at the root commit.
3982
3983
* `git checkout` (without using `jj`) in colocated repo no longer abandons
3984
the previously checked-out anonymous branch.
3985
[#1042](https://github.com/jj-vcs/jj/issues/1042).
3986
3987
* `jj git fetch` in a colocated repo now abandons branches deleted on the
3988
remote, just like in a non-colocated repo.
3989
[#864](https://github.com/jj-vcs/jj/issues/864)
3990
3991
* `jj git fetch` can now fetch forgotten branches even if they didn't move on
3992
the remote.
3993
[#1714](https://github.com/jj-vcs/jj/pull/1714)
3994
[#1771](https://github.com/jj-vcs/jj/pull/1771)
3995
3996
* It is now possible to `jj branch forget` deleted branches.
3997
[#1537](https://github.com/jj-vcs/jj/issues/1537)
3998
3999
* Fixed race condition when assigning change id to Git commit. If you've
4000
already had unreachable change ids, run `jj debug reindex`.
4001
[#924](https://github.com/jj-vcs/jj/issues/924)
4002
4003
* Fixed false divergence on racy working-copy snapshots.
4004
[#697](https://github.com/jj-vcs/jj/issues/697),
4005
[#1608](https://github.com/jj-vcs/jj/issues/1608)
4006
4007
* In colocated repos, a bug causing conflicts when undoing branch moves (#922)
4008
has been fixed. Some surprising behaviors related to undoing `jj git push` or
4009
`jj git fetch` remain.
4010
4011
### Contributors
4012
4013
Thanks to the people who made this release happen!
4014
4015
* Aaron Bull Schaefer (@elasticdog)
4016
* Anton Bulakh (@necauqua)
4017
* Austin Seipp (@thoughtpolice)
4018
* Benjamin Saunders (@Ralith)
4019
* B Wilson (@xelxebar)
4020
* Christophe Poucet (@poucet)
4021
* David Barnett (@dbarnett)
4022
* Glen Choo (@chooglen)
4023
* Grégoire Geis (@71)
4024
* Ilya Grigoriev (@ilyagr)
4025
* Isabella Basso (@isinyaaa)
4026
* Kevin Liao (@kevincliao)
4027
* Martin von Zweigbergk (@martinvonz)
4028
* mlcui (@mlcui-corp)
4029
* Samuel Tardieu (@samueltardieu)
4030
* Tal Pressman (@talpr)
4031
* Vamsi Avula (@avamsi)
4032
* Waleed Khan (@arxanas)
4033
* Yuya Nishihara (@yuja)
4034
4035
## [0.7.0] - 2023-02-16
4036
4037
### Breaking changes
4038
4039
* The minimum supported Rust version (MSRV) is now 1.61.0.
4040
4041
* The `jj touchup` command was renamed to `jj diffedit`.
4042
4043
* The `-i` option to `jj restore` was removed in favor of new `--from`/`--to`
4044
options to `jj diffedit`.
4045
4046
* To report the situation when a change id corresponds to multiple visible
4047
commits, `jj log` now prints the change id in red and puts `??` after it.
4048
Previously, it printed the word "divergent".
4049
4050
* `jj log` prefixes commit descriptions with "(empty)" when they contain no
4051
change compared to their parents.
4052
4053
* The `author`/`committer` templates now display both name and email. Use
4054
`author.name()`/`committer.name()` to extract the name.
4055
4056
* Storage of the "HEAD@git" reference changed and can now have conflicts.
4057
Operations written by a new `jj` binary will have a "HEAD@git" reference that
4058
is not visible to older binaries.
4059
4060
* The `description` template keyword is now empty if no description set.
4061
Use `if(description, description, "(no description set)\n")` to get back
4062
the previous behavior.
4063
4064
* The `template.log.graph` and `template.commit_summary` config keys were
4065
renamed to `templates.log` and `templates.commit_summary` respectively.
4066
4067
* If a custom `templates.log` template is set, working-copy commit will
4068
no longer be highlighted automatically. Wrap your template with
4069
`label(if(current_working_copy, "working_copy"), ...)` to label the
4070
working-copy entry.
4071
4072
* The `ui.relative-timestamps` option has been removed. Use the
4073
`format_timestamp()` template alias instead. For details on showing relative
4074
timestamps in `jj log` and `jj show`, see [the documentation](docs/config.md).
4075
4076
* `jj op log` now shows relative timestamps by default. To disable, set
4077
`ui.oplog-relative-timestamps` to `false`.
4078
4079
* The global `--no-commit-working-copy` is now called `--ignore-working-copy`.
4080
4081
* The `diff.format` config option is now called `ui.diff.format`. The old name
4082
is still supported for now.
4083
4084
* `merge-tools.<name>.edit-args` now requires `$left`/`$right` parameters.
4085
The default is `edit-args = ["$left", "$right"]`.
4086
4087
* The builtin `jj update` and `jj up` aliases for `jj checkout` have been
4088
deleted.
4089
4090
* Change IDs are now rendered using letters from the end of the alphabet (from
4091
'z' through 'k') instead of the usual hex digits ('0' through '9' and 'a'
4092
through 'f'). This is to clarify the distinction between change IDs and commit
4093
IDs, and to allow more efficient lookup of unique prefixes. This change
4094
doesn't affect the storage format; existing repositories will remain usable.
4095
4096
### New features
4097
4098
* The default log format now uses the committer timestamp instead of the author
4099
timestamp.
4100
4101
* `jj log --summary --patch` now shows both summary and diff outputs.
4102
4103
* `jj git push` now accepts multiple `--branch`/`--change` arguments
4104
4105
* `jj config list` command prints values from config and `config edit` opens
4106
the config in an editor.
4107
4108
* `jj debug config-schema` command prints out JSON schema for the jj TOML config
4109
file format.
4110
4111
* `jj resolve --list` can now describe the complexity of conflicts.
4112
4113
* `jj resolve` now notifies the user of remaining conflicts, if any, on success.
4114
This can be prevented by the new `--quiet` option.
4115
4116
* Per-repository configuration is now read from `.jj/repo/config.toml`.
4117
4118
* Background colors, bold text, and underlining are now supported. You can set
4119
e.g. `colors.error = { bg = "red", bold = true, underline = true }` in your
4120
`~/.jjconfig.toml`.
4121
4122
* The `empty` condition in templates is true when the commit makes no change to
4123
the three compared to its parents.
4124
4125
* `branches([needle])` revset function now takes `needle` as an optional
4126
argument and matches just the branches whose name contains `needle`.
4127
4128
* `remote_branches([branch_needle[, remote_needle]])` now takes `branch_needle`
4129
and `remote_needle` as optional arguments and matches just the branches whose
4130
name contains `branch_needle` and remote contains `remote_needle`.
4131
4132
* `jj git fetch` accepts repeated `--remote` arguments.
4133
4134
* Default remotes can be configured for the `jj git fetch` and `jj git push`
4135
operations ("origin" by default) using the `git.fetch` and `git.push`
4136
configuration entries. `git.fetch` can be a list if multiple remotes must
4137
be fetched from.
4138
4139
* `jj duplicate` can now duplicate multiple changes in one go. This preserves
4140
any parent-child relationships between them. For example, the entire tree of
4141
descendants of `abc` can be duplicated with `jj duplicate abc:`.
4142
4143
* `jj log` now highlights the shortest unique prefix of every commit and change
4144
id and shows the rest in gray. To customize the length and style, use the
4145
`format_short_id()` template alias. For details, see
4146
[the documentation](docs/config.md).
4147
4148
* `jj print` was renamed to `jj cat`. `jj print` remains as an alias.
4149
4150
* In content that goes to the terminal, the ANSI escape byte (0x1b) is replaced
4151
by a "␛" character. That prevents them from interfering with the ANSI escapes
4152
jj itself writes.
4153
4154
* `jj workspace root` prints the root path of the current workspace.
4155
4156
* The `[alias]` config section was renamed to `[aliases]`. The old name is
4157
still accepted for backwards compatibility for some time.
4158
4159
* Commands that draw an ASCII graph (`jj log`, `jj op log`, `jj obslog`) now
4160
have different styles available by setting e.g. `ui.graph.style = "curved"`.
4161
4162
* `jj split` accepts creating empty commits when given a path. `jj split .`
4163
inserts an empty commit between the target commit and its children if any,
4164
and `jj split any-non-existent-path` inserts an empty commit between the
4165
target commit and its parents.
4166
4167
* Command arguments to `ui.diff-editor`/`ui.merge-editor` can now be specified
4168
inline without referring to `[merge-tools]` table.
4169
4170
* `jj rebase` now accepts a new `--allow-large-revsets` argument that allows the
4171
revset in the `-d` argument to expand to several revisions. For example,
4172
`jj rebase -s B -d B- -d C` now works even if `B` is a merge commit.
4173
4174
* `jj new` now also accepts a `--allow-large-revsets` argument that behaves
4175
similarly to `jj rebase --allow-large-revsets`.
4176
4177
* `jj new --insert-before` inserts the new commit between the target commit and
4178
its parents.
4179
4180
* `jj new --insert-after` inserts the new commit between the target commit and
4181
its children.
4182
4183
* `author`/`committer` templates now support `.username()`, which leaves out the
4184
domain information of `.email()`.
4185
4186
* It is now possible to change the author format of `jj log` with the
4187
`format_short_signature()` template alias. For details, see
4188
[the documentation](docs/config.md).
4189
4190
* Added support for template aliases. New symbols and functions can be
4191
configured by `template-aliases.<name> = <expression>`. Be aware that
4192
the template syntax isn't documented yet and is likely to change.
4193
4194
* The `ui.diff-instructions` config setting can be set to `false` to inhibit the
4195
creation of the `JJ-INSTRUCTIONS` file as part of diff editing.
4196
4197
### Fixed bugs
4198
4199
* When sharing the working copy with a Git repo, we used to forget to export
4200
branches to Git when only the working copy had changed. That's now fixed.
4201
4202
* Commit description set by `-m`/`--message` is now terminated with a newline
4203
character, just like descriptions set by editor are.
4204
4205
* The `-R`/`--repository` path must be a valid workspace directory. Its
4206
ancestor directories are no longer searched.
4207
4208
* Fixed a crash when trying to access a commit that's never been imported into
4209
the jj repo from a Git repo. They will now be considered as non-existent if
4210
referenced explicitly instead of crashing.
4211
4212
* Fixed handling of escaped characters in .gitignore (only keep trailing spaces
4213
if escaped properly).
4214
4215
* `jj undo` now works after `jj duplicate`.
4216
4217
* `jj duplicate` followed by `jj rebase` of a tree containing both the original
4218
and duplicate commit no longer crashes. The fix should also resolve any
4219
remaining
4220
instances of https://github.com/jj-vcs/jj/issues/27.
4221
4222
* Fix the output of `jj debug completion --help` by reversing fish and zsh text.
4223
4224
* Fixed edge case in `jj git fetch` when a pruned branch is a prefix of another
4225
branch.
4226
4227
### Contributors
4228
4229
Thanks to the people who made this release happen!
4230
4231
* Aleksandr Mikhailov (@AM5800)
4232
* Augie Fackler (@durin42)
4233
* Benjamin Saunders (@Ralith)
4234
* Daniel Ploch (@torquestomp)
4235
* Danny Hooper (@hooper)
4236
* David Barnett (@dbarnett)
4237
* Glen Choo (@chooglen)
4238
* Herby Gillot (@herbygillot)
4239
* Ilya Grigoriev (@ilyagr)
4240
* Luke Granger-Brown (@lukegb)
4241
* Martin von Zweigbergk (@martinvonz)
4242
* Michael Forster (@MForster)
4243
* Philip Metzger (@PhilipMetzger)
4244
* Ruben Slabbert (@rslabbert)
4245
* Samuel Tardieu (@samueltardieu)
4246
* Tal Pressman (@talpr)
4247
* Vamsi Avula (@avamsi)
4248
* Waleed Khan (@arxanas)
4249
* Yuya Nishihara (@yuja)
4250
4251
## [0.6.1] - 2022-12-05
4252
4253
No changes, only changed to a released version of the `thrift` crate dependency.
4254
4255
## [0.6.0] - 2022-12-05
4256
4257
### Breaking changes
4258
4259
* Dropped candidates set argument from `description(needle)`, `author(needle)`,
4260
`committer(needle)`, `merges()` revsets. Use `x & description(needle)`
4261
instead.
4262
4263
* Adjusted precedence of revset union/intersection/difference operators.
4264
`x | y & z` is now equivalent to `x | (y & z)`.
4265
4266
* Support for open commits has been dropped. The `ui.enable-open-commits` config
4267
that was added in 0.5.0 is no longer respected. The `jj open/close` commands
4268
have been deleted.
4269
4270
* `jj commit` is now a separate command from `jj close` (which no longer
4271
exists). The behavior has changed slightly. It now always asks for a
4272
description, even if there already was a description set. It now also only
4273
works on the working-copy commit (there's no `-r` argument).
4274
4275
* If a workspace's working-copy commit has been updated from another workspace,
4276
most commands in that workspace will now fail. Use the new
4277
`jj workspace update-stale` command to update the workspace to the new
4278
working-copy commit. (The old behavior was to automatically update the
4279
workspace.)
4280
4281
### New features
4282
4283
* Commands with long output are paginated.
4284
[#9](https://github.com/jj-vcs/jj/issues/9)
4285
4286
* The new `jj git remote rename` command allows git remotes to be renamed
4287
in-place.
4288
4289
* The new `jj resolve` command allows resolving simple conflicts with
4290
an external 3-way-merge tool.
4291
4292
* `jj git push` will search `@-` for branches to push if `@` has none.
4293
4294
* The new revset function `file(pattern..)` finds commits modifying the
4295
paths specified by the `pattern..`.
4296
4297
* The new revset function `empty()` finds commits modifying no files.
4298
4299
* Added support for revset aliases. New symbols and functions can be configured
4300
by `revset-aliases.<name> = <expression>`.
4301
4302
* It is now possible to specify configuration options on the command line
4303
with the new `--config-toml` global option.
4304
4305
* `jj git` subcommands will prompt for credentials when required for HTTPS
4306
remotes rather than failing.
4307
[#469](https://github.com/jj-vcs/jj/issues/469)
4308
4309
* Branches that have a different target on some remote than they do locally are
4310
now indicated by an asterisk suffix (e.g. `main*`) in `jj log`.
4311
[#254](https://github.com/jj-vcs/jj/issues/254)
4312
4313
* The commit ID was moved from first on the line in `jj log` output to close to
4314
the end. The goal is to encourage users to use the change ID instead, since
4315
that is generally more convenient, and it reduces the risk of creating
4316
divergent commits.
4317
4318
* The username and hostname that appear in the operation log are now
4319
configurable via config options `operation.username` and `operation.hostname`.
4320
4321
* `jj git` subcommands now support credential helpers.
4322
4323
* `jj log` will warn if it appears that the provided path was meant to be a
4324
revset.
4325
4326
* The new global flag `-v/--verbose` will turn on debug logging to give
4327
some additional insight into what is happening behind the scenes.
4328
Note: This is not comprehensively supported by all operations yet.
4329
4330
* `jj log`, `jj show`, and `jj obslog` now all support showing relative
4331
timestamps by setting `ui.relative-timestamps = true` in the config file.
4332
4333
### Fixed bugs
4334
4335
* A bug in the export of branches to Git caused spurious conflicted branches.
4336
This typically occurred when running in a working copy colocated with Git
4337
(created by running `jj init --git-dir=.`).
4338
[#463](https://github.com/jj-vcs/jj/issues/463)
4339
4340
* When exporting branches to Git, we used to fail if some branches could not be
4341
exported (e.g. because Git doesn't allow a branch called `main` and another
4342
branch called `main/sub`). We now print a warning about these branches
4343
instead.
4344
[#493](https://github.com/jj-vcs/jj/issues/493)
4345
4346
* If you had modified branches in jj and also modified branches in conflicting
4347
ways in Git, `jj git export` used to overwrite the changes you made in Git.
4348
We now print a warning about these branches instead.
4349
4350
* `jj edit root` now fails gracefully.
4351
4352
* `jj git import` used to abandon a commit if Git branches and tags referring
4353
to it were removed. We now keep it if a detached HEAD refers to it.
4354
4355
* `jj git import` no longer crashes when all Git refs are removed.
4356
4357
* Git submodules are now ignored completely. Earlier, files present in the
4358
submodule directory in the working copy would become added (tracked), and
4359
later removed if you checked out another commit. You can now use `git` to
4360
populate the submodule directory and `jj` will leave it alone.
4361
4362
* Git's GC could remove commits that were referenced from jj in some cases. We
4363
are now better at adding Git refs to prevent that.
4364
[#815](https://github.com/jj-vcs/jj/issues/815)
4365
4366
* When the working-copy commit was a merge, `jj status` would list only the
4367
first parent, and the diff summary would be against that parent. The output
4368
now lists all parents and the diff summary is against the auto-merged parents.
4369
4370
### Contributors
4371
4372
Thanks to the people who made this release happen!
4373
4374
* Martin von Zweigbergk (@martinvonz)
4375
* Benjamin Saunders (@Ralith)
4376
* Yuya Nishihara (@yuja)
4377
* Glen Choo (@chooglen)
4378
* Ilya Grigoriev (@ilyagr)
4379
* Ruben Slabbert (@rslabbert)
4380
* Waleed Khan (@arxanas)
4381
* Sean E. Russell (@xxxserxxx)
4382
* Pranay Sashank (@pranaysashank)
4383
* Luke Granger-Brown (@lukegb)
4384
4385
## [0.5.1] - 2022-10-17
4386
4387
No changes (just trying to get automated GitHub release to work).
4388
4389
## [0.5.0] - 2022-10-17
4390
4391
### Breaking changes
4392
4393
* Open commits are now disabled by default. That means that `jj checkout` will
4394
always create a new change on top of the specified commit and will let you
4395
edit that in the working copy. Set `ui.enable-open-commits = true` to restore
4396
the old behavior and let us know that you did so we know how many people
4397
prefer the workflow with open commits.
4398
4399
* `jj [op] undo` and `jj op restore` used to take the operation to undo or
4400
restore to as an argument to `-o/--operation`. It is now a positional
4401
argument instead (i.e. `jj undo -o abc123` is now written `jj undo abc123`).
4402
4403
* An alias that is not configured as a string list (e.g. `my-status = "status"`
4404
instead of `my-status = ["status"]`) is now an error instead of a warning.
4405
4406
* `jj log` now defaults to showing only commits that are not on any remote
4407
branches (plus their closest commit on the remote branch for context). This
4408
set of commits can be overridden by setting `ui.default-revset`. Use
4409
`jj log -r 'all()'` for the old behavior. Read more about revsets
4410
[here](https://github.com/jj-vcs/jj/blob/main/docs/revsets.md).
4411
[#250](https://github.com/jj-vcs/jj/issues/250)
4412
4413
* `jj new` now always checks out the new commit (used to be only if the parent
4414
was `@`).
4415
4416
* `jj merge` now checks out the new commit. The command now behaves exactly
4417
like `jj new`, except that it requires at least two arguments.
4418
4419
* When the working-copy commit is abandoned by `jj abandon` and the parent
4420
commit is open, a new working-copy commit will be created on top (the open
4421
parent commit used to get checked out).
4422
4423
* `jj branch` now uses subcommands like `jj branch create` and
4424
`jj branch forget` instead of options like `jj branch --forget`.
4425
[#330](https://github.com/jj-vcs/jj/issues/330)
4426
4427
* The [`$NO_COLOR` environment variable](https://no-color.org/) no longer
4428
overrides the `ui.color` configuration if explicitly set.
4429
4430
* `jj edit` has been renamed to `jj touchup`, and `jj edit` is now a new command
4431
with different behavior. The new `jj edit` lets you edit a commit in the
4432
working copy, even if the specified commit is closed.
4433
4434
* `jj git push` no longer aborts if you attempt to push an open commit (but it
4435
now aborts if a commit does not have a description).
4436
4437
* `jj git push` now pushes only branches pointing to the `@` by default. Use
4438
`--all` to push all branches.
4439
4440
* The `checkouts` template keyword is now called `working_copies`, and
4441
`current_checkout` is called `current_working_copy`.
4442
4443
### New features
4444
4445
* The new `jj interdiff` command compares the changes in commits, ignoring
4446
changes from intervening commits.
4447
4448
* `jj rebase` now accepts a `--branch/-b <revision>` argument, which can be used
4449
instead of `-r` or `-s` to specify which commits to rebase. It will rebase the
4450
whole branch, relative to the destination. The default mode has changed from
4451
`-r @` to `-b @`.
4452
4453
* The new `jj print` command prints the contents of a file in a revision.
4454
4455
* The new `jj git remotes list` command lists the configured remotes and their
4456
URLs.
4457
[#243](https://github.com/jj-vcs/jj/issues/243)
4458
4459
* `jj move` and `jj squash` now lets you limit the set of changes to move by
4460
specifying paths on the command line (in addition to the `--interactive`
4461
mode). For example, use `jj move --to @-- foo` to move the changes to file
4462
(or directory) `foo` in the working copy to the grandparent commit.
4463
4464
* When `jj move/squash/unsquash` abandons the source commit because it became
4465
empty and both the source and the destination commits have non-empty
4466
descriptions, it now asks for a combined description. If either description
4467
was empty, it uses the other without asking.
4468
4469
* `jj split` now lets you specify on the CLI which paths to include in the first
4470
commit. The interactive diff-editing is not started when you do that.
4471
4472
* Sparse checkouts are now supported. In fact, all working copies are now
4473
"sparse", only to different degrees. Use the `jj sparse` command to manage
4474
the paths included in the sparse checkout.
4475
4476
* Configuration is now also read from `~/.jjconfig.toml`.
4477
4478
* The `$JJ_CONFIG` environment variable can now point to a directory. If it
4479
does, all files in the directory will be read, in alphabetical order.
4480
4481
* The `$VISUAL` environment is now respected and overrides `$EDITOR`. The new
4482
`ui.editor` config has higher priority than both of them. There is also a new
4483
`$JJ_EDITOR` environment variable, which has even higher priority than the
4484
config.
4485
4486
* You can now use `-` and `+` in revset symbols. You used to have to quote
4487
branch names like `my-feature` in nested quotes (outer layer for your shell)
4488
like `jj co '"my-feature"'`. The quoting is no longer needed.
4489
4490
* The new revset function `connected(x)` is the same as `x:x`.
4491
4492
* The new revset function `roots(x)` finds commits in the set that are not
4493
descendants of other commits in the set.
4494
4495
* ssh-agent is now detected even if `$SSH_AGENT_PID` is not set (as long as
4496
`$SSH_AUTH_SOCK` is set). This should help at least macOS users where
4497
ssh-agent is launched by default and only `$SSH_AUTH_SOCK` is set.
4498
4499
* When importing from a git, any commits that are no longer referenced on the
4500
git side will now be abandoned on the jj side as well. That means that
4501
`jj git fetch` will now abandon unreferenced commits and rebase any local
4502
changes you had on top.
4503
4504
* `jj git push` gained a `--change <revision>` argument. When that's used, it
4505
will create a branch named after the revision's change ID, so you don't have
4506
to create a branch yourself. By default, the branch name will start with
4507
`push-`, but this can be overridden by the `push.branch-prefix` config
4508
setting.
4509
4510
* `jj git push` now aborts if you attempt to push a commit without a
4511
description or with the placeholder "(no name/email configured)" values for
4512
author/committer.
4513
4514
* Diff editor command arguments can now be specified by config file.
4515
Example:
4516
4517
[merge-tools.kdiff3]
4518
program = "kdiff3"
4519
edit-args = ["--merge", "--cs", "CreateBakFiles=0"]
4520
4521
* `jj branch` can accept any number of branches to update, rather than just one.
4522
4523
* Aliases can now call other aliases.
4524
4525
* `jj log` now accepts a `--reversed` option, which will show older commits
4526
first.
4527
4528
* `jj log` now accepts file paths.
4529
4530
* `jj obslog` now accepts `-p`/`--patch` option, which will show the diff
4531
compared to the previous version of the change.
4532
4533
* The "(no name/email configured)" placeholder value for name/email will now be
4534
replaced if once you modify a commit after having configured your name/email.
4535
4536
* Color setting can now be overridden by `--color=always|never|auto` option.
4537
4538
* `jj checkout` now lets you specify a description with `--message/-m`.
4539
4540
* `jj new` can now be used for creating merge commits. If you pass more than
4541
one argument to it, the new commit will have all of them as parents.
4542
4543
### Fixed bugs
4544
4545
* When rebasing a conflict where one side modified a file and the other side
4546
deleted it, we no longer automatically resolve it in favor of the modified
4547
content (this was a regression from commit c0ae4b16e8c4).
4548
4549
* Errors are now printed to stderr (they used to be printed to stdout).
4550
4551
* Updating the working copy to a commit where a file's executable bit changed
4552
but the contents was the same used to lead to a crash. That has now been
4553
fixed.
4554
4555
* If one side of a merge modified a directory and the other side deleted it, it
4556
used to be considered a conflict. The same was true if both sides added a
4557
directory with different files in. They are now merged as if the missing
4558
directory had been empty.
4559
4560
* When using `jj move` to move part of a commit into an ancestor, any branches
4561
pointing to the source commit used to be left on a hidden intermediate commit.
4562
They are now correctly updated.
4563
4564
* `jj untrack` now requires at least one path (allowing no arguments was a UX
4565
bug).
4566
4567
* `jj rebase` now requires at least one destination (allowing no arguments was a
4568
UX bug).
4569
4570
* `jj restore --to <rev>` now restores from the working copy (it used to restore
4571
from the working copy's parent).
4572
4573
* You now get a proper error message instead of a crash when `$EDITOR` doesn't
4574
exist or exits with an error.
4575
4576
* Global arguments, such as `--at-op=<operation>`, can now be passed before
4577
an alias.
4578
4579
* Fixed relative path to the current directory in output to be `.` instead of
4580
empty string.
4581
4582
* When adding a new workspace, the parent of the current workspace's current
4583
checkout will be checked out. That was always the intent, but the root commit
4584
was accidentally checked out instead.
4585
4586
* When checking out a commit, the previous commit is no longer abandoned if it
4587
has a non-empty description.
4588
4589
* All commands now consistently snapshot the working copy (it was missing from
4590
e.g. `jj undo` and `jj merge` before).
4591
4592
## [0.4.0] - 2022-04-02
4593
4594
### Breaking changes
4595
4596
* Dropped support for config in `~/.jjconfig`. Your configuration is now read
4597
from `<config dir>/jj/config.toml`, where `<config dir>` is
4598
`${XDG_CONFIG_HOME}` or `~/.config/` on Linux,
4599
`~/Library/Application Support/` on macOS, and `~\AppData\Roaming\` on
4600
Windows.
4601
4602
### New features
4603
4604
* You can now set an environment variable called `$JJ_CONFIG` to a path to a
4605
config file. That will then be read instead of your regular config file. This
4606
is mostly intended for testing and scripts.
4607
4608
* The [standard `$NO_COLOR` environment variable](https://no-color.org/) is now
4609
respected.
4610
4611
* `jj new` now lets you specify a description with `--message/-m`.
4612
4613
* When you check out a commit, the old commit no longer automatically gets
4614
abandoned if it's empty and has descendants, it only gets abandoned if it's
4615
empty and does not have descendants.
4616
4617
* When undoing an earlier operation, any new commits on top of commits from the
4618
undone operation will be rebased away. For example, let's say you rebase
4619
commit A so it becomes a new commit A', and then you create commit B on top of
4620
A'. If you now undo the rebase operation, commit B will be rebased to be on
4621
top of A instead. The same logic is used if the repo was modified by
4622
concurrent operations (so if one operation added B on top of A, and one
4623
operation rebased A as A', then B would be automatically rebased on top of
4624
A'). See #111 for more examples.
4625
[#111](https://github.com/jj-vcs/jj/issues/111)
4626
4627
* `jj log` now accepts `-p`/`--patch` option.
4628
4629
### Fixed bugs
4630
4631
* Fixed crash on `jj init --git-repo=.` (it almost always crashed).
4632
4633
* When sharing the working copy with a Git repo, the automatic importing and
4634
exporting (sometimes?) didn't happen on Windows.
4635
4636
## [0.3.3] - 2022-03-16
4637
4638
No changes, only trying to get the automated build to work.
4639
4640
## [0.3.2] - 2022-03-16
4641
4642
No changes, only trying to get the automated build to work.
4643
4644
## [0.3.1] - 2022-03-13
4645
4646
### Fixed bugs
4647
4648
- Fixed crash when `core.excludesFile` pointed to nonexistent file, and made
4649
leading `~/` in that config expand to `$HOME/`
4650
[#131](https://github.com/jj-vcs/jj/issues/131)
4651
4652
## [0.3.0] - 2022-03-12
4653
4654
Last release before this changelog started.
4655
4656
[unreleased]: https://github.com/jj-vcs/jj/compare/v0.37.0...HEAD
4657
[0.37.0]: https://github.com/jj-vcs/jj/compare/v0.36.0...v0.37.0
4658
[0.36.0]: https://github.com/jj-vcs/jj/compare/v0.35.0...v0.36.0
4659
[0.35.0]: https://github.com/jj-vcs/jj/compare/v0.34.0...v0.35.0
4660
[0.34.0]: https://github.com/jj-vcs/jj/compare/v0.33.0...v0.34.0
4661
[0.33.0]: https://github.com/jj-vcs/jj/compare/v0.32.0...v0.33.0
4662
[0.32.0]: https://github.com/jj-vcs/jj/compare/v0.31.0...v0.32.0
4663
[0.31.0]: https://github.com/jj-vcs/jj/compare/v0.30.0...v0.31.0
4664
[0.30.0]: https://github.com/jj-vcs/jj/compare/v0.29.0...v0.30.0
4665
[0.29.0]: https://github.com/jj-vcs/jj/compare/v0.28.2...v0.29.0
4666
[0.28.2]: https://github.com/jj-vcs/jj/compare/v0.28.1...v0.28.2
4667
[0.28.1]: https://github.com/jj-vcs/jj/compare/v0.28.0...v0.28.1
4668
[0.28.0]: https://github.com/jj-vcs/jj/compare/v0.27.0...v0.28.0
4669
[0.27.0]: https://github.com/jj-vcs/jj/compare/v0.26.0...v0.27.0
4670
[0.26.0]: https://github.com/jj-vcs/jj/compare/v0.25.0...v0.26.0
4671
[0.25.0]: https://github.com/jj-vcs/jj/compare/v0.24.0...v0.25.0
4672
[0.24.0]: https://github.com/jj-vcs/jj/compare/v0.23.0...v0.24.0
4673
[0.23.0]: https://github.com/jj-vcs/jj/compare/v0.22.0...v0.23.0
4674
[0.22.0]: https://github.com/jj-vcs/jj/compare/v0.21.0...v0.22.0
4675
[0.21.0]: https://github.com/jj-vcs/jj/compare/v0.20.0...v0.21.0
4676
[0.20.0]: https://github.com/jj-vcs/jj/compare/v0.19.0...v0.20.0
4677
[0.19.0]: https://github.com/jj-vcs/jj/compare/v0.18.0...v0.19.0
4678
[0.18.0]: https://github.com/jj-vcs/jj/compare/v0.17.1...v0.18.0
4679
[0.17.1]: https://github.com/jj-vcs/jj/compare/v0.17.0...v0.17.1
4680
[0.17.0]: https://github.com/jj-vcs/jj/compare/v0.16.0...v0.17.0
4681
[0.16.0]: https://github.com/jj-vcs/jj/compare/v0.15.1...v0.16.0
4682
[0.15.1]: https://github.com/jj-vcs/jj/compare/v0.15.0...v0.15.1
4683
[0.15.0]: https://github.com/jj-vcs/jj/compare/v0.14.0...v0.15.0
4684
[0.14.0]: https://github.com/jj-vcs/jj/compare/v0.13.0...v0.14.0
4685
[0.13.0]: https://github.com/jj-vcs/jj/compare/v0.12.0...v0.13.0
4686
[0.12.0]: https://github.com/jj-vcs/jj/compare/v0.11.0...v0.12.0
4687
[0.11.0]: https://github.com/jj-vcs/jj/compare/v0.10.0...v0.11.0
4688
[0.10.0]: https://github.com/jj-vcs/jj/compare/v0.9.0...v0.10.0
4689
[0.9.0]: https://github.com/jj-vcs/jj/compare/v0.8.0...v0.9.0
4690
[0.8.0]: https://github.com/jj-vcs/jj/compare/v0.7.0...v0.8.0
4691
[0.7.0]: https://github.com/jj-vcs/jj/compare/v0.6.1...v0.7.0
4692
[0.6.1]: https://github.com/jj-vcs/jj/compare/v0.6.0...v0.6.1
4693
[0.6.0]: https://github.com/jj-vcs/jj/compare/v0.5.1...v0.6.0
4694
[0.5.1]: https://github.com/jj-vcs/jj/compare/v0.5.0...v0.5.1
4695
[0.5.0]: https://github.com/jj-vcs/jj/compare/v0.4.0...v0.5.0
4696
[0.4.0]: https://github.com/jj-vcs/jj/compare/v0.3.3...v0.4.0
4697
[0.3.3]: https://github.com/jj-vcs/jj/compare/v0.3.2...v0.3.3
4698
[0.3.2]: https://github.com/jj-vcs/jj/compare/v0.3.1...v0.3.2
4699
[0.3.1]: https://github.com/jj-vcs/jj/compare/v0.3.0...v0.3.1
4700
[0.3.0]: https://github.com/jj-vcs/jj/releases/tag/v0.3.0
4701