Auflösen eines Git-Konflikts mit Binärdateien

Ich habe Git unter Windows (msysgit) verwendet, um Änderungen für einige Entwurfsarbeiten zu verfolgen, die ich gemacht habe.

Heute arbeite ich an einem anderen PC (mit Remote Repo brian ) und ich versuche nun, die Änderungen, die heute gemacht wurden, wieder in meine normale lokale Version auf meinem Laptop zu bringen.

Auf meinem Laptop habe ich git pull brian master , um die Änderungen in meine lokale Version zu ziehen. Abgesehen vom Hauptdokument von InDesign war alles in Ordnung – das zeigt sich als Konflikt.

Die Version auf dem PC ( brian ) ist die letzte, die ich behalten möchte, aber ich weiß nicht, welche Befehle dem Repo befehlen, diese zu benutzen.

Ich habe versucht, die Datei direkt auf meinen Laptop zu kopieren, aber das scheint den gesamten Merge-process zu durchbrechen.

Kann mir jemand in die richtige Richtung zeigen?

git checkout akzeptiert für --ours --theirs Option --ours oder --theirs . Wenn Sie also einen Zusammenführungskonflikt haben und Sie wissen, dass Sie nur die Datei aus dem Zweig, in dem Sie zusammenführen, möchten, können Sie Folgendes tun:

 $ git checkout --theirs -- path/to/conflicted-file.txt 

um diese Version der Datei zu verwenden. Ebenso, wenn Sie wissen, dass Sie Ihre Version (nicht die, die zusammengeführt wird) verwenden können

 $ git checkout --ours -- path/to/conflicted-file.txt 

Sie müssen den Konflikt manuell lösen (Kopieren der Datei über) und dann die Datei (egal ob Sie sie kopiert oder die lokale Version verwendet haben) wie folgt festschreiben

 git commit -a -m "Fix merge conflict in test.foo" 

Git funktioniert normalerweise nach dem Zusammenführen autokommunizieren, aber wenn es Konflikte erkennt, kann es nicht von selbst lösen, es wendet alle Patches an, die es herausgefunden hat, und lässt den Rest für Sie, um manuell aufzulösen und festzulegen. Die Git Merge Man Page , der Git-SVN Crash-Kurs oder dieser Blog-Eintrag könnte ein wenig Licht in seine Arbeitsweise bringen.

Edit: Siehe den Post unten, du musst die Dateien nicht selbst kopieren, sondern benutzen

 git checkout --ours -- path/to/file.txt git checkout --theirs -- path/to/file.txt 

um die Version der gewünschten Datei auszuwählen. Das Kopieren / Bearbeiten der Datei ist nur notwendig, wenn Sie beide Versionen mischen möchten.

Bitte markieren Sie die Antwort von Mipadis als die richtige Antwort.

Sie können dieses Problem auch mit umgehen

 git mergetool 

was bewirkt, dass git lokale Kopien der konfliktbehafteten Binärdatei erstellt und auf ihnen den Standardeditor erzeugt:

  • {conflicted}.HEAD
  • {conflicted}
  • {conflicted}.REMOTE

Natürlich können Sie Binärdateien in einem Texteditor nicht sinnvoll bearbeiten. Stattdessen kopieren Sie die neue {conflicted}.REMOTE Datei über {conflicted} ohne den Editor zu schließen. Wenn Sie dann den Editor schließen, sieht git , dass die undekorierte Arbeitskopie geändert wurde und der Zusammenführungskonflikt auf die übliche Weise getriggers wird.

Um das Problem zu beheben, indem Sie die Version in Ihrem aktuellen Zweig beibehalten (ignorieren Sie die Version aus dem Zweig, in dem Sie zusammenführen), fügen Sie einfach die Datei hinzu und übernehmen Sie sie:

 git commit -a 

Um das Problem zu beheben, indem Sie die Version in Ihrem aktuellen Zweig mit der Version aus der Zweigstelle überschreiben, in der Sie sich zusammenschließen, müssen Sie diese Version zuerst in Ihr Arbeitsverzeichnis laden und dann hinzufügen / festschreiben:

 git checkout otherbranch theconflictedfile git commit -a 

Ausführlicher erklärt

Mipadis Antwort funktionierte nicht ganz für mich, ich musste das tun:

git checkout – Pfad / zu / Datei.bin

oder, um die Version beizubehalten:

git checkout –theirs Pfad / zu / Datei.bin

dann

Git hinzufügen Pfad / zu / file.bin

Und dann konnte ich wieder “git mergetool” machen und mit dem nächsten Konflikt fortfahren.

Aus den git checkout Dokumenten

git checkout [-f|--ours|--theirs|-m|--conflict=

--ours
--theirs
Wenn Sie Pfade aus dem Index auschecken, überprüfen Sie die Stufe # 2 ( ours ) oder # 3 ( theirs ) für nicht zusammengefasste Pfade.

Der Index enthält möglicherweise nicht zusammengeführte Einträge aufgrund einer fehlgeschlagenen vorherigen Zusammenführung. Wenn Sie versuchen, einen solchen Eintrag aus dem Index auszugeben, schlägt der Auscheckvorgang standardmäßig fehl, und es wird nichts ausgecheckt. Die Verwendung von -f ignoriert diese nicht zusammengefassten Einträge. Der Inhalt einer bestimmten Seite der Zusammenführung kann mithilfe von --ours oder - --theirs aus dem Index --theirs . Mit -m können Änderungen, die an der Arbeitsbaumdatei vorgenommen wurden, verworfen werden, um das ursprüngliche Konfliktzusammenführungsergebnis neu zu erstellen.

Ich stieß auf ein ähnliches Problem (wollte ein Commit machen, das einige Binärdateien enthielt, die beim Zusammenführen Konflikte verursachten), stieß aber auf eine andere Lösung, die komplett mit git ausgeführt werden konnte (dh Dateien nicht manuell kopieren). Ich dachte mir, ich würde es hier aufnehmen, damit ich mich wenigstens daran erinnern kann, wenn ich es das nächste Mal brauche. 🙂 Die Schritte sehen so aus:

 % git fetch 

Dadurch werden die neuesten Commits aus dem Remote-Repository abgerufen (abhängig von Ihrer Konfiguration müssen Sie möglicherweise einen Namen für die Remote-Verzweigung angeben), es wird jedoch nicht versucht, sie zusammenzuführen. Es zeichnet das Commit in FETCH_HEAD auf

 % git checkout FETCH_HEAD stuff/to/update 

Dies nimmt die Kopie der binären Dateien, die ich möchte, und überschreibt, was in dem Arbeitsbaum ist, mit der Version, die von der entfernten Verzweigung abgerufen wird. git versucht nicht, eine Zusammenführung durchzuführen, daher erhält man eine exakte Kopie der Binärdatei aus der entfernten Verzweigung. Sobald dies erledigt ist, können Sie die neue Kopie wie gewohnt hinzufügen / festschreiben.

Ich bin auf zwei Strategien zum Verwalten von Vergleichen / Zusammenführen von Binärdateien mit Git auf Windows gestoßen.

  1. Tortoise git können Sie Diff / Merge-Tools für verschiedene Dateitypen basierend auf ihren Dateierweiterungen konfigurieren. Siehe 2.35.4.3. Diff / Merge Erweiterte Einstellungen http://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html . Diese Strategie beruht natürlich auf der Verfügbarkeit geeigneter Diff / Merge-Tools.

  2. Mit git-Attributen können Sie ein Werkzeug / einen Befehl angeben, um Ihre Binärdatei in Text zu konvertieren und dann Ihr Standard-Diff / Merge-Tool zu verwenden. Siehe http://git-scm.com/book/it/v2/Customizing-Git-Git-Attributes . Der Artikel gibt sogar ein Beispiel für die Verwendung von Metadaten zu Diff-Bildern.

Ich habe beide Strategien, um mit binären Dateien von Software-Modellen zu arbeiten, aber wir gingen mit Tortoise Git, da die Konfiguration einfach war.

Wenn die Binärdatei etwas mehr ist als eine DLL oder etwas, das direkt wie ein Bild oder eine Mischdatei bearbeitet werden kann (und Sie nicht die eine oder die andere Datei löschen müssen), wäre eine echte Zusammenführung etwas wie:

Ich schlage vor, nach einem Diff-Tool zu suchen, das auf die binäre Datei ausgerichtet ist, zum Beispiel gibt es einige freie für Bilddateien

und vergleiche sie.

Wenn es kein Vergleichswerkzeug zum Vergleichen Ihrer Dateien gibt, wenn Sie den originalen Generator der Bin-Datei haben (d. H. Es gibt einen Editor dafür … wie Blender 3d, können Sie diese Dateien dann auch manuell inspizieren Sehen Sie sich die Logs an und fragen Sie die andere Person, was Sie beinhalten sollten) und führen Sie eine Ausgabe der Dateien mit https://git-scm.com/book/es/v2/Git-Tools-Advanced-Merging#_manual_remerge durch

$ git show :1:hello.blend > hello.common.blend $ git show :2:hello.blend > hello.ours.blend $ git show :3:hello.blend > hello.theirs.blend