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