Git: Konflikte in Binärdateien auflösen

Aus Hergipedia
Zur Navigation springen Zur Suche springen


Scenario

Eine Datei mit Binärdaten (abs.bin) wurde in Repository A bearbeitet und commitet und zum Stammrepo gepusht. Anschließend wurde die gleiche Datei auf Rechner B bearbeitet.

Beim git push stellt man jetzt fest, dass es einen Konflikt gibt.

 Updating ....
 error: Entry xyz.bin not uptodate.

Lösung

 # Änderungen von Rechner B sichern:
 git commit -m "Sicherung der Konfliktdatei abc.bin" abc.bin
 
 # auf irgendeine Weise die Datei abc.bin in ein Textformat bringen:
 # als Beispiel nehmen wir an, es existiere ein Tool namens bin2txt, dann
 # bin2txt abc.bin abc.rechner_b.txt
 
 # Den Versionsstand des Stammrepos herstellen
 git checkout remotes/origin/master
 
 # abc.bin in ein Textformat bringen
 #   bin2txt abc.bin abc.stammrepo.txt
 
 # in einem recovery Zweig die Daten zusammenführen
 git checkout -b master_recovery
 
 # Änderungen anzeigen und einarbeiten 
 kdiff3 -o abc.combined.txt abc.rechner_b.txt abc.combined.txt
 
 # Textdatei wieder umwandeln in Binärdatei
 # txt2bin abc.combined.txt abc.bin
 
 # kombinierte Datei einchecken im master_recovery branch
 git commit -m "Daten aus Konflikt zusammenfuehren" abc.bin
 
 # den alten master Zweig durch den master_recovery-Zweig ersetzen
 git branch -M master_recovery master
 git checkout master
 
 # jetzt haben wir wieder eine lineare history
 git push


einfachere Alternative

Wenn wir einfach nur eine Version behalten wollen, hier als Beispiel die in Rechner B. Achtung: dies verwirft sämtliche sonstigen Änderungen, die bisher auf Rechner B nach Divergenz vom Stammrepo getätigt wurden.

 mv abc.bin abc.new.bin
 git checkout remotes/origin/master
 git checkout -b master_recovery
 mv abc.new.bin abc.bin
 git commit -m "abc.bin von Rechner B" abc.bin
 git branch -M master_recovery master
 git push