Jujutsu (jj) を使いこなす:Git よりも安全でスマートな次世代バージョン管理システム

Git tutorial - IT technology blog
Git tutorial - IT technology blog

なぜ私は Git への絶対的な忠誠を捨て、Jujutsu を選んだのか?

こんな状況を想像してみてください。深夜 2 時、深刻なロジックバグを修正している最中、焦りから commit する前に誤って git reset –hard を実行してしまいました。Git の場合、git add でインデックスに登録していなければ、4 時間に及ぶコードの格闘が一瞬で消え去る可能性があります。これは絶望的な瞬間です。

その事件の後、私は Git が時として厳格すぎ、操作ミスによるデータ紛失のリスクがあることに気づきました。ミスを許容し、簡単にやり直しができる、より寛容なツールが必要でした。それが私が Jujutsu (jj) に移行した理由です。

Jujutsu は、Git の基盤上で動作する次世代のバージョン管理システム (VCS) です。既存のリポジトリをそのまま使い、GitHub にコードを push して同僚と共有することもできますが、個人の開発体験は格段にスムーズになります。8 人のチームで 3 ヶ月間自分のワークフローに導入した結果、コマンドの打ち間違いによるコードの復旧に時間を費やすことはほぼなくなりました。

開発を「楽にする」実用的な改善点

  • Staging Area からの解放: もう git add は必要ありません。作業ディレクトリ内のすべての変更は、常に進行中の commit として自動的に扱われます。
  • Operations Log (Ops Log) システム: 入力したすべてのコマンドの履歴が保存されます。誤ってブランチを削除したり、rebase に失敗したりしましたか? jj op undo を実行するだけです。Git 履歴全体の「Ctrl+Z」ボタンのように機能します。
  • コンフリクトが障害にならない: Git ではコンフリクトが発生すると解決するまで作業が止まります。Jujutsu では、コンフリクトした状態のまま commit したり、チームに push したり、後で解決するために放置したりしてもワークフローが止まることはありません。

1 分でできる Jujutsu のインストール

Rust で書かれた Jujutsu は非常に高速です。OS に応じて Cargo や一般的なパッケージマネージャー経由で素早くインストールできます。

# Rust/Cargo の場合
cargo install --locked --bin jj jujutsu

# macOS (Homebrew)
brew install jj

# Windows (Scoop)
scoop install jj

jj --version コマンドでインストールを確認します。バージョンが表示されれば、Git の「detached HEAD」のような煩わしさにお別れする準備は完了です。

開発を始めるための設定

従来の .gitconfig とは異なり、Jujutsu はモダンな TOML 形式を使用します。設定ファイル(Linux/macOS では通常 ~/.config/jj/config.toml)に個人情報を記述する必要があります。

[user]
name = "あなたの名前"
email = "[email protected]"

[ui]
# commit メッセージを書くエディタを選択
default-editor = "nvim" 

既存の Git プロジェクトと並行して使用する

プロジェクト全体を新しい形式に変換する必要はありません。Jujutsu は現在の Git ディレクトリ上で並行して動作させることができます。

# Git プロジェクトのディレクトリに移動
jj git init --colocated

--colocated パラメータは非常に便利です。これにより、git コマンドと jj コマンドを交互に使用できるようになります。jj 側でのすべての変更は、背後にある .git ディレクトリに自動的に同期されます。

実践ワークフロー:すべての操作を自動化する

main.py を編集すると、Jujutsu は自動的に「working-copy commit」を作成します。一時的な保存のために add や commit コマンドを何度も入力する必要はありません。

# 直感的なツリー図を表示
jj log

画面には非常に分かりやすいツリー図が表示されます。現在の commit は @ 記号でマークされます。タスクが完了したら、それを「確定」させるだけです。

# commit を確定して新しいタスクを作成
jj commit -m "深夜 2 時、ロジックバグを修正"

コンフリクト処理:柔軟かつ能動的に

これは、複雑なブランチのマージで毎回 15〜20 分ほど節約できる機能です。すぐに修正を強いるのではなく、Jujutsu はコンフリクトの状態を直接 commit に保存します。

# 衝突している 2 つのブランチをマージ
jj merge branch-a branch-b

# ステータスを確認
jj status

# コンフリクトしたファイルのまま commit してコーヒーを飲みに行き、
# リポジトリが壊れる心配をせずに後で戻って修正することができます。

Operations Log による無限の復元力

これこそが真の「救命浮輪」です。rebase、merge、abandon など、リポジトリの構造を変更するすべての操作が詳細に記録されます。

# 実行したばかりのアクションを確認
jj op log

結果は透明に表示されます:

@  q7w8e9r0 (2023-10-27 02:15:00) commit
│  args: jj commit -m "データベーススキーマを更新"
◉  a1b2c3d4 (2023-10-27 02:10:00) rebase
│  args: jj rebase -s dev -d main

午前 2 時 10 分に行った rebase が間違いだったと気づいたら、コマンドひとつで時間を巻き戻せます:

jj op undo a1b2c3d4

リポジトリ全体が、そのコマンドを実行する前の完璧な状態に戻ります。複雑な git reflog を調べたり、commit ハッシュを紛失する心配もありません。

プロフェッショナルなワークフローへのアドバイス

Jujutsu は非常に強力ですが、リモートへのコード送信には jj git push を使用することをお勧めします。同僚は通常通り標準的な Git commit を受け取ります。彼らはあなたが別のツールを使っていることなど知る由もなく、ただあなたの commit 履歴が常に綺麗でミスが少ないことに気づくでしょう。

もしあなたが git stash に疲れ果てていたり、マージコンフリクトに怯えていたりするなら、今すぐ Jujutsu をインストールしてみてください。これは単なる新しいツールではなく、より安心して、プレッシャーを感じずに仕事をするための方法なのです。

Share: