Wenn es währenddessen zu einer Kollision kommt git merge
, öffne ich ein Mergetool namens Meld . Es werden drei Dateien LOCAL, BASE und REMOTE geöffnet. Wie ich gelesen habe, ist LOCAL mein lokaler Zweig, BASE ist ein gemeinsamer Vorfahr und REMOTE ist der Zweig, der zusammengeführt werden soll.
Nun zu meiner Frage: Welche Version der Datei wird endlich verwendet? Ist es FERN? Wenn ja, kann ich es nach Belieben bearbeiten, unabhängig davon, was sich beispielsweise in der BASE-Verzweigung befindet?
merge.conflictstyle
Konfigurationsoptiondiff3
anstelle der Standardeinstellung festgelegt istmerge
.HEAD
, bedeutet dies, dass überhaupt kein Konflikt vorliegt. In diesem Fall ist das mittlere Fenster nicht leer, es zeigt das Zusammenführungsergebnis an, aber es gibt keinen "roten" Teil<<<<<
=====
<<<<<<
,======
noch>>>>>>
Marker im mittleren Bereich (dh die Basisversion) entweder; und manchmal ist der mittlere Bereich leer, wie aGr berichtet. Möglicherweise ist dieser Unterschied auf unterschiedliche Einstellungen zurückzuführen. Als ich das Meld - Tool starten, werden die folgenden Dateien vorhanden ist , vorausgesetzt , dass der Name der Datei im Repository istX.java
:X.java
,X.java.orig
,X.java.BACKUP.#
,X.java.BASE.#
,X.java.LOCAL.#
,X.java.REMOTE.#
, wo#
ist eine Zahl. Das Aufrufen des Zusammenführungsergebnisses in der BASE-Version ist verwirrend. MERGED wäre besser.Meld verfügt über eine versteckte 3-Wege-Zusammenführungsfunktion, die durch Übergabe des 4. Parameters aktiviert wird:
Das rechte und das linke Fenster werden im schreibgeschützten Modus geöffnet, sodass Sie nicht versehentlich falsch zusammenführen können. Der mittlere Bereich zeigt das Ergebnis der Zusammenführung. Für die Konflikte wird die Basisversion angezeigt, sodass Sie alle wichtigen Elemente sehen können: Originaltext in der Mitte und widersprüchliche Änderungen auf beiden Seiten. Wenn Sie schließlich auf die Schaltfläche "Speichern" klicken, wird die Datei $ MERGED geschrieben - genau wie von git erwartet.
Die von mir verwendete Datei ~ / .gitconfig enthält die folgenden Einstellungen:
Dies öffnet die Meldung mit 3 Registerkarten, wobei die erste und zweite Registerkarte die einfachen Unterschiede enthalten, die ich zusammenführen möchte, und die dritte Registerkarte, die standardmäßig geöffnet ist, zeigt die 3-Wege-Zusammenführungsansicht.
Der Grund, warum das Feature ausgeblendet ist, ist, dass es noch nicht poliert genug ist. Es ist sehr nützlich, wie es jetzt ist, aber Kai Willadsen, der Autor der Meldung, wies auf einige Falten hin, die ausgebügelt werden müssen. Zum Beispiel gibt es keine GUI zum Starten des 3-Wege-Zusammenführungsmodus, die Befehlszeilensyntax ist etwas geheimnisvoll und so weiter. Wenn Sie Python sprechen und etwas Zeit haben, wissen Sie, was zu tun ist.
Bearbeiten: In neueren Versionen von Meld hat sich die Synax geringfügig geändert. Dies war in den Kommentaren, aber es gehört in die Antwort.
Der Befehl meld verwendet jetzt die Option --output, daher sollte die letzte Zeile aus dem obigen Snippet lauten:
quelle
--output
für das $ MERGED-Ergebnis verwenden. Ich entdeckte dies, als ich mir das--output option
. Siehe diese Zeile im Startskript:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED
. Dies öffnet also 3 Registerkarten (gute alte Methode), führt nicht konfliktreiche Zusammenführungen automatisch in die Mitte ein, wobei die Mitte $ MERGED ist, und wird als Ausgabe zur Konfliktlösung verwendet.--output=<file>
oder sein-o <file>
, siehemeld --help
Es sind 4 Dateien beteiligt:
$LOCAL
Die Datei in dem Zweig, in dem Sie zusammenführen. unberührt vom Zusammenführungsprozess, wenn er Ihnen angezeigt wird$REMOTE
Die Datei in dem Zweig, von dem aus Sie zusammenführen. unberührt vom Zusammenführungsprozess, wenn er Ihnen angezeigt wird$BASE
Der gemeinsame Vorfahr von $ LOCAL und $ REMOTE, dh. der Punkt, an dem die beiden Zweige begannen, die betrachtete Datei umzuleiten; unberührt vom Zusammenführungsprozess, wenn er Ihnen angezeigt wird$MERGED
Die teilweise zusammengeführte Datei mit Konflikten; Dies ist die einzige Datei, die vom Zusammenführungsprozess berührt und Ihnen tatsächlich nie angezeigt wurdemeld
Die
$MERGED
Datei ist derjenige, der die enthält<<<<<<
,>>>>>>
,=====
(und vielleicht||||||
) Marker (das abgrenzen Konflikte). Dies ist die Datei, die Sie manuell bearbeiten , um Konflikte zu korrigieren.Die manuelle Konfliktbearbeitung und die visuelle Konfliktbearbeitung werden für verschiedene Dateien durchgeführt und mit unterschiedlichen Informationen dargestellt.
Wenn die mergetool mit ( übernehmen
meld
), werden die Dateien , die darin sind , sind zu sehen:$LOCAL
,$BASE
,$REMOTE
. Beachten Sie, dass Sie die$MERGED
Datei nicht sehen , obwohl dies als versteckter Parameter übergeben wirdmeld
, um das Ergebnis der Bearbeitung dort zu schreiben.Mit anderen Worten, in
meld
bearbeiten Sie die Datei in der Mitte, die$BASE
Datei, und Sie wählen alle Änderungen manuell von links oder rechts aus . Es ist eine saubere Datei, die vom Zusammenführungsprozess nicht berührt wird. Der einzige Fehler ist, dass Sie beim Speichern nicht in der$BASE
Datei speichern, sondern im vierten versteckten Parameter vonmeld
die$MERGED
Datei (die Sie nicht einmal sehen). Die$BASE
Datei ist nicht enthalten keine Konflikte oder teilweise erfolgreich verschmilzt , weil es nicht das ist$MERGED
Datei .Bei der visuellen Bearbeitung werden bei der Präsentation der
$BASE
Datei (anstelle der$MERGED
Datei)git
grundsätzlich alle Versuche verworfen , die Zusammenführung durchzuführen (diese Versuche sind, wenn Sie möchten, in der Datei $ MERGED sichtbar), und Sie können die Zusammenführung vollständig durchführen von Grund auf neu .Das Fazit ist, dass Sie bei manuellen und visuellen Zusammenführungskonflikten nicht dieselben Dateien betrachten, sondern das Endergebnis in derselben Datei (dh der
$MERGED
Datei) geschrieben wird.Die manuelle Korrektur der Konflikte auf getan ,
$MERGED
weilgit
keine Mittel Sie drei Dateien zu präsentieren, so quetscht sie die Informationen aus den drei Dateien ($LOCAL
,$BASE
,$REMOTE
) in dieser$MERGED
Datei.Aber die visuellen Werkzeuge die Mittel haben , um zu zeigen Ihnen drei Dateien: Sie zeigen Ihnen die
$LOCAL
,$BASE
,$REMOTE
Dateien. Sie sind Kommissionierung Änderungen aus den$LOCAL
und$REMOTE
Dateien und Sie diese in die bringen$BASE
Datei komplett neu zu bauen und sogar das Überschreiben des gescheiterten Versuch der Zusammenführung das ist die$MERGED
Datei.quelle
$LOCAL
,$REMOTE
,$BASE
und der Ausgang gleich anfangs zu$BASE
, die aber verschieden ist$MERGED
, dass sie nicht über git Versuch , die Dateien und die Konfliktmarken und so weiter zu verschmelzen. Auf diese Weise könnten diese Tools verwendet werden, die dem 3-Fenster-Ansatz von LOCAL / REMOTE / BASE + OUTPUT am ähnlichsten sind, bei dem keine Zusammenführung angezeigt wird. Im 4. Bereich können Sie nur die Basis von der Ausgabe trennen.Die Lösung von Cosmin funktioniert, aber die $ BASE- Datei wird aktualisiert - nicht $ MERGED . Dadurch wird die $ MERGED- Datei aktualisiert :
Meld:
v1.8.4
quelle
cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
--diff $BASE $LOCAL --diff $BASE $REMOTE
am ende für mich am 1.8.4 funktioniert das gut (soweit ich sehen kann):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
Mit Meld 1.7 funktioniert die Lösung von Tomek Bury nicht mehr.
Die Standardeinstellungen haben mich nicht zufrieden gestellt:
Stattdessen schlage ich für Meld> = 1.7 eine von zwei anderen Lösungen vor.
Erste Lösung :
Zweite Lösung :
.gitconfig
Kopieren Sie diese und fügen Sie sie in Ihre
.gitconfig
Datei ein, um die oben beschriebenen Lösungen zu erhalten:Kopieren Sie diese und fügen Sie sie in eine
.gitconfig.local
Datei ein, um meld17 oder meld16 nur für diesen Computer festzulegen, falls Sie Ihre .gitconfig auf mehreren Computern verwenden:quelle
cmd = meld $LOCAL $BASE $REMOTE --auto-merge
, ist der mittlere Bereich die $ BASE und nicht die $ MERGE, die tatsächlich als Ausgabe der Konfliktlösung verwendet wird.Ich habe festgestellt, dass keine der angezeigten Standarddateien gespeichert wurde. meld wurde zeigt
$LOCAL
,$REMOTE
und$BASE
standardmäßig aktiviert . Damit es funktioniert, musste ich$MERGED
stattdessen eine Meldungsshow erstellen$BASE
. Wenn ich das in mein Problem~/.gitconfig
stecke, ist es für mich behoben:Ich benutze Arch mit:
quelle
Aus irgendeinem Grund werden in den neuesten Versionen von meld keine für Konflikte hinzugefügten Markierungslinien angezeigt (<<<<<<<, =======, >>>>>>>). Wenn Sie diese Zeilen sehen möchten, sollten Sie meld v 1.3.3 oder eine frühere Version installieren.
quelle
Die richtige Antwort finden Sie in Saads Antwort.
Mit meld 1.8.1 unter Ubuntu bekam ich das
und das Hinzufügen der Ausgabe, bevor $ MERGED es für mich behoben hat:
quelle