Jujutsu
詳細情報
| タイトル | Jujutsu |
|---|---|
| URL | https://github.com/martinvonz/jj |
| バージョン | ver 0.24.0 |
| 更新日 | 2024/12/05 |
| 追加日 | 2024/02/08 |
| 種別 | フリーソフト / オープンソース(Apache) |
| 説明 | ソフトウェアプロジェクトのための強力なバージョン管理システム。 |
レビュー

Jujutsuはソフトウェア開発のための強力なバージョン管理ツール。
Googleのエンジニアによって開発されていて、現在デファクトスタンダードとなっているGitの複雑なコマンドラインの問題を解決し、直感的に使用できるようにデザインされている。物理的なバックエンドとして、ネイティブストレージのほかに、Gitリポジトリを使用することも可能。
以下のような特徴を持っている。
- コミットとしての作業コピー: ファイルへの変更は通常のコミットとして自動的に記録され、その後の変更のたびに修正される。この「スナップショット」デザインは、ユーザー向けのデータモデルを単純化し、内部アルゴリズムを単純化し、Gitの隠し場所やインデックス/ステージング領域のような機能を完全に包含する。
- 操作ログとアンドゥ: Jujutsuは、コミット、プル、プッシュに至るまで、リポジトリ上で実行されたすべての操作を記録する。
- 自動リベースと競合の解決: コミットを変更すると、すべての子孫は変更されたばかりのコミットの上に自動的にリベースされる。これにより、「パッチベース」のワークフローが簡単になる。
- 安全な同時レプリケーション: Jujutsuは同時実行シナリオの下で安全であるように設計されている。rsyncやDropboxで保存されたリポジトリを使用しても、リポジトリが破損した状態になることはない。最悪の場合、ローカルとリモートのコンフリクトが発生し、それを解決する必要がある。
Rustで作られていて、Windows/macOS/Linux用の実行ファイルが準備されている。
スクリーンショット
更新グラフ
バージョン履歴
Breaking changes
-
jj movehas been removed. It was deprecated in 0.16.0. -
jj checkoutand the built-in aliasjj cohave been removed.
It was deprecated in 0.14.0. -
jj mergehas been removed. It was deprecated in 0.14.0. -
jj git pushno longer pushes new bookmarks by default. Use--allow-newto
bypass this restriction. -
Lines prefixed with "JJ:" in commit descriptions and in sparse patterns (from
jj sparse edit) are now stripped even if they are not immediately followed
by a space. #5004
Deprecations
New features
-
Templates now support the
==and!=l
Security fixes
- Fixed path traversal by cloning/checking out crafted Git repository containing
..,.jj,.gitpaths. (GHSA-88h5-6w7m-5w56; CVE-2024-51990)
Breaking changes
-
Revset function names can no longer start with a number.
-
Evaluation error of
revsets.short-prefixesconfiguration is now reported. -
The
HEAD@gitsymbol no longer resolves to the Git HEAD revision. Use
git_head()or@-revset expression instead. Thegit_headtemplate
keyword now returns a boolean. -
Help command doesn't work recursively anymore, i.e.
jj workspace help root
doesn't work anymore. -
The color label
Breaking changes
-
Fixing #4239 means the
ordering of some messages have changed. -
Invalid
ui.graph.styleconfiguration is now an error. -
The builtin template
branch_listhas been renamed tobookmark_listas part
of thejj branchdeprecation.
Deprecations
-
jj branchhas been deprecated in favor ofjj bookmark.Rationale: Jujutsu's branches don't behave like Git branches, which a
confused many newcomers, as they expected a similar behavior given the name.
We've renamed them to "bookmarks" to match the actual behavior, as we think
that describes them better, and they also behave similar to Mercurial's
bookmarks.
Breaking changes
-
next/prevwill no longer infer when to go into edit mode when moving from
commit to commit. It now either follows the flags--edit|--no-editor it
gets the mode fromui.movement.edit.
Deprecations
-
jj untrackhas been renamed tojj file untrack.
New features
-
Add new boolean config knob,
ui.movement.editfor controlling the behaviour
ofprev/next. The flag turnseditmodeonandoffpermanently when set
respectively totrueorfalse. -
All diff formats except
--name-onlynow include information about copies and
moves. So do exter
Note to packagers
-
jjnow linkslibgit2statically by default. To use dynamic linking, you
need to set the environment variableLIBGIT2_NO_VENDOR=1while compiling.
(#4163)
Breaking changes
-
jj rebase --skip-emptyhas been renamed tojj rebase --skip-emptied -
jj backout --revisionhas been renamed tojj backout --revisions.
The short alias-ris still supported. -
The default
immutable_heads()set
now includesuntracked_remote_branches()with the assumption that untracked
branches aren't managed by you. Therefore, untracked branches are no longer
displayed injj logby
Breaking changes
-
In revset aliases, top-level
kind:patternexpression is now parsed as
modifier. Surround with parentheses if it should be parsed as string/file
pattern. -
Dropped support for automatic upgrade of repo formats used by versions before
0.12.0. -
jj fixnow defaults to the broader revset-s reachable(@, mutable())
instead of-s @. -
Dropped support for deprecated
jj branch delete/forget--globoption. -
jj branch setnow creates new branch if it doesn't exist. Usejj branch moveto ensure that the target branch already exists.
#3584
Deprecations
-
Replacing
Breaking changes
-
Dropped support for
ui.default-revsetconfig (replaced byrevsets.login
0.8.0). -
The
commit_summary_no_branchestemplate is superseded by
templates.branch_list. -
jj splitwill now refuse to split an empty commit. -
jj config listnow uses multi-line strings and single-quoted strings in the
output when appropriate. -
jj config get/list/setnow parsenameargument as TOML
key. Quote meta characters as needed.
Example:jj config get "revset-aliases.'trunk()'" -
When updating the working copy away from an empty and undescribed commit, it
is now abandoned even if
Fixed bugs
-
jj statusno longer scans through the entire history to look for ancestors with conflicts.
Breaking changes
-
The default template aliases were replaced as follows:
-
builtin_op_log_root(op_id: OperationId)->
format_root_operation(root: Operation) -
builtin_log_root(change_id: ChangeId, commit_id: CommitId)->
format_root_commit(root: Commit) -
builtin_change_id_with_hidden_and_divergent_info->
format_short_change_id_with_hidden_and_divergent_info(commit: Commit)
-
-
The
--revisionoption ofjj rebaseis renamed to--revisions. The short
alias-ris still supported.
New features
-
The list of conflicted paths is printed whenever the working copy changes.
This can be
Deprecations
-
jj movewas deprecated in favor ofjj squash.
Breaking changes
-
The
git_headtemplate keyword now returns an optional value instead of a
list of 0 or 1 element. -
The
jj sparse set --edit/--resetflags were split up intojj sparse edit/resetsubcommands respectively. -
The
jj sparsesubcommands now parse and print patterns as workspace-relative
paths. -
The
jj logcommand no longer uses the default revset when a path is specified.
New features
-
Config now supports rgb hex colors (in the form
#rrggbb) wherever existing color names are supported.
No code changes (fixing Rust Cargo.toml stuff).
