← サイトへ戻る A4 横1枚 · ブラウザの印刷で「PDFに保存」を選択
jj

Jujutsu (jj) チートシート

GitHub Flow を jj で乗りこなすための1枚もの早見表 jj v0.42 系準拠 · 非公式
https://tamada.github.io/jj-cheat-sheet/

3つの大原則

  • 編集中のファイル = @ という常在コミット。jj 実行時に自動スナップショット
  • git add(ステージング)は無い。変更はすべて @ に入る
  • すべての操作が jj undo で取り消せる。壊れたら undo

はじめる

  • jj git init --colocate新しくリポジトリを作る(.git も作る)
  • jj git clone --colocate URLGitHub からクローン
  • jj config set --user user.name "名前"最初の名前設定
  • jj config set --user user.email "you@ex.com"最初のメール設定

毎日の基本サイクル

  • jj st何が変わった?(git status)
  • jj diff差分の中身を見る
  • jj describe -m "説明"作業コピーに説明を付ける
  • jj new区切りをつけて次の作業へ
  • jj commit -m "説明"describe + new を一度に(git commit -am 相当)

よく使うコマンド

  • jj log履歴を見る(@ が今いる場所)
  • jj undo直前の操作を取り消す
  • jj restore pathそのファイルだけ親の状態に戻す
  • jj abandon今のコミットごと丸ごと捨てる
  • jj edit 過去のコミットに戻って直す(子孫は自動リベース)
  • jj op log操作の履歴(リポジトリのタイムマシン)

用語ミニ辞典

  • change ID(紫)= 変更の不変の名前。commit ID(青)= git のハッシュ
  • @ = 作業コピー / @- = 親 / @-- = 祖父母
  • bookmark = git のブランチ相当の付箋。コミットしても自動では動かない

GitHub Flow(pull は無い)

  • jj git fetch① リモートの最新を取得(作業コピーは動かない)
  • jj rebase -b @ -o main② 自分の作業を main の先端へ載せ替え
  • jj new main -m "feat: ..."ブランチを切る(名前は不要)
  • jj git push -c @-この変更を送る(bookmark 名は自動生成)
  • jj git push --named feat=@-名前を付けて bookmark 作成 + push
  • jj bookmark move feat --to @-push 前に bookmark を手で進める
  • jj git push動かした tracked bookmark を全部送る

bookmark 早見表

  • jj bookmark create feat -r @-@- に bookmark を貼る
  • jj bookmark track feat@originリモートの bookmark を追跡
  • jj bookmark list一覧(-a でリモート込み)
  • jj bookmark delete feat削除(push でリモートも消える)
  • jj bookmark forget featjj の管理から外すだけ

コンフリクトは「状態」

  • rebase は必ず成功し、競合はコミットに記録される。解消はいつでも好きなときに
  • jj log× 印がコンフリクトを含むコミット
  • jj resolveマーカーを直す/マージツール起動
  • jj squashnew した場合は解消結果を親へ(子孫も自動解消)
  • jj undorebase --abort 相当(中断の概念は不要)

履歴の編集

  • jj squash@ の内容を全部親へ溶かし込む
  • jj squash -i対話的に一部だけ
  • jj squash --into 親以外の任意のコミットへ
  • jj splitコミットを分割(git add -p の代わり)
  • jj describe -r -m "..."過去のメッセージだけ直す

revset(歴史へのクエリ)

  • x::y x..y経路 / git の x..y。 | & ~ で和・積・否定
  • trunk() mine()main(自動判定)/ 自分が author
  • bookmarks() conflicts()bookmark 付き / 競合を含む rev
  • jj log -r "trunk()..@"今の作業の「ブランチ全体」

履歴の外科手術

  • jj absorb各変更を「その行を最後に触ったコミット」へ自動 squash
  • jj rebase -r X -o YX だけを Y の上へ(子は繋ぎ直し)
  • jj rebase -s X -o YX とその子孫ごと
  • jj rebase -r X -A YY の後に挿入(-B で前)
  • jj parallelize X Y Z直列を兄弟化(独立PRへ)
  • jj diffedit -r XX の diff 自体を対話編集
  • jj evolog -r Xコミット自身の変遷を追う
  • jj op restore Xリポジトリ全体をその時点へ

スタック PR

  • 各段に bookmark を貼るだけ。下の段を直せば上の段は自動追従、push も一括
  • jj git push --named base=@-- --named main=@-各段に名前を付けて一括 push
  • jj git fetch; jj rebase -b @ -o main下がマージされたら上を main 直付けに

Git → jj 対応表

  • git pulljj git fetch + jj rebase -b @ -o main
  • git switch -c featjj new main
  • git add -A && git commit -mjj commit -m "..."
  • git push -u origin featjj git push --named feat=@-
  • git commit --amendjj squash / jj describe
  • git switch otherjj new other / jj edit
  • git stashjj new(戻るときは jj edit)
  • git rebase mainjj rebase -o main(止まらない)
  • git merge featjj new main feat
  • git cherry-pick Xjj duplicate X -o @
  • git reset --hard HEAD~jj abandon
  • git revert Xjj revert -r X
  • git reflogjj op log + jj op restore
  • git blame FILEjj file annotate FILE

設定レシピ(~/.config/jj/config.toml)

  • tug = ["bookmark","move","--from","closest_bookmark(@)","--to","@-"][aliases] 直近 bookmark を @- へ引っ張る
  • "closest_bookmark(to)" = "heads(::to & bookmarks())"[revset-aliases] tug 用
  • jj fixmutable な全コミットに formatter を適用
  • private-commits = "description(glob:\"wip:*\")"[git] WIP の push 事故防止
GitHub Flow を jj で乗りこなすための1枚もの早見表 · jj v0.42 系準拠 · 非公式