Welche Version der Git-Datei wird endgültig verwendet: LOCAL, BASE oder REMOTE?


174

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?

Antworten:


142

Es ist der in der Mitte : BASE.

In der Tat BASEist nicht der gemeinsame Vorfahr, sondern die halbfertige Zusammenführung, bei der Konflikte mit >>>>und markiert sind <<<<.

Sie können die Dateinamen oben im Meldungsbearbeitungsfenster sehen.

Sehen Sie den Screenshot hier

Basis verschmelzen

Sie können die BASEDatei mit oder ohne Meldungsbefehle beliebig bearbeiten .
Sie können Meld auch entfernen und die Datei einfach mit Ihrem bevorzugten Texteditor bearbeiten.

  • Der Code zwischen <<<< HEADund =====marker ist derjenige Ihrer lokalen Datei vor dem Zusammenführen.
  • Der Code zwischen ====und >>>> <branch name>ist derjenige der Remote-Datei.

3
Einige Benutzer erhalten ein besseres Verständnis der widersprüchlichen Abschnitte in einer Datei, bei denen die automatische Zusammenführung fehlgeschlagen ist, wenn die merge.conflictstyleKonfigurationsoption diff3anstelle der Standardeinstellung festgelegt ist merge.
Kostix

3
Ich sehe den KOPF eigentlich nicht, <<< und === singt. In dem von Ihnen angegebenen Fall wäre das mittlere Fenster leer. Aber das ist nur eine Notiz für die anderen, danke für Ihre Antwort.
Tsusanka

Wenn Sie das und die Zeichen nicht sehen 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<<<<<=====
Fabien Quatravaux

10
Wenn ich verschmilzt mit Meld tun, ich sehe keine <<<<<<, ======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 ist X.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.
Teemu Leisti

3
BASE ist in der Tat der gemeinsame Vorfahr, MERGED ist der Name der Datei mit den darin enthaltenen Informationen zum teilweisen Zusammenführen. Bitte lesen Sie meine Frage und Antwort Einrichten und Verwenden von Meld als Git-Difftool und Mergetool, das genau erklärt, wie es funktioniert. HTH.
Mattst

107

Meld verfügt über eine versteckte 3-Wege-Zusammenführungsfunktion, die durch Übergabe des 4. Parameters aktiviert wird:

meld $LOCAL $BASE $REMOTE $MERGED

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:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

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:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

7
@Jesse, @lumbric, es scheint, dass neuere Versionen von meld das Flag --outputfür das $ MERGED-Ergebnis verwenden. Ich entdeckte dies, als ich mir das
Johann

1
@ Lumbric Ich glaube schon, für Meld 1.7.x + mit dem --output option. Siehe diese Zeile im Startskript:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Johann

12
In der neuesten Meldung (Version> 1.8.4) müssen wir die Option --auto-merge verwenden. cmd = meld --diff $ BASE $ LOCAL --diff $ BASE $ REMOTE --auto-merge $ LOCAL $ BASE $ REMOTE - Ausgabe $ MERGED
RoboAlex

7
Ich hatte das gleiche Problem wie @pingpongboss mit Meld 1.8.4: Meld öffnete Dinge in einem separaten Bereich, anstatt den 3. Tab zu öffnen. Der Befehl, der endlich gut funktioniert hat, lautet : 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.
Farmir

2
Die Syntax für die Ausgabe kann --output=<file>oder sein -o <file>, siehemeld --help
Levsa

57

Es sind 4 Dateien beteiligt:

  1. $LOCALDie Datei in dem Zweig, in dem Sie zusammenführen. unberührt vom Zusammenführungsprozess, wenn er Ihnen angezeigt wird

  2. $REMOTEDie Datei in dem Zweig, von dem aus Sie zusammenführen. unberührt vom Zusammenführungsprozess, wenn er Ihnen angezeigt wird

  3. $BASEDer 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

  4. $MERGEDDie 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 $MERGEDDatei 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 $MERGEDDatei nicht sehen , obwohl dies als versteckter Parameter übergeben wird meld, um das Ergebnis der Bearbeitung dort zu schreiben.

Mit anderen Worten, in meldbearbeiten Sie die Datei in der Mitte, die $BASEDatei, 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 $BASEDatei speichern, sondern im vierten versteckten Parameter von melddie $MERGEDDatei (die Sie nicht einmal sehen). Die $BASEDatei ist nicht enthalten keine Konflikte oder teilweise erfolgreich verschmilzt , weil es nicht das ist $MERGEDDatei .

Bei der visuellen Bearbeitung werden bei der Präsentation der $BASEDatei (anstelle der $MERGEDDatei) gitgrundsä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 $MERGEDDatei) geschrieben wird.

Die manuelle Korrektur der Konflikte auf getan , $MERGEDweil git keine Mittel Sie drei Dateien zu präsentieren, so quetscht sie die Informationen aus den drei Dateien ( $LOCAL, $BASE, $REMOTE) in dieser $MERGEDDatei.

Aber die visuellen Werkzeuge die Mittel haben , um zu zeigen Ihnen drei Dateien: Sie zeigen Ihnen die $LOCAL, $BASE, $REMOTEDateien. Sie sind Kommissionierung Änderungen aus den $LOCALund $REMOTEDateien und Sie diese in die bringen $BASEDatei komplett neu zu bauen und sogar das Überschreiben des gescheiterten Versuch der Zusammenführung das ist die $MERGEDDatei.


Ich wollte nur, dass es Tools gibt (z. B.
unvergleichlich

@yoniYalovitsky: ja, oder p4merge
user1284631

Ich habe das Merge-Tool aus dem ClearCase-Paket verwendet
mishmashru

@yoniLavi - auch diese Werkzeuge zeigen , 4 Scheiben , aber nicht unbedingt alle vier Dateien wie in dieser Antwort beschrieben. Insbesondere können Sie diese 4-Scheiben - Tools einrichten , Sie zu zeigen $LOCAL, $REMOTE, $BASEund 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.
BeeOnRope

16

Die Lösung von Cosmin funktioniert, aber die $ BASE- Datei wird aktualisiert - nicht $ MERGED . Dadurch wird die $ MERGED- Datei aktualisiert :

Meld: v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE

Ich kann dies bestätigen. Saads Lösung funktioniert für mich unter Ubuntu. Was die ursprüngliche Frage betrifft, ist dies die aktuell richtige Antwort.
Cosmin

3
In meiner Version von meld - 3.11 funktioniert dieser Befehl hervorragend:cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
MartinM

warum brauchst du --diff $BASE $LOCAL --diff $BASE $REMOTEam ende für mich am 1.8.4 funktioniert das gut (soweit ich sehen kann):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
farmir

1
@ Farmir: Es ist nicht notwendig. Es werden zwei weitere Registerkarten in Meld geöffnet, sodass Sie LOCAL und REMOTE im Vergleich zu BASE einzeln sehen können.
Sam Kauffman

1
Egal in welcher Reihenfolge ich mit diesen Argumenten versuche, die Drei-Wege-Registerkarte ist immer die dritte Registerkarte, während die erste Registerkarte immer standardmäßig ausgewählt ist. Gibt es eine Möglichkeit, die Drei-Wege-Registerkarte standardmäßig auszuwählen?
Sam Kauffman

13

Mit Meld 1.7 funktioniert die Lösung von Tomek Bury nicht mehr.

Die Standardeinstellungen haben mich nicht zufrieden gestellt:

Standardeinstellungen

Stattdessen schlage ich für Meld> = 1.7 eine von zwei anderen Lösungen vor.

Erste Lösung :

 meld $LOCAL $BASE $REMOTE --auto-merge

erste Lösung

Zweite Lösung :

 meld $LOCAL $MERGED $REMOTE

zweite Lösung

.gitconfig

Kopieren Sie diese und fügen Sie sie in Ihre .gitconfigDatei ein, um die oben beschriebenen Lösungen zu erhalten:

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

Kopieren Sie diese und fügen Sie sie in eine .gitconfig.localDatei ein, um meld17 oder meld16 nur für diesen Computer festzulegen, falls Sie Ihre .gitconfig auf mehreren Computern verwenden:

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17

Dies funktioniert nicht unter Meld 1.8.4. Wenn Sie ausführen 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.
Farmir

1
@farmir Sie haben $ BASE als zweite Registerkarte ausgewählt.
Alex78191

11

Ich habe festgestellt, dass keine der angezeigten Standarddateien gespeichert wurde. meld wurde zeigt $LOCAL, $REMOTEund $BASEstandardmäßig aktiviert . Damit es funktioniert, musste ich $MERGEDstattdessen eine Meldungsshow erstellen $BASE. Wenn ich das in mein Problem ~/.gitconfigstecke, ist es für mich behoben:

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

Ich benutze Arch mit:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1

Entschuldigung, ist diese Konfiguration inux kompatibel?
MadMad666

2

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.


Ich fand die Antwort von @lumbric stackoverflow.com/a/22911793/641892
wnasich

2

Die richtige Antwort finden Sie in Saads Antwort.

Mit meld 1.8.1 unter Ubuntu bekam ich das

falsche Anzahl von Argumenten an --diff

und das Hinzufügen der Ausgabe, bevor $ MERGED es für mich behoben hat:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.