Thursday, November 3, 2016

Git Merge Conflict Binäre Optionen

In dieser Anleitung wird gezeigt, wie Sie einige gemeinsame Konflikte über die Befehlszeile lösen können. Sie benötigen einen Texteditor, um einige der Konflikte zu lösen. Erstellen einer Kollision bearbeiten Dies ist die häufigste Art von Konflikten. Es geschieht, wenn zwei Zweige denselben Teil der gleichen Datei geändert haben und dann diese Zweige zusammengeführt werden. Wenn Sie z. B. eine Änderung an einer bestimmten Zeile in einer Datei vornehmen und Ihr Kollege, der in einem Repository arbeitet, eine Änderung an der exakt gleichen Zeile vornimmt, tritt ein Zusammenführungskonflikt auf. Git hat Schwierigkeiten zu verstehen, welche Änderung verwendet werden sollte, also bittet sie um Hilfe. Wenn dieser Konflikt auftritt, schreibt Git einen speziellen Block in die Datei, die den Inhalt beider Versionen enthält, in denen der Konflikt aufgetreten ist. Um diesen Zusammenführungsvorgang abzuschließen, verwenden Sie Ihren Texteditor, um den Konflikt aufzulösen, und fügen Sie die Datei hinzu, und legen Sie sie fest, um den Zusammenführungsvorgang abzuschließen. Für dieses Beispiel nehmen Sie an, dass Sie in Zweig-a arbeiten. Und haben einige Änderungen an einer Datei namens Planets. md vorgenommen. Unterdessen hat Ihr Freund auf der anderen Seite der Welt eine andere änderung zur gleichen Linie gebildet. Wenn Sie versuchen, Ihre Freunde Zweig in Ihre fusionieren, wird es einen Zusammenführungskonflikt. Running Git Status sagt Ihnen über den Konflikt: Beide von Ihnen haben Planets. md geändert. Wenn Sie die Datei in Ihrem Texteditor öffnen, sehen Sie beide Änderungen: In Zweig-a. Sie schrieb das Wort neun, aber Ihr Freund schrieb acht. Git fügt den betroffenen Bereichen automatisch Konfliktmarkierungen hinzu. Ein konfliktmarkierter Bereich beginnt mit ltltltltltltlt und endet mit gtgtgtgtgtgt. Diese werden auch als Konfliktmarker bezeichnet. Die beiden gegensätzlichen Blöcke selbst werden durch a getrennt. Hier haben Sie mehrere Möglichkeiten. Sie können entweder halten Sie Ihre Änderungen, nehmen Sie Ihre Freunde Änderungen, oder machen Sie eine neue Änderung. Was auch immer Sie tun, müssen Sie sicherstellen, um den Konflikt zu lösen, so dass die Datei Sinn macht, und jeder ist glücklich. In diesem Fall, youll setzen in eine ganz neue Version der Linie, die widerspiegelt, was passiert ist. Das Ziel ist, um die Datei zu sehen, genau, wie Sie es wollen. Youll löschen Sie die Konfliktmarken, und geben Sie einfach eine neue Änderung: Thats it Sie können jetzt git diese Datei hinzufügen, verpflichten die Änderung mit einer neuen Commit-Nachricht, und auf Ihrem Weg sein. Lösen eines entfernten Dateikonflikts Entfernte Dateikonflikte treten auf, wenn eine Person eine Datei bearbeitet, und eine andere Person löscht diese Datei in ihrem Zweig. Git weiß nicht, ob Sie die Datei mit den neuen Bearbeitungen beibehalten möchten, oder löschen Sie die Datei und vergessen Sie diese Bearbeitungen. In diesem Beispiel wird gezeigt, wie diese beiden Wege gelöst werden. Behalten der bearbeiteten Datei Zuerst lösen Sie den Konflikt, indem Sie die neuen Änderungen behalten. Angenommen, Sie haben eine Zeile zu Ihrer README. md in Zweig-b hinzugefügt. Aber jemand anderes hat die Datei vollständig in Zweig-c gelöscht. Git deklariert den folgenden Konflikt: Sie können dies beheben, indem Sie die Datei zurückschreiben und sie erneut festlegen: Auflösen durch Entfernen der Datei Jetzt lösen Sie diesen Konflikt auf die entgegengesetzte Weise: indem Sie die Datei gelöscht lassen. Wieder mit einem Zusammenführungskonflikt deklariert Git: Nun wollen Sie die Datei entfernen, also tun Sie das mit dem Befehl git rm: Schaut gut aus, also begehen Sie es mit der Standardnachricht: Ich benutze Git unter Windows (msysgit) zu verfolgen Änderungen für einige Design-Arbeit Ive getan haben. Heute habe ich auf einem anderen PC gearbeitet (mit Remote-Repo Brian) und Im jetzt versuchen, die Änderungen fertig zu machen heute wieder in meine regelmäßige lokale Version auf meinem Laptop. Auf meinem Laptop, Ive verwendet git ziehen brian master, um die Änderungen in meine lokale Version zu ziehen. Alles war in Ordnung, abgesehen von den wichtigsten InDesign Dokument - dies zeigt sich als Konflikt. Die Version auf dem PC (brian) ist die späteste, die ich behalten möchte, aber ich weiß nicht, welche Befehle dem repo sagt, um dieses zu verwenden. Ich versuchte direkt Kopieren der Datei über auf meinem Laptop, aber dies scheint zu brechen die ganze Merge-Prozess. Kann mir jemand zeigen, in die richtige Richtung Zitrax Haben Sie diff die Datei nach dem Ausführen git checkout --ours. Die Man-Seite schlägt (IMHO), dass checkout --ours / - ihre wird die Änderung von der quotboth geändert, müssen Mergequot-Liste entfernen und fügen Sie es in den Index, und ich denke, dass39s nicht richtig. Ich glaube, Sie müssen git fügen nach der Kasse laufen. Ndash Tim Keating Mai 13 13 at 21:06 Sie können auch dieses Problem, mit dem Ursachen git zu schaffen lokalen Kopien der konfliktierten Binär-und Spawn Ihre Standard-Editor auf sie: Offensichtlich können Sie nicht sinnvoll bearbeiten Binärdateien in einem Texteditor. Stattdessen kopieren Sie die neue. REMOTE-Datei, ohne den Editor zu schließen. Dann, wenn Sie schließen, wird der Editor git sehen, dass die ungeschützte Arbeitskopie wurde geändert und Ihr Merge-Konflikt in der üblichen Weise gelöst wird. Wenn die Dateien groß sind oder wenn Sie nicht die Möglichkeit haben, die Binärdatei in einem Texteditor zu öffnen, können Sie ctrlc an der Mergetool-Eingabeaufforderung (z. Dann können Sie sie ändern oder in einem externen Tool zusammenführen (nützlich für Binärdokument-Formate wie LibreOffice / OpenOffice / MSWord) und speichern das Ergebnis wieder in den ursprünglichen Dateinamen. Um git zu informieren, dass der Konflikt gelöst ist, fügt git den ursprünglichen Dateinamen hinzu, und Sie können dann das Merge-Commit beenden. Ndash Felix Aug 24 15 at 21:54 Um zu beheben, indem Sie die Version in Ihrem aktuellen Zweig (ignorieren Sie die Version aus dem Zweig, die Sie mischen), fügen Sie einfach hinzu und verpflichten die Datei: Um zu lösen, indem Sie die Version in Ihrem aktuellen Zweig mit überschreiben Die Version aus dem Zweig, die Sie zusammenführen, müssen Sie diese Version in Ihrem Arbeitsverzeichnis zuerst abrufen, und dann hinzufügen / Commit it: Ive stoßen zwei Strategien für die Verwaltung Diff / Merge von binären Dateien mit Git auf Windows. Mit Tortoise git können Sie Diff / Merge-Werkzeuge für verschiedene Dateitypen auf Basis ihrer Dateierweiterungen konfigurieren. Siehe 2.35.4.3. Diff / Merge Erweiterte Einstellungen tortoisegit. org/docs/tortoisegit/tgit-dug-settings. Diese Strategie stützt sich natürlich auf geeignete Diff / Merge-Tools. Mit Git-Attributen können Sie ein Werkzeug / Befehl, um Ihre Binärdatei in Text konvertieren und lassen Sie dann Ihre Standard-Diff / Merge-Tool seine Sache tun. Siehe git-scm / book / it / v2 / Customizing-Git-Git-Attribute. Der Artikel gibt sogar ein Beispiel für die Verwendung von Meta-Daten zu diff-Bildern. Ich habe beide Strategien, um mit binären Dateien von Software-Modellen arbeiten, aber wir gingen mit Schildkröte git als die Konfiguration war einfach. Wenn die binäre ist etwas mehr als eine DLL oder etwas, das direkt bearbeitet werden kann wie ein Bild, oder eine Blend-Datei (und Sie brauchen nicht zu trash / wählen Sie eine Datei oder die andere) eine echte Merge Wäre einige wie: Ich schlage vor, Suche nach einem Diff-Tool auf, was sind Sie binäre Datei orientiert, zum Beispiel gibt es einige freie für Bilddateien zum Beispiel und vergleichen Sie sie. Wenn es keine Diff-Tool da draußen für Ihre Dateien vergleichen, dann, wenn Sie den ursprünglichen Generator der bin-Datei haben (das heißt, gibt es einen Editor für it. Wie Blender 3d, können Sie dann manuell inspizieren diese Dateien, siehe auch die Logs, und fragen Sie die andere Person, was Sie sollten) und führen Sie eine Ausgabe der Dateien mit git-scm / book / es / v2 / Git-Tools-Advanced-Mergingmanualremerge git zeigen: 1: hello. blend gt hellomon. blend git Zeige: 2: hello. blend gt hello. ours. blend git show: 3: hello. blend gt hello. theirs. blend antwortete auf Ihre Antwort 2016 Stack Exchange, IncDESCRIPTION Liest die mitgelieferte Diff-Ausgabe (z Patch) und wendet sie auf Dateien an. Beim Ausführen von einem Unterverzeichnis in einem Repository werden gepatchte Pfade außerhalb des Verzeichnisses ignoriert. Mit der Option - index wird das Patch auch auf den Index angewendet, und mit der Option --cached wird das Patch nur auf den Index angewendet. Ohne diese Optionen verwendet der Befehl den Patch nur auf Dateien und erfordert nicht, dass sie sich in einem Git-Repository befinden. Dieser Befehl wendet das Patch an, erzeugt aber kein Commit. Verwenden Sie git-am1, um Commits von Patches zu erzeugen, die von git-format-patch1 generiert und / oder per E-Mail empfangen werden. OPTIONEN Die Dateien zum Lesen des Patches ab. - kann aus dem Standardeingang gelesen werden. Anstelle der Anwendung der Patch, Ausgang diffstat für die Eingabe. Schaltet aus. Ähnlich wie --stat. Zeigt aber die Anzahl der hinzugefügten und gelöschten Zeilen in dezimaler Notation und den Pfadnamen ohne Abkürzung an, um sie maschinenfreundlicher zu machen. Bei Binärdateien gibt es zwei Ausgänge - anstelle von 0 0. Ausschalten gelten. Anstatt das Patch anzuwenden, geben Sie eine zusammengefasste Zusammenfassung von Informationen aus git diff erweiterten Headern wie Kreationen, Umbenennungen und Modusänderungen aus. Schaltet aus. Anstatt den Patch anzuwenden, sehen Sie, ob das Patch auf den aktuellen Arbeitsbaum und / oder die Indexdatei anwendbar ist und erkennt Fehler. Schaltet aus. Wenn --check aktiviert ist, oder wenn Sie den Patch anwenden (was der Standard ist, wenn keine der Optionen deaktiviert ist), stellen Sie sicher, dass das Patch auf die aktuelle Indexdatei anwendbar ist. Wenn die zu aktualisierende Datei im Arbeitsbaum nicht aktuell ist, wird sie als Fehler markiert. Dieses Flag bewirkt auch, dass die Indexdatei aktualisiert wird. Wenden Sie einen Patch an, ohne den Arbeitsbaum zu berühren. Nehmen Sie stattdessen die zwischengespeicherten Daten, wenden Sie das Patch an und speichern Sie das Ergebnis im Index, ohne die Arbeitsstruktur zu verwenden. Dies impliziert --index. Wenn das Patch nicht ordnungsgemäß zutrifft, greifen Sie auf 3-Wege-Merge zurück, wenn das Patch die Identität von Blobs aufzeichnet, für die es gelten soll, und wir haben diese Blobs lokal verfügbar, wobei möglicherweise die Konfliktmarker in den Dateien im Arbeitsbaum liegen Für den Benutzer zu lösen. Diese Option impliziert die Option --index und ist mit den Optionen --reject und - cached nicht kompatibel. Neuere git diff-Ausgabe hat eingebettete Indexinformationen für jeden Blob, um die ursprüngliche Version zu identifizieren, auf die das Patch zutrifft. Wenn dieses Flag gegeben wird und wenn die ursprünglichen Versionen der Blobs lokal verfügbar sind, wird ein temporärer Index erstellt, der diese Blobs enthält. Wenn eine reine Modusänderung angetroffen wird (die keine Indexinformation hat), wird die Information stattdessen aus dem aktuellen Index gelesen. Wenden Sie das Patch in umgekehrter Reihenfolge an. Für die Atomität, git gelten standardmäßig scheitert das gesamte Patch und nicht berührt den Arbeitsbaum, wenn einige der Hunks nicht gelten. Diese Option macht es anwendbar, die Teile des Patches, die anwendbar sind, und lassen Sie die abgelehnten Hunks in entsprechenden. rej-Dateien. Wenn --numstat angegeben wurde, mischen Sie keine Pfadnamen, sondern verwenden Sie ein NUL-terminiertes maschinenlesbares Format. Ohne diese Option hat jede Pfadname-Ausgabe TAB, LF, doppelte Anführungszeichen und Backslash-Zeichen, die durch t ersetzt werden. N ist. . und . Und der Pfadname wird in doppelte Anführungszeichen eingeschlossen, wenn einer dieser Ersetzungen aufgetreten ist. Entfernen Sie ltngt führenden Schrägstriche aus traditionellen diff Pfade. Der Standardwert ist 1. Stellen Sie sicher, dass mindestens Zeilen des Umgebungskontexts vor und nach jeder Änderung übereinstimmen. Wenn weniger Linien des umgebenden Kontextes existieren, müssen sie alle übereinstimmen. Standardmäßig wird kein Kontext jemals ignoriert. Standardmäßig erwartet git apply, dass das Patch, das angewendet wird, ein vereinheitlichtes diff mit mindestens einer Kontextzeile ist. Dies bietet gute Sicherheitsmaßnahmen, bricht aber bei der Anwendung eines Diffs, der mit --unified0 erzeugt wird, auf. Um diese Prüfungen zu umgehen, verwenden Sie --unidiff-zero. Beachten Sie, aus den oben genannten Gründen wird die Verwendung von kontextfreien Patches entmutigt. Wenn Sie eine der oben markierten Optionen verwenden, werden die angeforderten Informationen ausgegeben, ohne dass der Patch tatsächlich angewendet wird. Geben Sie diese Flagge nach diesen Flags, um das Patch auch anzuwenden. Wenn Sie ein Patch anwenden, ignorieren Sie die vom Patch vorgenommenen Erweiterungen. Dies kann verwendet werden, um den gemeinsamen Teil zwischen zwei Dateien zu extrahieren, indem man zuerst diff auf sie anwendet und das Ergebnis mit dieser Option anwendet, die den Löschungsteil anwenden würde, aber nicht den Additionsteil. Historisch gesehen erlaubten wir nicht, dass binäres Patch ohne explizite Berechtigung des Benutzers angewendet wurde, und diese Flagge war der Weg, dies zu tun. Derzeit haben wir immer binäre Patch-Anwendung zu ermöglichen, so ist dies ein No-op. Don8217t gelten Änderungen an Dateien, die dem angegebenen Pfadmuster entsprechen. Dies kann nützlich sein, wenn Sie Patchesets importieren, in denen bestimmte Dateien oder Verzeichnisse ausgeschlossen werden sollen. Übernehmen Sie Änderungen an Dateien, die dem angegebenen Pfadmuster entsprechen. Dies kann nützlich sein, wenn Sie Patchesets importieren, in die Sie bestimmte Dateien oder Verzeichnisse aufnehmen möchten. Wenn --exclude und --include patterns verwendet werden, werden sie in der Reihenfolge untersucht, in der sie auf der Befehlszeile erscheinen, und die erste Übereinstimmung bestimmt, ob ein Patch für jeden Pfad verwendet wird. Ein Patch zu einem Pfad, der kein Include / Exclude-Muster enthält, wird standardmäßig verwendet, wenn kein Include-Muster auf der Befehlszeile vorhanden ist und ignoriert wird, wenn es ein Include-Muster gibt. Wenn Sie einen Patch anwenden, ignorieren Sie Änderungen im Whitespace in Kontextzeilen, falls erforderlich. Context-Zeilen werden ihren Whitespace bewahren, und sie werden keiner Leerlauf-Fixierung unterzogen, unabhängig vom Wert der Option --whitespace. Neue Linien werden jedoch noch behoben. Wenn Sie einen Patch anwenden, ermitteln Sie eine neue oder modifizierte Zeile mit Whitespace-Fehlern. Was als Whitespace-Fehler angesehen wird, wird von der core. whitespace-Konfiguration gesteuert. Standardmäßig werden nachgestellte Leerzeichen (einschließlich Zeilen, die ausschließlich aus Whitespaces bestehen) und ein Leerzeichen, dem unmittelbar ein Tabulatorzeichen im ersten Einzug der Zeile folgt, als Whitespace-Fehler betrachtet. Standardmäßig gibt der Befehl Warnmeldungen aus, wendet aber den Patch an. Wenn git-apply für Statistiken verwendet wird und kein Patch angewendet wird, wird es standardmäßig auf "nowarn" gesetzt. Sie können verschiedene ltactiongt-Werte verwenden, um dieses Verhalten zu steuern: nowarn deaktiviert die nachgestellte Whitespace-Warnung. Warnt Ausgänge Warnungen für ein paar solcher Fehler, sondern wendet die Patch-as-is (Standard). Fix Ausgänge Warnungen für ein paar solcher Fehler, und wendet den Patch nach der Festsetzung sie (Strip ist ein Synonym --- das Werkzeug verwendet, um nur die nachfolgenden Whitespace Zeichen als Fehler zu berücksichtigen, und die Fixierung Strippen sie, aber moderne Gits tun mehr). Fehler gibt Warnungen für ein paar solcher Fehler aus und weigert sich, das Patch anzuwenden. Error-all ist ähnlich dem Fehler, zeigt aber alle Fehler. Unter bestimmten Umständen erkennen manche Versionen von diff keine fehlenden Neuzeilen am Ende der Datei. Infolgedessen erfassen Patches, die durch solche diff-Programme erzeugt werden, keine unvollständigen Zeilen korrekt auf. Diese Option fügt Unterstützung für das Anwenden solcher Patches hinzu, indem Sie um diesen Bug herum arbeiten. Bericht zu stderr. Standardmäßig wird nur eine Meldung über den aktuellen Patch gedruckt. Mit dieser Option werden zusätzliche Informationen gemeldet. Vertraue nicht auf die Zeilenanzahl in den Header-Kopfzeilen, sondern entferne sie, indem du den Patch überprüft (z. B. nach dem Editieren des Patches, ohne die Header-Header entsprechend anzupassen). Pretxt ltrootgt auf alle Dateinamen. Wenn ein - p-Argument auch übergeben wurde, wird es angewendet, bevor das neue Root vorangestellt wird. Beispielsweise kann ein Patch, der über die Aktualisierung von / git-gui. sh auf b / git-gui. sh spricht, auf die Datei in den Arbeitsbaummodulen / git-gui / git-gui. sh angewendet werden, indem git apply - - directorymodules / git-gui. Standardmäßig wird ein Patch, der sich außerhalb des Arbeitsbereichs auswirkt (entweder ein Git-kontrollierter Arbeitsbaum oder das aktuelle Arbeitsverzeichnis, wenn git gilt, als Ersatz für GNU-Patch verwendet wird) als Fehler (oder als Unfug) verworfen. Wenn git apply als besseres GNU-Patch verwendet wird, kann der Benutzer die Option --unsafe-paths übergeben, um diese Sicherheitsüberprüfung zu überschreiben. Diese Option hat keine Wirkung, wenn --index oder --cached verwendet wird. Konfiguration Ändern, wenn Änderungen im Whitespace standardmäßig ignoriert werden sollen. Auf eine von: no, none, never, false setzen, wenn Änderungen im Whitespace signifikant sein sollen. Wenn kein --whitespace-Flag über die Befehlszeile angegeben wird, wird dieses Konfigurationselement als Standard verwendet. Submodule Wenn das Patch Änderungen an Submodulen enthält, behandelt git apply diese Änderungen wie folgt. Wenn --index (explizit oder implizit) angegeben wird, muss das Submodul Commits mit dem Index genau übereinstimmen, damit das Patch gültig ist. Wenn eines der Submodule ausgecheckt wird, werden diese Auschecken vollständig ignoriert, d. H. Sie müssen nicht aktuell oder sauber sein und werden nicht aktualisiert. Wenn --index nicht angegeben ist, werden die Submodul-Commits im Patch ignoriert und nur das Fehlen bzw. Vorhandensein des entsprechenden Unterverzeichnisses überprüft und (wenn möglich) aktualisiert. SEE ALSOHow lösen Sie einen Zusammenführungskonflikt für binäre Akten (z. B. zwei Versionen eines. png) 45 pconrad Dieses ist eine große Frage, zu der ich mit einigen Punkten beginnen sollte. Git taucht nicht in die Binärdateien Änderungen in einer anderen Weise als andere Versionskontrollsysteme Git kann ein Diff-Tool, das Bilder versteht (git difftool und git mergetool) Der Benutzer hat noch sehr wenig Wahrscheinlichkeit in der Lage, die disparate Änderungen als binäre zusammenführen Formate wie PNGs nur arent gut konzipiert für die. Ich habe Araxis Merge verwendet, um diff einige Bilder mit bescheidenem Erfolg. Das GitHub Training Team-Mitglied möchte ich nur hinzufügen, dass, wenn youre in einem Merge-Konflikt einer Binärdatei oder sogar ein Textdokument für diese Angelegenheit, können Sie schnell lösen und überprüfen Sie die gewünschte richtige Kopie mit diesen Optionsschaltern während der Auflösung: git checkout --ours ltbinaryfilegt git checkout --theirs ltbinaryfilegtHow, zum eines binären Akte Konflikts mit Git zu lösen, wenn ein Zusammenführen in Git durchführt. Wird die Meldung angezeigt: In diesem Szenario ist somefile. dll eine Binärdatei, die sowohl im aktuellen Zweig als auch in dem Zweig geändert wurde, den Sie in dem aktuellen Zweig zusammenführen möchten. Da die Datei nicht textlich zusammengeführt werden kann, müssen Sie eine Entscheidung treffen: halten Sie die Version der Datei in Ihrem aktuellen Zweig oder die Version in der anderen Branche. In TortoiseSVN, war ich verwendet, um in der Lage, mit der rechten Maustaste auf die Datei in Frage und wählen Sie Resolve using mine oder Resolve verwenden ihre. Also, was ist das Git-Äquivalent Resolve mit mine Die Datei in Ihrer Arbeitskopie ist immer noch die Kopie aus Ihrem aktuellen Zweig mit anderen Worten, es wurde nicht durch den Zusammenführungsversuch geändert. Um den Konflikt zu beheben und diese Datei beizubehalten: Resolve using theirs Wenn Sie es vorziehen, den Konflikt mit ihrer Kopie zu lösen, müssen Sie die Version der Datei aus dem Zweig erhalten, den Sie zusammenführen wollten: Nun haben Sie die richtige Version von Die Datei in Ihrer Arbeitskopie, können Sie es als geklärt markieren (indem Sie es), und verpflichten: Beachten Sie, dass anstelle von otherbranch. Können Sie einen beliebigen Namen (treeish) verwenden, der auf einen Zweig verweist: einen lokalen Zweignamen (otherbranch), einen entfernten Zweignamen (Ursprung / Master), einen bestimmten Commit SHA (980e3cc) usw. Wenn Sie z Von der Fernbedienung, wenn Sie den Konflikt erhalten haben, und Sie wollten mit der Remote-Version zu lösen, würden Sie diese Kopie der Datei mit abrufen: Sie fügen Sie dann die Datei und Commit wie oben beschrieben. UPDATE. Es gibt eine Verknüpfung für das Erhalten der Kopie von der anderen Branche (und es nutzt sogar die Terminologie, die ich erwartet hatte): Dieser Eintrag wurde veröffentlicht in git. Lesezeichen für den Permalink. Befolgen Sie alle Kommentare hier mit dem RSS-Feed für diesen Beitrag.


No comments:

Post a Comment