using-jj について
jjの利用方法を扱うワークフロースキルで、変更の説明、匿名変更、分割、squash、履歴の復旧、GitHubのプルリクエスト手順を解説します。コマンド例と、リビジョンやブックマークで起きやすい問題への注意も含みます。
主な機能
- 01jjの変更説明の指針
- 02分割・squash・編集・吸収の手順
- 03ブックマークとpushの案内
- 04GitHubプルリクエストの手順
- 05操作履歴と変更履歴の復旧
- 06Revsetコマンド例
活用シーン
- 01jjの変更に作業を整理
- 02変更スタック内で修正を適用
- 03変更をpushしてGitHubプルリクエストを作成
- 04リポジトリの以前の状態を復旧
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ trevors/ dot-claude --skill using-jjインストール後、Claude Code で/using-jjを入力して読み込まれたか確認します。
同梱ファイルevals/trigger-eval.jsonREFERENCE.md
詳細
jj ワークフロー
一覧表、Git での相当機能、トラブルシューティング、revset のチートシートについては、REFERENCE.md を参照してください。
スタイルガイド
- 説明は必須です。 作業コピーを「(no description set)」のままにしないでください。
- ブックマークは GitHub のためのものであり、あなたのためのものではありません。 匿名変更を使い、プッシュするときにのみブックマークを追加してください。
- 手動で squash 先を指定するのではなく、
absorbを使ってください。 jj に、各ハンクを適切な祖先へ振り分けさせましょう。
非対話型の分割
jj split にはファイルセットと -m の両方が必要です。
jj split -r <rev> -m "first part" path/a path/b # rest stays in the child commit
Evolog による指定
以前のバージョン:<change-id>/0(最新)、/1(その前)。jj restore --from xyz/1 --into xyz で以前の状態に戻せます。
ワークフロー
Squash(推奨)
jj describe -m "feat: what I'm building"
jj new -m "wip"
# ... make changes ...
jj squash -m "feat: done"
Edit(スタック途中の修正)
jj edit <change-id>
# ... fix ...
jj new -m "back to work" # descendants auto-rebased
Absorb
@ から jj absorb を実行すると、各ハンクは、その行が最後に変更された祖先へ振り分けられます。
ブックマークとプッシュ
ブックマークは自動では先へ進みません。明示的に移動してください。実際に作業内容を保持しているリビジョンを対象にしてください。 これは直前に使ったフローによって異なります。
jj bookmark set <name> -r @- # after `jj squash`/`jj commit`: @ is a fresh empty change
jj bookmark set <name> -r @ # after `jj describe -m` alone: @ IS the work
jj git push
間違えても何も通知されません。作業内容が @ にあるときに @- をプッシュすると、前のコミットが公開されます。
レビュー済み PR の履歴を書き換えない
デフォルト(安全 — コメントのアンカーを保持します):
jj new feature-x -m "fixup: address feedback"
# ... make changes ...
jj bookmark set feature-x -r @
jj git push
jj new feature-x(末尾に - を付けない)は、ブックマークの上に修正を積み重ねます。
feature-x- は feature-x の親を表す revset なので、レビュー済みコミットから兄弟を分岐させることになります。その後 bookmark set -r @- を実行するとブックマークが後戻りし、レビュー担当者がコメントを付けたコミットそのものが外れてしまいます。
PR の作成(jj + gh)
jj と Git を併用するリポジトリでは、git HEAD は detached 状態のため、gh pr create は「not on any branch」というエラーで失敗します。必ず --head <bookmark> を指定してください。 git の自動検出に頼らないでください。
jj bookmark set feature-x -r @- # or -r @ — see "Bookmarks & pushing" above
jj git push
gh pr create --head feature-x --title "..." --body "..."
復旧
jj op log の後に jj op restore <id> を実行します。jj evolog -r <change-id> で、1 つの変更の履歴を確認できます。詳しくは REFERENCE.md の該当箇所を参照してください。
不変コミット
プッシュ済みコミットは immutable_heads() によって保護されています。プッシュ済みコミットに修正を取り込むには、承認されている方法である jj squash --into <id> --ignore-immutable を使ってください。ただし、レビュー済み PR では引き続き rules/pr-safety.md のルールが適用されます。
Revset
jj log -r 'trunk()..@' # everything between main and here
jj log -r '::@ & ~::trunk()' # my branch only
jj log -r 'mine()' # my commits
jj log -r 'author(substring:"trevor")' # bare strings in author()/description() are whole-string globs; say substring: for partial