In einem Projekt wird ein Git-Repository auf einen anderen Server umgezogen, indem das gesamte Verzeichnis kopiert wird. Das alte Repository ist weiterhin erreichbar, soll aber nicht verwendet werden. Nun haben nicht alle Entwickler ihre Remotes rechtzeitig angepasst und haben ihren letzten Code versehentlich in das alte Repository hochgeladen.
Da jedoch bereits andere Entwickler auch in das neue Repository Änderungen hochgeladen haben, kann das alte Repository nicht einfach erneut herüber kopiert werden.
Um beide Repositories zu synchronisieren, kann die Eigenschaft ausgenutzt werden, dass es sich bei Git um ein verteiltes Source-Code-Managment handelt [1].
Im Folgenden wird zur Vereinfachung das alte Repository R1 und das Neue R2 genannt. Es wird davon ausgegangen, dass die Entwickler nur Änderungen auf einem Branch getätigt haben. Ansonsten müsste man Schritte 4-6 für alle Branches durchführen.
Zunächst wird R2 geklont und in das Arbeitsverzeichnis gewechselt:
1. git clone https://url/to/R2.git
2. cd R2
Nun wird ein Remote „oldrepo" zum alten Repository R2 hinzugefügt:
3. git remote add oldrepo https://url/to/R1.git
Der betroffene Branch wird ausgewählt:
4. git checkout master
Die versehentlich auf R1 hochgeladenen Änderungen werden geladen:
5. git fetch oldrepo
Anschließend werden die Commits aus R1 und R2 mit git merge zusammengefasst:
6. git merge oldrepo/master
Letztendlich werden die zusammengefassten Commits auf beide Remotes hochgeladen (push):
7. git push origin
8. git push oldrepo
Der Branch master ist nun auf beiden Repositories R1 und R2 auf demselben Stand.
Anstatt eines Merges könnte man auch über einen Rebase beide master synchronisieren. Hiervon ist jedoch abzuraten, da es durch das Umschreiben der Historie zu Konflikten kommen kann, falls mehrere Entwickler auf einem Branch tätig sind. Ohnehin wäre der Vorteil nur kosmetischer Natur.
Verwendete Software: git 2.6.2, git-bash
Seminar zum Thema
Continuous Integration (CI) Workshop
ORDIX news - Artikel zum Thema
Git-Kommandos für Fortgeschrittene: Hinterm Horizont geht´s weiter