Claude-skill-registry jj-merge-repos
Merges two separate Jujutsu (jj) repositories into one. Use when combining repos, rebasing one repo onto another, or recovering from diverged histories.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/jj-merge-repos" ~/.claude/skills/majiayu000-claude-skill-registry-jj-merge-repos && rm -rf "$T"
manifest:
skills/data/jj-merge-repos/SKILL.mdsource content
Merging JJ Repositories
Guide for merging two separate Jujutsu repositories into a single unified repo.
When to Use This Skill
- Combining two unrelated repositories into one
- Recovering from diverged histories (local vs remote rewrites)
- Splicing commit histories together
- Rebasing an entire repository onto another
How It Works
All JJ repos share a common empty root commit. When you add a remote from another repo and fetch, you get two diverging chains from that root. You can then:
- Delete one chain (if you just want the other repo's history)
- Rebase one chain onto the other (splice them together)
Quick Reference
Add and Fetch Another Repository
# Add the other repo as a remote jj git remote add other-repo <url-or-path> # Fetch all commits from it jj git fetch --remote other-repo
View Both Histories
After fetching, you'll see two separate commit chains:
jj log
Both chains start from the shared empty root commit.
Option 1: Keep Only One History
Delete the unwanted chain of commits:
# Abandon all commits from the old/unwanted branch jj abandon <commit-range>
Option 2: Splice Repositories Together
Rebase one repo's history onto the other:
# Move all commits from one chain atop the other jj rebase --source <root-of-chain-to-move> --destination <tip-of-other-chain>
Example: Recovering from Diverged Histories
When local and remote diverged due to history rewriting:
# Add the remote (source of truth) jj git remote add origin <url> # Fetch remote commits jj git fetch # You now have two chains from root # Delete the local chain you don't want jj abandon <local-commits> # Or rebase local work onto remote jj rebase --source <local-root> --destination <remote-tip>
Example: Combining Two Unrelated Projects
# Start in repo A cd repo-a # Add repo B as a remote jj git remote add repo-b /path/to/repo-b # Fetch repo B's history jj git fetch --remote repo-b # Rebase repo B's commits onto repo A's main jj rebase --source <repo-b-root> --destination main
Caveats
- Merge conflicts are likely when combining unrelated repos with overlapping files
- Resolve conflicts during the rebase as needed
- Consider whether you actually want the combined history or just the files
Tips
- Use
to see all commits including from other remotesjj log --all - The root commit (empty) is always shared between all chains
removes commits without affecting working copyjj abandon- After cleanup, run
to update remotes if neededjj git push