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