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
jj log --allto see all commits including from other remotes - The root commit (empty) is always shared between all chains
jj abandonremoves commits without affecting working copy- After cleanup, run
jj git pushto update remotes if needed