Zwei git-Repositories zusammenführen

Aus zwei mach wieder eins (mit zwei Branches)

Ich hatte un­längst das Pro­blem, zwei se­pa­ra­te git-Re­po­si­to­ries zu einem zu­sam­men­zu­füh­ren. git hat per se kein Pro­blem damit, in un­ter­schied­li­chen Bran­ches voll­kom­men un­ter­schied­li­chen In­halt zu ver­wal­ten (ein Bei­spiel, wo das häu­fig ge­nutzt wird, ist der gh-pa­ges-Branch bei git­hub), aber ich woll­te etwas an­de­res: Beide Re­po­si­to­ries hat­ten eine ge­mein­sa­me Co­de­ba­sis, und ich woll­te nun ein Re­po­si­to­ry, das an der spä­test­mög­li­chen Stel­le einen Branch mit den Än­de­run­gen des an­de­ren Re­po­si­to­ries ab­zweigt.

git wäre nicht git, wenn es nicht auch hier­für eine Lö­sung gäbe ;-) Aus­gangs­ba­sis sei das „Haupt­re­po­si­to­ry“, in dem der Branch mit den Än­de­run­gen des an­de­ren Re­po­si­to­rys an­ge­legt wer­den soll. Zu­nächst müs­sen des­sen Daten ge­holt wer­den:

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

Nun muß man den letz­ten ge­mein­sa­men Com­mit fin­den (im Bei­spiel hier geht es bei bei­den Re­po­si­to­ries um den mas­ter-Branch). Glück­li­cher­wei­se un­ter­stützt einen git auch hier:

git merge-base master otherrepo/master

Der Be­fehl lie­fert die Com­mit-ID des letz­ten ge­mein­sa­men Com­mits. Hier wird nun der Branch an­ge­legt und darin das Re­po­si­to­ry des an­de­ren Repos hin­ein­ge­mer­get (ge­schieht bei Stan­dard­ein­stel­lun­gen als fast-for­ward merge):

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

Voilà, das war’s schon :-)