Zwei git-Repositories zusammenführen

Aus zwei mach wieder eins (mit zwei Branches)

Ich hatte unlängst das Problem, zwei separate git-Repositories zu einem zusammenzuführen. git hat per se kein Problem damit, in unterschiedlichen Branches vollkommen unterschiedlichen Inhalt zu verwalten (ein Beispiel, wo das häufig genutzt wird, ist der gh-pages-Branch bei github), aber ich wollte etwas anderes: Beide Repositories hatten eine gemeinsame Codebasis, und ich wollte nun ein Repository, das an der spätestmöglichen Stelle einen Branch mit den Änderungen des anderen Repositories abzweigt.

git wäre nicht git, wenn es nicht auch hierfür eine Lösung gäbe ;-) Ausgangsbasis sei das „Hauptrepository“, in dem der Branch mit den Änderungen des anderen Repositorys angelegt werden soll. Zunächst müssen dessen Daten geholt werden:

git remote add otherrepo http://other.repo.url
git fetch otherrepo

Nun muß man den letzten gemeinsamen Commit finden (im Beispiel hier geht es bei beiden Repositories um den master-Branch). Glücklicherweise unterstützt einen git auch hier:

git merge-base master otherrepo/master

Der Befehl liefert die Commit-ID des letzten gemeinsamen Commits. Hier wird nun der Branch angelegt und darin das Repository des anderen Repos hineingemerget (geschieht bei Standardeinstellungen als fast-forward merge):

git checkout commitid
git checkout -b newbranch
git merge otherrepo/master

Voilà, das war’s schon :-)