2022-08-19 01:02:30 +00:00
|
|
|
# Jujutsu VCS
|
2020-12-12 07:37:25 +00:00
|
|
|
|
2022-11-30 16:43:13 +00:00
|
|
|
![](https://img.shields.io/github/license/martinvonz/jj) ![](https://img.shields.io/github/v/release/martinvonz/jj) ![](https://img.shields.io/github/release-date/martinvonz/jj) ![](https://img.shields.io/crates/v/jujutsu)
|
|
|
|
<br/>
|
|
|
|
![](https://github.com/martinvonz/jj/workflows/build/badge.svg) ![](https://img.shields.io/codefactor/grade/github/martinvonz/jj/main) ![](https://img.shields.io/librariesio/github/martinvonz/jj)
|
|
|
|
|
2022-05-02 18:30:28 +00:00
|
|
|
- [Disclaimer](#disclaimer)
|
|
|
|
- [Introduction](#introduction)
|
|
|
|
- [Status](#status)
|
|
|
|
- [Installation](#installation)
|
|
|
|
- [Command-line completion](#command-line-completion)
|
|
|
|
- [Getting started](#getting-started)
|
|
|
|
- [Related work](#related-work)
|
2020-12-12 07:37:25 +00:00
|
|
|
|
2020-12-12 08:12:04 +00:00
|
|
|
## Disclaimer
|
2020-12-12 07:37:25 +00:00
|
|
|
|
2020-12-12 08:12:04 +00:00
|
|
|
This is not a Google product. It is an experimental version-control system
|
2023-03-08 06:37:55 +00:00
|
|
|
(VCS). I (Martin von Zweigbergk <martinvonz@google.com>) started it as a hobby
|
|
|
|
project in late 2019. That said, this it is now my full-time project at Google.
|
|
|
|
My presentation from Git Merge 2022 has information about Google's plans. See
|
|
|
|
the
|
2023-01-22 18:41:38 +00:00
|
|
|
[slides](https://docs.google.com/presentation/d/1F8j9_UOOSGUN9MvHxPZX_L4bQ9NMcYOp1isn17kTC_M/view)
|
|
|
|
or the [recording](https://www.youtube.com/watch?v=bx_LGilOuE4).
|
2020-12-12 07:37:25 +00:00
|
|
|
|
|
|
|
|
2020-12-12 08:12:04 +00:00
|
|
|
## Introduction
|
2020-12-12 07:37:25 +00:00
|
|
|
|
2022-01-04 05:38:34 +00:00
|
|
|
Jujutsu is a [Git-compatible](docs/git-compatibility.md)
|
2021-10-28 04:45:37 +00:00
|
|
|
[DVCS](https://en.wikipedia.org/wiki/Distributed_version_control). It combines
|
2022-01-04 05:31:46 +00:00
|
|
|
features from Git (data model,
|
|
|
|
[speed](https://github.com/martinvonz/jj/discussions/49)), Mercurial (anonymous
|
|
|
|
branching, simple CLI [free from "the index"](docs/git-comparison.md#the-index),
|
2022-01-29 06:47:18 +00:00
|
|
|
[revsets](docs/revsets.md), powerful history-rewriting), and Pijul/Darcs
|
2022-09-01 02:45:51 +00:00
|
|
|
([first-class conflicts](docs/conflicts.md)), with features not found in most
|
2021-12-12 08:19:39 +00:00
|
|
|
of them ([working-copy-as-a-commit](docs/working-copy.md),
|
2022-01-10 15:59:16 +00:00
|
|
|
[undo functionality](docs/operation-log.md), automatic rebase,
|
|
|
|
[safe replication via `rsync`, Dropbox, or distributed file
|
|
|
|
system](docs/technical/concurrency.md)).
|
2020-12-12 07:37:25 +00:00
|
|
|
|
2020-12-12 08:12:04 +00:00
|
|
|
The command-line tool is called `jj` for now because it's easy to type and easy
|
2021-05-15 16:16:31 +00:00
|
|
|
to replace (rare in English). The project is called "Jujutsu" because it matches
|
2021-10-28 04:45:37 +00:00
|
|
|
"jj".
|
2020-12-12 07:37:25 +00:00
|
|
|
|
2022-08-28 17:16:07 +00:00
|
|
|
If you have any questions, please join us on Discord
|
|
|
|
[![Discord](https://img.shields.io/discord/968932220549103686.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/dkmfj3aGQN).
|
2022-08-19 01:03:14 +00:00
|
|
|
|
2022-01-29 06:36:56 +00:00
|
|
|
## Features
|
2021-05-23 21:42:20 +00:00
|
|
|
|
2022-01-29 06:36:56 +00:00
|
|
|
### Compatible with Git
|
2022-02-27 22:00:46 +00:00
|
|
|
|
2022-01-29 06:36:56 +00:00
|
|
|
Jujutsu has two backends. One of them is a Git backend (the other is a native
|
2022-03-05 16:42:35 +00:00
|
|
|
one [^native-backend]). This lets you use Jujutsu as an alternative interface to Git. The commits
|
2022-01-29 06:36:56 +00:00
|
|
|
you create will look like regular Git commits. You can always switch back to
|
2022-02-20 06:13:49 +00:00
|
|
|
Git. The Git support uses the [libgit2](https://libgit2.org/) C library.
|
2022-01-29 06:36:56 +00:00
|
|
|
|
2022-04-23 15:47:13 +00:00
|
|
|
[^native-backend]: At this time, there's practically no reason to use the native
|
2023-03-24 18:26:23 +00:00
|
|
|
backend. The backend exists mainly to make sure that it's possible to eventually
|
|
|
|
add functionality that cannot easily be added to the Git backend.
|
2022-03-05 16:42:35 +00:00
|
|
|
|
2022-10-21 05:13:09 +00:00
|
|
|
<img src="demos/git_compat.png" />
|
2022-01-29 06:36:56 +00:00
|
|
|
|
|
|
|
### The working copy is automatically committed
|
|
|
|
|
|
|
|
Most Jujutsu commands automatically commit the working copy. This leads to a
|
|
|
|
simpler and more powerful interface, since all commands work the same way on the
|
|
|
|
working copy or any other commit. It also means that you can always check out a
|
|
|
|
different commit without first explicitly committing the working copy changes
|
|
|
|
(you can even check out a different commit while resolving merge conflicts).
|
|
|
|
|
2022-10-21 05:13:09 +00:00
|
|
|
<img src="demos/working_copy.png" />
|
2022-01-29 06:36:56 +00:00
|
|
|
|
|
|
|
### Operations update the repo first, then possibly the working copy
|
|
|
|
|
|
|
|
The working copy is only updated at the end of an operation, after all other
|
2022-02-27 22:00:46 +00:00
|
|
|
changes have already been recorded. This means that you can run any command
|
2022-01-29 06:36:56 +00:00
|
|
|
(such as `jj rebase`) even if the working copy is dirty.
|
|
|
|
|
|
|
|
### Entire repo is under version control
|
|
|
|
|
|
|
|
All operations you perform in the repo are recorded, along with a snapshot of
|
|
|
|
the repo state after the operation. This means that you can easily revert to an
|
|
|
|
earlier repo state, or to simply undo a particular operation (which does not
|
|
|
|
necessarily have to be the most recent operation).
|
|
|
|
|
2022-10-21 05:13:09 +00:00
|
|
|
<img src="demos/operation_log.png" />
|
2022-01-29 06:36:56 +00:00
|
|
|
|
|
|
|
### Conflicts can be recorded in commits
|
|
|
|
|
|
|
|
If an operation results in conflicts, information about those conflicts will be
|
|
|
|
recorded in the commit(s). The operation will succeed. You can then resolve the
|
|
|
|
conflicts later. One consequence of this design is that there's no need to
|
|
|
|
continue interrupted operations. Instead, you get a single workflow for
|
|
|
|
resolving conflicts, regardless of which command caused them. This design also
|
|
|
|
lets Jujutsu rebase merge commits correctly (unlike both Git and Mercurial).
|
|
|
|
|
|
|
|
Basic conflict resolution:
|
2022-10-21 05:13:09 +00:00
|
|
|
|
|
|
|
<img src="demos/resolve_conflicts.png" />
|
2022-01-29 06:36:56 +00:00
|
|
|
|
|
|
|
Juggling conflicts:
|
2022-10-21 05:13:09 +00:00
|
|
|
|
|
|
|
<img src="demos/juggle_conflicts.png" />
|
2022-01-29 06:36:56 +00:00
|
|
|
|
|
|
|
### Automatic rebase
|
|
|
|
|
|
|
|
Whenever you modify a commit, any descendants of the old commit will be rebased
|
|
|
|
onto the new commit. Thanks to the conflict design described above, that can be
|
|
|
|
done even if there are conflicts. Branches pointing to rebased commits will be
|
|
|
|
updated. So will the working copy if it points to a rebased commit.
|
2021-05-23 21:42:20 +00:00
|
|
|
|
2022-01-29 06:47:18 +00:00
|
|
|
### Comprehensive support for rewriting history
|
2021-05-23 21:42:20 +00:00
|
|
|
|
2022-01-29 06:47:18 +00:00
|
|
|
Besides the usual rebase command, there's `jj describe` for editing the
|
2022-12-18 03:56:21 +00:00
|
|
|
description (commit message) of an arbitrary commit. There's also `jj diffedit`,
|
2022-01-29 06:47:18 +00:00
|
|
|
which lets you edit the changes in a commit without checking it out. To split
|
|
|
|
a commit into two, use `jj split`. You can even move part of the changes in a
|
2022-02-27 22:00:46 +00:00
|
|
|
commit to any other commit using `jj move`.
|
2022-01-29 06:47:18 +00:00
|
|
|
|
|
|
|
|
|
|
|
## Status
|
2021-09-08 17:00:47 +00:00
|
|
|
|
2021-10-28 04:45:37 +00:00
|
|
|
The tool is quite feature-complete, but some important features like (the
|
2022-09-13 07:26:23 +00:00
|
|
|
equivalent of) `git blame` are not yet supported. There
|
2021-10-28 04:45:37 +00:00
|
|
|
are also several performance bugs. It's also likely that workflows and setups
|
2022-10-24 06:29:28 +00:00
|
|
|
different from what the core developers use are not well supported.
|
2021-10-28 04:45:37 +00:00
|
|
|
|
2022-10-24 06:29:28 +00:00
|
|
|
I (Martin von Zweigbergk) have almost exclusively used `jj` to develop the
|
|
|
|
project itself since early January 2021. I haven't had to re-clone from source
|
|
|
|
(I don't think I've even had to restore from backup).
|
2021-10-28 04:45:37 +00:00
|
|
|
|
|
|
|
There *will* be changes to workflows and backward-incompatible changes to the
|
|
|
|
on-disk formats before version 1.0.0. Even the binary's name may change (i.e.
|
2022-10-24 06:29:28 +00:00
|
|
|
away from `jj`). For any format changes, we'll try to implement transparent
|
|
|
|
upgrades (as we've done with recent changes), or provide upgrade commands or
|
2021-10-28 04:45:37 +00:00
|
|
|
scripts if requested.
|
2021-09-08 17:00:47 +00:00
|
|
|
|
|
|
|
|
2021-10-13 15:42:29 +00:00
|
|
|
## Installation
|
|
|
|
|
2022-03-16 23:32:20 +00:00
|
|
|
See below for how to build from source. There are also
|
|
|
|
[pre-built binaries](https://github.com/martinvonz/jj/releases) for Windows,
|
|
|
|
Mac, or Linux (musl).
|
|
|
|
|
2023-01-19 04:54:19 +00:00
|
|
|
If you're installing from source, you need to use Rust version 1.61 or higher,
|
2022-08-29 21:09:08 +00:00
|
|
|
or you will get a cryptic message like this:
|
|
|
|
```
|
|
|
|
error: failed to select a version for the requirement `libgit2-sys = "=0.14.0"``
|
|
|
|
candidate versions found which didn't match: 0.13.2+1.4.2, 0.13.1+1.4.2, 0.13.0+1.4.1, ...
|
|
|
|
```
|
|
|
|
|
2022-02-28 00:10:23 +00:00
|
|
|
### Linux
|
|
|
|
|
2022-03-16 23:32:20 +00:00
|
|
|
On most distributions, you'll need to build from source using `cargo` directly.
|
2022-02-28 00:10:23 +00:00
|
|
|
|
2022-03-16 23:32:20 +00:00
|
|
|
#### Build using `cargo`
|
2022-02-28 00:10:23 +00:00
|
|
|
|
2023-01-05 04:40:27 +00:00
|
|
|
First make sure that you have the `libssl-dev`, `openssl`, and `pkg-config`
|
|
|
|
packages installed by running something like this:
|
2022-03-02 06:11:36 +00:00
|
|
|
```shell script
|
2023-01-05 04:40:27 +00:00
|
|
|
sudo apt-get install libssl-dev openssl pkg-config
|
2022-03-02 06:11:36 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
Now run:
|
2022-02-28 00:10:23 +00:00
|
|
|
```shell script
|
2023-01-28 02:21:23 +00:00
|
|
|
cargo install --git https://github.com/martinvonz/jj.git --locked --bin jj jujutsu
|
2022-02-28 00:10:23 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### Nix OS
|
|
|
|
|
|
|
|
If you're on Nix OS you can use the flake for this repository.
|
|
|
|
For example, if you want to run `jj` loaded from the flake, use:
|
|
|
|
|
|
|
|
```shell script
|
|
|
|
nix run 'github:martinvonz/jj'
|
|
|
|
```
|
|
|
|
|
|
|
|
You can also add this flake url to your system input flakes. Or you can
|
|
|
|
install the flake to your user profile:
|
|
|
|
|
|
|
|
```shell script
|
|
|
|
nix profile install 'github:martinvonz/jj'
|
|
|
|
```
|
|
|
|
|
|
|
|
|
2022-07-16 18:46:58 +00:00
|
|
|
#### Homebrew
|
|
|
|
|
|
|
|
If you use linuxbrew, you can run:
|
|
|
|
|
|
|
|
```shell script
|
|
|
|
brew install jj
|
|
|
|
```
|
|
|
|
|
|
|
|
|
2022-02-28 00:10:23 +00:00
|
|
|
### Mac
|
|
|
|
|
2022-07-16 18:46:58 +00:00
|
|
|
#### Homebrew
|
|
|
|
|
|
|
|
If you use Homebrew, you can run:
|
|
|
|
|
|
|
|
```shell script
|
|
|
|
brew install jj
|
|
|
|
```
|
|
|
|
|
2022-12-07 03:40:40 +00:00
|
|
|
#### MacPorts
|
|
|
|
|
|
|
|
You can also install `jj` via [MacPorts](https://www.macports.org) (as the `jujutsu` port):
|
|
|
|
|
|
|
|
```shell script
|
|
|
|
sudo port install jujutsu
|
|
|
|
```
|
|
|
|
|
|
|
|
([port page](https://ports.macports.org/port/jujutsu/))
|
2022-07-16 18:46:58 +00:00
|
|
|
|
|
|
|
#### From Source
|
|
|
|
|
2022-02-28 00:10:23 +00:00
|
|
|
You may need to run some or all of these:
|
2022-02-27 22:00:46 +00:00
|
|
|
```shell script
|
|
|
|
xcode-select --install
|
|
|
|
brew install openssl
|
|
|
|
brew install pkg-config
|
2022-04-23 16:13:57 +00:00
|
|
|
export PKG_CONFIG_PATH="$(brew --prefix)/opt/openssl@3/lib/pkgconfig"
|
2022-02-20 06:56:31 +00:00
|
|
|
```
|
|
|
|
|
2022-02-28 00:10:23 +00:00
|
|
|
Now run:
|
2021-10-13 15:42:29 +00:00
|
|
|
```shell script
|
2023-01-28 02:21:23 +00:00
|
|
|
cargo install --git https://github.com/martinvonz/jj.git --locked --bin jj jujutsu
|
2021-10-13 15:42:29 +00:00
|
|
|
```
|
|
|
|
|
2022-02-28 00:10:23 +00:00
|
|
|
|
|
|
|
### Windows
|
|
|
|
|
|
|
|
Run:
|
|
|
|
```shell script
|
2023-01-28 02:21:23 +00:00
|
|
|
cargo install --git https://github.com/martinvonz/jj.git --locked --bin jj jujutsu --features vendored-openssl
|
2022-02-28 00:10:23 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Initial configuration
|
|
|
|
|
|
|
|
You may want to configure your name and email so commits are made in your name.
|
2022-05-27 00:31:47 +00:00
|
|
|
Create a file at `~/.jjconfig.toml` and make it look something like
|
2022-03-19 17:17:30 +00:00
|
|
|
this:
|
2021-10-14 03:33:17 +00:00
|
|
|
```shell script
|
2022-05-08 16:26:58 +00:00
|
|
|
$ cat ~/.jjconfig.toml
|
2021-10-14 03:33:17 +00:00
|
|
|
[user]
|
|
|
|
name = "Martin von Zweigbergk"
|
|
|
|
email = "martinvonz@google.com"
|
|
|
|
```
|
|
|
|
|
2022-02-28 00:10:23 +00:00
|
|
|
|
|
|
|
## Command-line completion
|
2022-02-27 21:53:41 +00:00
|
|
|
|
|
|
|
To set up command-line completion, source the output of
|
2023-04-13 00:04:24 +00:00
|
|
|
`jj util completion --bash/--zsh/--fish` (called `jj debug completion` in
|
|
|
|
jj <= 0.7.0). Exactly how to source it depends on your shell.
|
2022-02-27 21:53:41 +00:00
|
|
|
|
2022-02-28 00:10:23 +00:00
|
|
|
### Bash
|
2022-02-27 21:53:41 +00:00
|
|
|
```shell script
|
2023-04-13 00:04:24 +00:00
|
|
|
source <(jj util completion) # --bash is the default
|
2022-02-27 21:53:41 +00:00
|
|
|
```
|
|
|
|
|
2022-02-28 00:10:23 +00:00
|
|
|
### Zsh
|
2022-02-27 21:53:41 +00:00
|
|
|
```shell script
|
|
|
|
autoload -U compinit
|
|
|
|
compinit
|
2023-04-13 00:04:24 +00:00
|
|
|
source <(jj util completion --zsh)
|
2022-02-27 21:53:41 +00:00
|
|
|
```
|
|
|
|
|
2022-02-28 00:10:23 +00:00
|
|
|
### Fish
|
2022-02-27 21:53:41 +00:00
|
|
|
```shell script
|
2023-04-13 00:04:24 +00:00
|
|
|
jj util completion --fish | source
|
2022-02-27 21:53:41 +00:00
|
|
|
```
|
|
|
|
|
2022-04-23 16:36:10 +00:00
|
|
|
### Xonsh
|
|
|
|
```shell script
|
2023-04-13 00:04:24 +00:00
|
|
|
source-bash $(jj util completion)
|
2022-04-23 16:36:10 +00:00
|
|
|
```
|
|
|
|
|
2022-02-27 21:53:41 +00:00
|
|
|
|
2021-09-09 17:56:22 +00:00
|
|
|
## Getting started
|
2021-05-23 21:42:20 +00:00
|
|
|
|
2021-09-09 17:56:22 +00:00
|
|
|
The best way to get started is probably to go through
|
2021-11-19 04:05:43 +00:00
|
|
|
[the tutorial](docs/tutorial.md). Also see the
|
|
|
|
[Git comparison](docs/git-comparison.md), which includes a table of
|
|
|
|
`jj` vs. `git` commands.
|
2021-10-20 22:27:33 +00:00
|
|
|
|
|
|
|
|
|
|
|
## Related work
|
|
|
|
|
|
|
|
There are several tools trying to solve similar problems as Jujutsu. See
|
2021-12-18 15:54:46 +00:00
|
|
|
[related work](docs/related-work.md) for details.
|