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