Beheben eines Git Konflikt mit binären Dateien
-
07-07-2019 - |
Frage
Ich habe Git auf Windows (msysgit) wurden unter Verwendung von Änderungen für einige Design-Arbeit zu verfolgen, ich habe zu tun.
Heute habe ich an einem anderen PC arbeiten (mit Remote-Repo brian
) und ich versuche jetzt die Änderungen heute auf meinem Laptop zurück in meine normale lokale Version fertig zu fusionieren.
Auf meinem Laptop habe ich git pull brian master
verwendet, um die Änderungen in meiner lokale Version zu ziehen. Alles war gut, abgesehen von dem Haupt-InDesign-Dokument -. Dies zeigt als Konflikt
Die Version auf dem PC (brian
) ist die neueste, die ich behalten wollen, aber ich weiß nicht, welche Befehle die repo sagt, diese zu verwenden.
Ich habe versucht, das Kopieren Sie die Datei direkt über auf meinem Laptop, aber dies scheint die ganze Mergeprozesses zu brechen.
Kann jemand mich in die richtige Richtung?
Lösung
git checkout
akzeptiert eine --ours
oder --theirs
Option für Fälle wie diesen. Also, wenn Sie einen Merge-Konflikt haben, und Sie wissen, dass Sie nur die Datei aus der Branche wollen Sie wachsen zusammen in, können Sie tun:
$ git checkout --theirs -- path/to/conflicted-file.txt
, dass die Version der Datei zu verwenden. Ebenso, wenn Sie wissen, dass Sie Ihre Version wollen (nicht das fusionierte wird) können Sie
$ git checkout --ours -- path/to/conflicted-file.txt
Andere Tipps
Sie haben den Konflikt manuell lösen (Kopieren die Datei über) und dann die Datei begehen (egal ob es über kopiert oder verwendet, um die lokale Version) wie folgt
git commit -a -m "Fix merge conflict in test.foo"
Git autocommits normalerweise nach dem Zusammenführen, aber wenn es Konflikte erkennt es nicht von selbst lösen kann, gilt es alle Patches es herausgefunden und lässt den Rest für Sie manuell lösen und zu begehen. Die Git Merge Man Seite , die Git-SVN Crash Course oder
Sie können auch dieses Problem lösen mit , die bewirkt, dass Natürlich kann man nicht sinnvoll Binärdateien Dateien in einem Texteditor bearbeiten. Stattdessen kopieren Sie die neue Datei git mergetool
git
lokale Kopien des Konflikt binär erstellen und laichen Standard-Editor auf sie:
{conflicted}.HEAD
{conflicted}
{conflicted}.REMOTE
{conflicted}.REMOTE
über {conflicted}
ohne den Editor zu schließen. Dann, wenn Sie den Editor git
schließen tun werden sehen, dass die undecorated Arbeitskopie geändert wurde und Ihre merge Konflikt wird auf die übliche Art und Weise gelöst werden.
beheben, indem Sie die Version in Ihrem aktuellen Zweig zu halten (die Version aus dem Zweig ignorieren Sie verschmelzen), fügen Sie einfach und begehen Sie die Datei:
git commit -a
durch Überschreiben der Version in Ihrem aktuellen Zweig mit der Version aus dem Zweig beheben Sie verschmelzen in, müssen Sie diese Version in Ihr Arbeitsverzeichnis abzurufen zuerst, und dann fügen Sie / commit es:
git checkout otherbranch theconflictedfile
git commit -a
mipadi Antwort nicht ganz Arbeit für mich getan hat, musste ich dies tun:
git Kasse --ours path / to / file.bin
oder, um die Version zu behalten werden fusioniert:
git Kasse --theirs path / to / file.bin
dann
git add path / to / file.bin
Und dann konnte ich tun „git mergetool“ wieder und weiter auf den nächsten Konflikt.
Von der git checkout
docs
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>...
--ours
--theirs
Wenn Pfade aus dem Index Check-out, Check-out Phase # 2 (ours
) oder # 3 (theirs
) für unmerged Wege.Der Index kann unmerged Einträge enthalten wegen einer früheren gescheiterten verschmelzen. Standardmäßig, wenn Sie versuchen, einen Eintrag so aus dem Index zu überprüfen, wird die Kasse Vorgang fehlschlagen und nichts wird ausgecheckt werden. Mit
-f
ignoriert diese unmerged Einträge. Der Inhalt von einer bestimmten Seite des merge kann durch Verwendung--ours
oder--theirs
aus dem Index überprüft werden. Mit-m
, an die Arbeitsbaum-Datei vorgenommenen Änderungen können das ursprüngliche Konflikt merge Ergebnis neu erstellen verworfen werden.
Dieses Verfahren ist Binärdatei, Konflikte zu lösen, nachdem Sie eine Pull-Anforderung auf Github Erklärungen abgegeben haben:
- Also auf Github, gefunden Sie Ihre Pull-Anforderung einen Konflikt auf einer Binärdatei hat.
- Geben Sie nun auf den gleichen git Zweig auf dem lokalen Computer zurück.
- Sie (a) re-make / Re-build wieder diese Binärdatei, und (b) verpflichten, die zur Folge Binärdatei gleichen git Zweig.
- Dann drücken Sie das gleiche git branch wieder Github.
Auf Github, auf dem Pull-Anforderung sollte der Konflikt verschwinden.
ich auf ein ähnliches Problem kam (wollen ziehen eine Festschreibung, dass einige Binär-Dateien enthalten, die Konflikte verursacht, wenn fusionierte), aber über eine andere Lösung kam, die vollständig mit Git getan werden kann (dh mit nicht manuell Dateien über Kopieren zu) . Ich dachte, ich es hier enthalten würde so zumindest ich es das nächste Mal, wenn ich es brauche erinnern kann. :) Die Schritte wie folgt aussehen:
% git fetch
Dies holt die neueste (n) aus der Remote-Repository commit (Sie benötigen ein Remote-Zweignamen angeben, auf dem Setup abhängig), aber nicht versucht, sie zu verschmelzen. Es zeichnet die commit in FETCH_HEAD
% git checkout FETCH_HEAD stuff/to/update
Dies nimmt die Kopie der binären Dateien, die ich will und überschreibt, was mit der Version in der Arbeits Tree geholt von dem entfernten Zweig. git versucht keine Verschmelzung zu tun, so dass Sie nur mit einer exakten Kopie der Binärdatei von dem entfernten Zweig enden. Sobald das erledigt ist, können Sie die neue Kopie wie normale hinzufügen / begehen.
Ich habe für die Verwaltung von diff / merge von binären Dateien mit Git auf Windows über zwei Strategien kommen.
-
Tortoisegit können Sie diff konfigurieren / Merge-Tools für verschiedene Dateitypen auf der Grundlage ihrer Dateierweiterungen. Siehe 2.35.4.3. Diff / Merge Erweiterte Einstellungen http://tortoisegit.org/docs/tortoisegit/tgit- Einbaum settings.html . Diese Strategie natürlich relys auf geeignete Diff / Merge-Tool zur Verfügung steht.
-
Mit git Attribute Sie ein Tool / Befehl angeben können Ihre Binärdatei in Text und dann lassen Sie Ihr Standard-Diff / Merge-Tool zu tun, es ist Sache zu konvertieren. Siehe http://git-scm.com/book/it/ v2 / Customizing-Git-Git-Attribute . Der Artikel gibt auch ein Beispiel für die Verwendung von Metadaten zu diff Bildern.
Ich habe beiden Strategien mit binären Dateien von Softwaremodellen zu arbeiten, aber wir gingen mit Tortoisegit wie die Konfiguration war einfach.
Wenn das binäre ist etwas mehr als eine DLL oder etwas, das sein können bearbeitet direkt wie ein Bild oder eine Mischung Datei (und Sie müssen nicht in den Papierkorb / eine Datei oder das andere wählen) eine echte merge einige aussehen würde:
Ich schlage vor, für ein Diff-Tool, um orientierte suchen, was Sie binäre Datei, zum Beispiel gibt es einige kostenlosen Varianten für Bilddateien sind zum Beispiel
- npm installieren -g imagediff IIRC von https://github.com/uber/image-diff
- oder Python https://github.com/kaikuehne/mirror.git
- es gibt andere, da draußen
und vergleichen sie.
Wenn es kein Diff-Tool gibt es für Ihre Dateien zu vergleichen, dann, wenn Sie den Original-Generator der bin-Datei haben (das heißt, gibt es einen Editor für es ... wie Blender 3D, können Sie diese Dateien manuell überprüfen, auch die Protokolle und die andere Person fragen, was Sie sollten einschließen) und tun eine Ausgabe der Dateien mit https: // git -scm.com/book/es/v2/Git-Tools-Advanced-Merging#_manual_remerge
$ git show :1:hello.blend > hello.common.blend
$ git show :2:hello.blend > hello.ours.blend
$ git show :3:hello.blend > hello.theirs.blend
Ich verwende Git-Workflow für Excel - https: //www.xltrail. com / blog / git-Workflow-for-Excel Anwendung der meisten meiner binär-Dateien im Zusammenhang merge Probleme zu lösen. Diese Open-Source-App hilft mir, Probleme zu lösen produktiv ohne viel Zeit und lässt mich Kirsche die richtige Version der Datei ohne Verwirrung wählen.
mein Fall scheint ein Fehler .... mit git 2.21.0
ich einen Zug tat ... es beschwerten sich über binäre Dateien:
warning: Cannot merge binary files: <path>
Auto-merging <path>
CONFLICT (content): Merge conflict in <path>
Automatic merge failed; fix conflicts and then commit the result.
Und dann nichts in eine der Antworten hier führte in jeder Ausgabe, die keinen Sinn gemacht.
Wenn ich mir anschaue, welche Datei ich habe jetzt ... es ist die, die ich bearbeitet. Wenn ich entweder:
git checkout --theirs -- <path>
git checkout --ours -- <path>
Ich erhalte Ausgabe:
Updated 0 paths from the index
, und ich habe immer noch meine Version der Datei. Wenn ich rm und dann Kasse, es dauert 1 stattdessen sagen, aber es gibt immer noch mir meine Version der Datei.
git mergetool sagt
No files need merging
und git status sagt
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Eine Option ist, um rückgängig machen die commit ... aber ich hatte Pech und ich viele Commits hatte, und so schlimm war der erste. Ich möchte nicht, Zeit zu wiederholen, dass verschwenden.
so diesen Wahnsinn zu lösen:
Ich lief
git commit
, die verliert die Remote-Version, und wahrscheinlich verschwendet etwas Platz eine zusätzliche binäre Datei speichern ... dann
git checkout <commit where the remote version exists> <path>
das gibt mir die Remote-Version zurück
bearbeiten dann die Datei wieder ... und dann begehen und drücken, was wiederum bedeutet wahrscheinlich Raum der Binärdatei mit einer anderen Kopie zu verschwenden.