0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

バージョン管理システムJujutsu(jj)とは

0
Posted at

はじめに

正直に言うと、Jujutsu(jj)のことは最初、名前すら知りませんでした。

きっかけは本当に些細なことで、たまたま読んでいた技術雑誌に「次世代バージョン管理システム」という見出しとともに紹介されていたのを見つけたのが始まりです。「Gitでよくない?」という気持ちと「Gitで十分では?」と最初は思いつつも、好奇心から少し読み進めてみたところ、記載されている解説が非常に興味深いものでした。

  • Gitをバックエンドとして利用し、既存のGit環境と連携しやすい
  • git addもgit stashもいらない
  • ローカルリポジトリに対する多くの操作をjj undoで取り消せる

正直、最初は「そんな都合よくいくの??」と半信半疑でした。Gitのコンフリクト解消に時間を溶かしたり、git rebase -iで履歴をいじり回して事故った経験がある身としては、こういう「夢のようなツール」系の紹介には裏切られてきたからです。

でも気になったので、雑誌を読み終え、公式サイトやGitHub、いくつかのブログ記事を漁って、自分なりに調べてまとめてみることにしました。

1. Jujutsu(jj)とは何か

調べてみてまず分かったのは、Jujutsuが決して「思いつき」で作られたツールではないということでした。

Jujutsuは、ソフトウェアプロジェクトの変更履歴を管理するための分散バージョン管理システムです。
開発者のMartin von Zweigbergk氏が、2019年末に趣味のプロジェクトとして開発を始めました。その後、Googleにおけるフルタイムのプロジェクトへと発展し、現在は複数のGoogle社員を含む開発者が参加しています。
ただし、Googleが主要なコントリビューターの一つではあるものの、公式にサポートされているGoogle製品ではなく、サポートはコミュニティによって提供されています。

また面白いのは名前の由来です。先に「jj」という短くて打ちやすいコマンド名が決まり、それに合う単語として「Jujutsu(柔術)」が後から採用されたのだそうです。

Jujutsuの大きな特徴は、ユーザーインターフェースやバージョン管理アルゴリズムと、ストレージバックエンドを分離して設計していることです。
現在はGitバックエンドが広く利用されており、Jujutsuで作成した履歴を標準的なGitコミットとして保存できます。そのため、GitHubやGitLabなどのGitリモートや、既存のCI/CD環境と連携しながら利用することが可能です。
ただし、Jujutsuが必ずすべてのデータをGitリポジトリに保存する仕組みというわけではありません。
あくまで複数のストレージバックエンドを利用できることを前提としたアーキテクチャであり、現時点ではGitバックエンドが実用上の中心になっています。
既存のGitリポジトリと同じ作業ディレクトリで利用するコロケーション構成も可能なため、チームではGitを使いながら、自分のローカル環境ではJujutsuを試すといった使い方もできます。ただし、社内ルールや利用している周辺ツールとの互換性については、事前に確認が必要です。

2. 金銭的な条件

真っ先に気になったのは、やっぱり費用です。 結論から言うと、Jujutsuのライセンス費用は0円です。Apache-2.0ライセンスのオープンソースソフトウェアなので、個人利用はもちろん、商用プロジェクトで使っても課金は発生しません。 ただし調べていくうちに、「お金はかからないけど、導入や運用にかかるコストがゼロというわけではない」ということも分かってきました。

コスト要素 発生形態 目安 内容
ツール自体の費用 直接コスト 0円 Apache-2.0ライセンスで、商用・個人利用ともに無料
初期学習コスト 人的コスト 発生する Gitとは異なる「チェンジ中心」の考え方や操作方法を覚える必要がある
チーム展開コスト 人的コスト 発生する メンバーへの教育、運用ルールの策定、トラブル時の対応方法の共有などが必要
インフラ統合コスト 技術コスト 環境によって発生する GitHubやGitLabとの連携は可能だが、CI、IDE、Gitフックなどの動作検証が必要
維持管理コスト 運用コスト 比較的小さい HomebrewやWinGetなどで更新できるが、バージョンアップ時の変更点を確認する必要がある

個人のローカル環境で試すだけであれば、金銭的な負担はほとんどありません。 一方、チーム全体へ展開する場合は、使い方の教育やルール策定に加えて、CI、IDE、Gitフックなどの既存環境に影響がないか確認する工数が発生します。 要するに、ツール自体は無料でも、学習・検証・運用のための人的コストや技術的なコストは必要になるというのが実態のようです。

3. 使ってみたくなった3つの理由

調べていく中で、「これは実際に触ってみたい」と思わせるポイントが3つありました。

① いつでもGitに戻せる「コロケーションモード」

jj git initというコマンド一発で、同じフォルダの中にGitとJujutsuを共存させられます。Jujutsuで作業しながら、不安になったら普通にGitコマンドに戻ればいい。裏側では両者が自動で同期されているので、リポジトリを壊す心配もチームに迷惑をかける心配もありません。

「気に入らなかったらすぐやめられる」という安心感は、新しいツールを試すうえで地味に一番大事な要素だと思います。

② 多くの操作を元に戻せる「jj undo」

Gitを使っていて怖いのは、git reset --hardや強引なリベースによって、大事な変更を消してしまうことです。私も一度、未コミットのコードを丸ごと消してしまい、絶望した経験があります。

Jujutsuでは、コミットの作成や履歴の編集、ブックマークの移動といったローカルリポジトリの変更が「オペレーションログ」として記録されます。これらの多くの操作は、jj undoを実行することで直前の状態へ戻せます。

jj undo

ただし、jj undoは、あらゆる変更を元に戻せる万能なロールバック機能ではありません。

たとえば、すでにリモートへプッシュした変更は、jj undoを実行してもリモート側から自動的に取り消されるわけではありません。また、エディタで行った一文字ごとの編集操作が、個別のオペレーションとして記録されているわけでもありません。

そのため、「何をやっても戻せる」というより、コミット作成や履歴操作など、ローカルリポジトリに対する多くの操作を直前の状態へ戻しやすい機能と捉えるのが正確です。

それでも、複雑な履歴操作をしたあとに、jj undoで一つ前の状態へ戻れる安心感は大きいと感じました。Git初心者だった頃の自分に教えてあげたい機能の一つです。

③ ステージングもスタッシュも、もういらない

git addやgit stashって、地味に脳のメモリを消費しますよね。今どのファイルがステージ済みで、スタッシュに何を退避させたか忘れて混乱した経験がある人は少なくないはずです。

Jujutsuでは「ワーキングコピー自体が常にコミット」という考え方を採用しているので、ファイルを編集した瞬間からその変更は自動的に記録され続けます。別の作業に移りたければjj newで新しいコミットを作るだけ。スタッシュという概念自体が存在しません。

4. Gitとの対応表を作ってみた

整理する意味も込めて、Gitのコマンドや概念がJujutsuでどう対応するのか表にまとめてみました。

整理する意味も込めて、Gitのコマンドや概念がJujutsuでどう対応するのか表にまとめてみました。

操作 Git Jujutsu
リポジトリを作成する git init jj git init
既存のGitリポジトリでJujutsuを使い始める ー jj git init
リポジトリをクローンする git clone <url> jj git clone <url>
状態を確認する git status jj status
差分を確認する git diff HEAD jj diff
コミットメッセージを設定する git commit --amendなど jj describe -m "メッセージ"
新しい作業用コミットを作る ー jj new
変更をコミットして次の作業へ進む git commit jj commit
現在の変更を親コミットへ統合する git commit --amendやgit rebase -iなど jj squash
過去のコミットを直接編集する git rebase -iなど jj edit <change_id>
ファイルの変更を差し戻す git restore <file> jj restore <file>
コミットを履歴から取り除く git rebase -iなど jj abandon <change_id>
リモートへプッシュする git push jj git push

もちろん設計思想が根本から異なるので、すべてが1対1で綺麗に重なるわけではありません。特に、Gitの感覚でjj newを叩くと「あれ?」となるかもしれません。

Jujutsuにおけるjj newは、新しい「ワーキングコピー・コミット」を生成して、そこへ自分の立ち位置を移すためのコマンドです。

jj new

対して、今やっている作業を一つの区切りとして固め、さらにその上に新しい作業場を作りたいなら、jj commitを使います。こちらの方が、従来のgit commitに近い使い心地と言えるでしょう。

jj commit -m "ログイン機能を追加"

また、歴史を遡って過去の地点を直したいときは、Change IDを直接指定して飛び込みます。

jj edit <change_id>

このjj editを実行すると、指定した過去のコミットがそのまま編集中の作業場になります。ここでコードをいじれば、そのまま対象のコミットに修正が吸い込まれていく仕組みです。

jj edit <change_id>

# ファイルを修正する
jj diff

このフローなら、修正が終わった後にわざわざ「統合」の操作をする必要もありません。

逆に「一旦新しいコミットとして修正を作り、後から親に混ぜたい」という場合は、jj squashが活躍します。

jj new <change_id>

# ファイルを修正する
jj diff

# 現在の変更を親コミットへ統合する
jj squash

個人的に「なるほど!」と膝を打ったのは、Gitでいうブランチが「ブックマーク」と名付けられている点です。

Gitではブランチ名がないと作業しづらいですが、JujutsuはChange IDでどこへでもアクセスできるので、ローカル作業で無理に名前を付ける必要がありません。ブックマークはあくまで、GitHubなどのリモートへ公開するための「外部向けラベル」という位置づけなんです。この設計思想の違いに触れるだけでも、Gitの常識が良い意味で崩される感覚があって面白いですね。

5. 実際に試してみる(30秒で始まる、らしい)

せっかくしらべたので使ってみようと思ったので、手順もメモしておきます。

インストール

# macOS (Homebrew)
brew install jj

# Windows (WinGet)
winget install jj-vcs.jj

# 確認
jj --version

ユーザー情報も登録します。Gitの設定とは別管理です。

jj config set --user user.name "Your Name"
jj config set --user user.email "your@email.com"

既存プロジェクトへの導入(共存モード)

普段使っているGitプロジェクトのディレクトリで、これを打つだけです。

cd ~/projects/my-git-project
jj git init ```

これで`.jj`というメタデータ領域が作られ、既存のGit履歴が自動で取り込まれます。

### 日常の流れ

```bash
# 最新のmainから新しい作業を開始
jj new main@origin

# 変更確認(addは不要)
jj status
jj diff

# 作業内容を記録
jj describe -m "ログインフォームのUI実装"

# 次のタスクへ(スタッシュ不要)
jj new

レビュー対応もシンプルです。

# 修正対象のコミットへ直接移動
jj edit <change_id>

# 修正して、既存コミットに統合
jj squash

# プッシュ(履歴の書き換えも自動で追従)
jj git push --bookmark feat/login

コマンドを並べてみると、Gitでの「あれ、今どの状態だっけ」という迷いがそもそも発生しない設計になっていることがよく分かります。

6. 気になったところ

いいことばかりかなと思ったのですが、調べていて引っかかった点も書いておきます。

  • 情報がまだ少ない:v1.0未満のプレリリース段階ということもあり、日本語記事はもちろん英語の情報もGitに比べると圧倒的に少ないです。ChatGPTやGeminiに聞いても、存在しないオプションを堂々と教えてくることがあるらしく、公式ドキュメントを直接読む必要があります^^;

  • Git LFSやサブモジュールに未対応:大容量バイナリを扱うプロジェクトや、サブモジュール構成のリポジトリでは、そのまま使うのは難しそうです。

  • Gitフックが動かない:pre-commitフックなどはJujutsu単体の操作では発火しないため、CI側での対策が必要になります。

  • IDE連携はまだ発展途上:VS Code拡張などはコミュニティベースで開発が進んでいますが、Git向けの成熟したGUIツールと比べるとまだ発展途上という印象です。

このあたりは、「個人のローカル環境で試す分には気にならないけど、チーム全体への本格導入はもう少し様子見でよさそう」という結論のなりました。

おわりに

雑誌の見出しを見たときは、「次世代とかいうツールがまた出てきたか」くらいの気持ちでした。ただ実際、調べてみるとjj undoやChange IDの仕組みなど、確かに技術として新しく面白いことが詰め込まれています。

でも一通り調べ終えて一番印象に残ったのは、そういう派手な新機能ではありませんでした。むしろ心に残ったのは、真逆の、すごく地味なところです。

コロケーションモードのおかげで、何も失う心配もなく、今日この瞬間から一人でこっそり試せる。この「気軽さ」こそが、Jujutsuという技術の本当の価値なんじゃないかと思います。

新しい技術というと、覚えることが多くて身構えてしまいがちです。ところがJujutsuは、覚えることを増やす前に、まず「怖がらなくていい」という安心感があります。

というわけで、お盆も近いので、手元の個人プロジェクトでコロケーションモードを試してみようと思います。

採用拡大中!

アシストエンジニアリングでは一緒に働くフロントエンド、バックエンドのエンジニア仲間を大募集しています!
少しでも興味ある方は、カジュアル面談からでもぜひお気軽にお話ししましょう!
お問い合わせはこちらから↓
https://official.assisteng.co.jp/contact/

7. 参考にしたリソース

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?