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 pull→jj git fetch + jj rebase -b @ -o main
git switch -c feat→jj new main
git add -A && git commit -m→jj commit -m "..."
git push -u origin feat→jj git push --named feat=@-
git commit --amend→jj squash / jj describe
git switch other→jj new other / jj edit
git stash→jj new(戻るときは jj edit)
git rebase main→jj rebase -o main(止まらない)
git merge feat→jj new main feat
git cherry-pick X→jj duplicate X -o @
git reset --hard HEAD~→jj abandon
git revert X→jj revert -r X
git reflog→jj op log + jj op restore
git blame FILE→jj 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 事故防止