最近jj (jujutsu)というバージョン管理ツールをよく利用しています。
JJとはGitの代わりになるバージョン管理機構の一つです。なぜgitの代わりに使っているのかを書いていこうと思います。
過去の改変が簡単
gitと異なる特徴としては、過去の修正や、コミット(JJでは、リビジョンと言う)の付け替えが得意だということです。
例えば、githubにプッシュをした後に少し修正する必要があったとします。修正を行い、コミットをしたときにgithub上のCIがコミットしており、手元からgithubにプッシュできないといったことがよく発生します。こういった場合には、一旦自分のコミットをreset→stashした後にリモートのコミットを取り込んでからstash applyをすると思います。このやり方は一つでも間違えると自分の修正が消えてしまいます。
JJを使った場合はよりシンプルなやり方で解決することができます。
jj git push // remoteにプッシュ
jj new
// いくつかの修正
jj git fetch // git pullみたいなもの。
jj rebase -s {ローカルの最新change id} -o {github ciのコミットのchange id}
jj git push
また、機能開発の際にはdevelopブランチから機能ブランチを切って開発することが普通だと思いますが、機能開発している間にdevelopブランチが進む事はよくあることです。gitでは、定期的に開発ブランチに対してdevelopブランチを取り込む必要があります。一方で、JJを利用した場合では、過去の改変が簡単であるため、現在のdevelopの状態に開発ブランチの分岐を付け替えることができます。つまり過去のある時点から開発を開始したのではなく、いつでも今現在から開発した状態にすることができるということです。
jj new develop // 1
// 開発する。その間にdevelopが進む
jj git fetch
jj rebase -s {1のchange id} -o develop
ステージング→コミット作業が不要
jjはgitと異なりステージングが不要です。jjでは編集、作成したファイル全てがgitでいうステージに乗ります。また、gitの場合だとcommitをしないと他のブランチに移動することはできませんが、JJの場合はステージングという概念がなく、他のブランチにいつでも移動することができます。現在の作業のファイルをコミットしていないから、他の作業に移ることができないといったことが発生しません。
コマンドのundoができる
さらにjjではJJによる作業を巻き戻すことができます。間違えた操作を行ってもundoを行うことによって前の状態に戻すことができます。
jj undo
gitと完全互換性がある
JJはgitと互換性があるため、既にあるgitで管理されたプロジェクトについて、JJを他の誰にもバレずに利用することができます。
既に存在するプロジェクトのルートディレクトリーで、以下のコマンドを実行することで、JJを使い始めることができます
jj git init --colocate
インストール方法
JJはrustで作られたツールであるためcargoを通してインストールすることができます。またMacOSを利用している場合は、homebrewからインストールすることが可能です。
最後に
jjはgitとメンタルモデルがかなり異なるため、最初は慣れるのに大変ですが、慣れるととても使いやすいです。jjuiというTUIのJJのクライアントアプリも存在するので、そちらを使って慣れるのもありだと思います。