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