I went down some dead ends trying this, but it was pretty easy in the end. Here’s how I did it, because my search keywords didn’t turn up what I was looking for first.
I have two repositories, AAA and BBB, and I want them to end up looking like below. Also, I don’t want to keep using the old repositories, but I do most definitely want to see the full history of each file.
Or something along those lines anyway. I chose AAA to be the new final parent, so I started by moving all the original AAA files down a level. This was straightforward
git mv x y z aaa-oldAAA
I then did the same thing in the BBB repository.
Now, the fun, adding the other repository as a remote in this repository.
git remote add bbb-upstream /full/path/to/old/BBB
git fetch bbb-upstream
git checkout -b bbb-u-branch bbb-upstream/master
This is pretty neat. Right here, you’re only looking at the code from the BBB repository! If you
git checkout master again, you’re back looking at your AAA/aaa-oldAAA repository. This makes sense when you think about it, nothing says that branches have to have the same or even related code in them.
Now, we just merge the
bbb-u-branch into our local master!
git checkout master
git merge bbb-u-branch
git remote rm bbb-upstream # no longer needed
Presto! Finito! The only problem I had was a merge conflict in the .gitignore files.
Note: to see the logs of files that have been moved, you need to use
git log --follow filename.blah This has nothing to do with the dual merge however.