Obwohl ein Großteil der Informationen in dieser Frage und Antwort auf StackOverflow verfügbar ist, sind sie auf viele Seiten und andere Antworten verteilt, die entweder falsch oder irreführend sind. Ich brauchte eine Weile, um alles zusammenzusetzen, was ich wissen wollte.
Es gibt viele verschiedene Programme, die als Git-Difftool und Mergetool verwendet werden können, und es gibt sicherlich keinen Konsens darüber, welches das beste ist (Meinungen, Anforderungen und Betriebssysteme unterscheiden sich deutlich).
Meld ist eine beliebte kostenlose, Open-Source- und plattformübergreifende Option (UNIX / Linux, OSX, Windows), wie in der StackOverflow- Frage gezeigt: Was ist das beste visuelle Zusammenführungstool für Git? , in der die Antwort, die Meld vorschlägt, mehr als dreimal so viele Stimmen hat wie jedes andere Tool.
Die folgenden 2 Fragen werden in meiner Antwort unten beantwortet:
- Wie richte ich Meld als Git-Difftool ein und verwende es?
- Wie richte ich Meld als Git-Mergetool ein und verwende es?
Hinweis: Es ist nicht erforderlich, dasselbe Programm wie Ihr Difftool und Ihr Mergetool zu verwenden. Für beide können unterschiedliche Programme festgelegt werden.
Antworten:
Wie richte ich Meld als Git-Difftool ein und verwende es?
git difftool zeigt das Diff mit einem GUI-Diff-Programm (dh Meld) an, anstatt die Diff-Ausgabe in Ihrem Terminal anzuzeigen.
Obwohl Sie das GUI-Programm über die Befehlszeile festlegen können,
-t <tool> / --tool=<tool>
ist es sinnvoller, es in Ihrer.gitconfig
Datei zu konfigurieren . [Hinweis: Siehe die Abschnitte zum Anhalten von Anführungszeichen und Windows-Pfaden unten.][Hinweis: Diese Einstellungen ändern nicht das Verhalten,
git diff
das weiterhin wie gewohnt funktioniert.]Sie verwenden
git difftool
genau so, wie Sie verwendengit diff
. z.BBei ordnungsgemäßer Konfiguration wird ein Meld-Fenster geöffnet, in dem das Diff über eine GUI-Oberfläche angezeigt wird.
Die Reihenfolge der Meld-GUI-Fensterfenster kann durch die Reihenfolge von
$LOCAL
und$REMOTE
in gesteuert werdencmd
, dh welche Datei im linken Bereich und welche im rechten Bereich angezeigt wird. Wenn Sie sie umgekehrt haben möchten, tauschen Sie sie einfach so aus:Schließlich verhindert die
prompt = false
Zeile einfach, dass git Sie dazu auffordert, ob Sie Meld starten möchten oder nicht. Standardmäßig gibt git eine Eingabeaufforderung aus.Wie richte ich Meld als Git-Mergetool ein und verwende es?
Mit git mergetool können Sie ein GUI-Zusammenführungsprogramm (z. B. Meld) verwenden, um die Zusammenführungskonflikte zu lösen, die während einer Zusammenführung aufgetreten sind.
Wie bei difftool können Sie das GUI-Programm in der Befehlszeile über festlegen. Nach
-t <tool> / --tool=<tool>
wie vor ist es jedoch sinnvoller, es in Ihrer.gitconfig
Datei zu konfigurieren . [Hinweis: Siehe die Abschnitte zum Anhalten von Anführungszeichen und Windows-Pfaden unten.]Sie verwenden NICHT
git mergetool
, um eine tatsächliche Zusammenführung durchzuführen. Vor der Verwendung führengit mergetool
Sie eine Zusammenführung mit git auf die übliche Weise durch. z.BWenn es einen Zusammenführungskonflikt gibt, zeigt git ungefähr Folgendes an:
Zu diesem Zeitpunkt
file_name
enthält die teilweise zusammengeführte Datei die Informationen zum Zusammenführungskonflikt (dies ist die Datei mit allen>>>>>>>
und<<<<<<<
Einträgen darin).Mergetool kann jetzt verwendet werden, um die Zusammenführungskonflikte zu lösen. Sie beginnen es sehr einfach mit:
Bei ordnungsgemäßer Konfiguration wird ein Meldungsfenster mit 3 Dateien geöffnet. Jede Datei wird in einem separaten Bereich der GUI-Oberfläche enthalten sein.
Im
.gitconfig
obigen Beispieleintrag werden 2 Zeilen als[mergetool "meld"]
cmd
Zeile vorgeschlagen. Tatsächlich gibt es für fortgeschrittene Benutzer alle Arten von Möglichkeiten, diecmd
Leitung zu konfigurieren , aber das würde den Rahmen dieser Antwort sprengen.Diese Antwort enthält zwei alternative
cmd
Zeilen, die für die meisten Benutzer geeignet sind und einen guten Ausgangspunkt für fortgeschrittene Benutzer darstellen, die das Tool auf die nächste Komplexitätsstufe bringen möchten.Erstens bedeuten die Parameter Folgendes:
$LOCAL
ist die Datei im aktuellen Zweig (zB Master).$REMOTE
ist die Datei in der Verzweigung, die zusammengeführt wird (z. B. Verzweigungsname).$MERGED
ist die teilweise zusammengeführte Datei mit den darin enthaltenen Informationen zum Zusammenführungskonflikt.$BASE
ist der Vorfahr des gemeinsam genutzten Commits von$LOCAL
und$REMOTE
, dh die Datei ist so, wie sie war, als der Zweig, der sie enthielt,$REMOTE
ursprünglich erstellt wurde.Ich schlage vor, Sie verwenden entweder:
oder:
Die Wahl ist, ob
$MERGED
oder$BASE
zwischen$LOCAL
und verwendet werden soll$REMOTE
.In beiden Fällen zeigt Meld 3 Fenster mit
$LOCAL
und$REMOTE
im linken und rechten Fenster sowie entweder$MERGED
oder$BASE
im mittleren Bereich an.In BEIDEN Fällen ist der mittlere Bereich die Datei, die Sie bearbeiten sollten, um die Zusammenführungskonflikte zu lösen. Der Unterschied besteht darin, in welcher Startposition Sie die Bearbeitung bevorzugen.
$MERGED
für die Datei, die die teilweise zusammengeführte Datei mit den Zusammenführungskonfliktinformationen enthält, oder$BASE
für den gemeinsam genutzten Commit-Vorfahren von$LOCAL
und$REMOTE
. [Da beidecmd
Zeilen nützlich sein können, behalte ich beide in meiner.gitconfig
Datei. Die meiste Zeit benutze ich die$MERGED
Zeile und die$BASE
Zeile ist auskommentiert, aber das Auskommentieren kann vertauscht werden, wenn ich$BASE
stattdessen die Zeile verwenden möchte .]Hinweis zur Ausgabedatei: Machen Sie sich keine Sorgen, dass diese verwendet
--output "$MERGED"
wird,cmd
unabhängig davon, ob sie früher in der Zeile verwendet wurde$MERGED
oder$BASE
wurdecmd
. Die--output
Option teilt Meld einfach mit, in welchem Dateinamen git die Konfliktlösungsdatei gespeichert werden soll. Meld speichert Ihre Konfliktbearbeitungen in dieser Datei, unabhängig davon, ob Sie sie verwenden$MERGED
oder$BASE
als Startpunkt für die Bearbeitung verwenden.Speichern Sie nach dem Bearbeiten des mittleren Bereichs zur Lösung der Zusammenführungskonflikte einfach die Datei und schließen Sie das Meldungsfenster. Git führt das Update automatisch durch und die Datei im aktuellen Zweig (z. B. Master) enthält jetzt alles, was Sie im mittleren Bereich gefunden haben.
git hat eine Sicherungskopie der teilweise zusammengeführten Datei mit den darin enthaltenen Informationen zum Zusammenführungskonflikt erstellt, indem es
.orig
an den ursprünglichen Dateinamen angehängt wurde. zBfile_name.orig
. Nachdem Sie überprüft haben, ob Sie mit dem Zusammenführen zufrieden sind, und alle Tests ausgeführt haben, die Sie möglicherweise durchführen möchten, kann die.orig
Datei gelöscht werden.An diesem Punkt können Sie jetzt ein Commit ausführen, um die Änderungen festzuschreiben.
Wenn Sie während der Bearbeitung der Zusammenführungskonflikte in Meld die Verwendung von Meld aufgeben möchten, beenden Sie Meld, ohne die Zusammenführungsauflösungsdatei im mittleren Bereich zu speichern. git antwortet mit der Nachricht
file_name seems unchanged
und fragt dannWas the merge successful? [y/n]
, wenn Sie antworten,n
wird die Lösung des Zusammenführungskonflikts abgebrochen und die Datei bleibt unverändert. Beachten Sie, dass Sie die Warnung und Aufforderung von git nicht erhalten, wenn Sie die Datei zu irgendeinem Zeitpunkt in Meld gespeichert haben. [Natürlich können Sie die Datei einfach löschen und durch die Sicherungsdatei ersetzen.orig
, die git für Sie erstellt hat.]Wenn Sie mehr als eine Datei mit Zusammenführungskonflikten haben, öffnet git nacheinander jeweils ein neues Meld-Fenster, bis alle fertig sind. Sie werden nicht alle gleichzeitig geöffnet, aber wenn Sie die Bearbeitung der Konflikte in einem abgeschlossen und Meld geschlossen haben, öffnet git den nächsten und so weiter, bis alle Zusammenführungskonflikte gelöst sind.
Es ist sinnvoll, ein Dummy-Projekt zu erstellen, um die Verwendung zu testen,
git mergetool
bevor Sie es in einem Live- Projekt verwenden. Stellen Sie sicher, dass Sie in Ihrem Test einen Dateinamen verwenden, der ein Leerzeichen enthält, falls Ihr Betriebssystem erfordert, dass Sie die Anführungszeichen in dercmd
Zeile umgehen, siehe unten.Anführungszeichen entkommen
Bei einigen Betriebssystemen müssen die Anführungszeichen möglicherweise maskiert sein
cmd
. Weniger erfahrene Benutzer sollten sich daran erinnern, dass Konfigurationsbefehlszeilen mit Dateinamen getestet werden sollten, die Leerzeichen enthalten. Wenn diecmd
Zeilen nicht mit den Dateinamen funktionieren, die Leerzeichen enthalten, versuchen Sie, die Anführungszeichen zu umgehen. z.BIn einigen Fällen kann ein komplexeres Anführungszeichen erforderlich sein. Der erste der folgenden Windows-Pfadlinks enthält ein Beispiel für das dreifache Escapezeichen für jedes Zitat. Es ist langweilig, aber manchmal notwendig. z.B
Windows-Pfade
Windows-Benutzer benötigen wahrscheinlich eine zusätzliche Konfiguration, die den Meldungszeilen hinzugefügt
cmd
wird. Möglicherweise müssen sie den vollständigen Pfad zu verwendenmeldc
, der unter Windows über die Befehlszeile aufgerufen werden soll, oder sie benötigen oder möchten möglicherweise einen Wrapper. Sie sollten die lesen Stackoverflow zu verlinkenden Seiten unter denen etwa die richtige Meld Einstellungcmd
Linie für Windows. Da ich ein Linux-Benutzer bin, kann ich die verschiedenen Windows-cmd
Zeilen nicht testen und habe keine weiteren Informationen zu diesem Thema, als zu empfehlen, meine Beispiele mit einem vollständigen Pfad zu Meld odermeldc
oder dem Hinzufügen des Meld-Programmordners zu Ihrem zu verwendenpath
.Ignorieren von nachgestellten Leerzeichen mit Meld
Meld verfügt über eine Reihe von Einstellungen, die in der GUI konfiguriert werden können.
Auf der
Text Filters
Registerkarte "Einstellungen" gibt es mehrere nützliche Filter, mit denen Sie beispielsweise Kommentare ignorieren können, wenn Sie einen Diff ausführen. Es gibt zwar Filter zum IgnorierenAll whitespace
undLeading whitespace
es gibt keinen IgnorierfilterTrailing whitespace
(dies wurde als Ergänzung in der Meld-Mailingliste vorgeschlagen, ist aber in meiner Version nicht verfügbar).Das Ignorieren von nachgestellten Leerzeichen ist häufig sehr nützlich, insbesondere bei der Zusammenarbeit, und kann einfach manuell mit einem einfachen regulären Ausdruck auf der
Text Filters
Registerkarte Meld-Einstellungen hinzugefügt werden .Ich hoffe das hilft allen.
quelle
[mergetool "meld"]
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED"
in~/.gitconfig
, dann lösen Sie einfach die rot markierten Konflikte in der Mitte Pfanne und sparen! Dies sollte die Standardeinstellung sein.$LOCAL $MERGED $REMOTE
ist die Einstellung, die ich die meiste Zeit verwende, wenn es nur wenige Konflikte gibt, um sie zu lösen. Sie ist ausgezeichnet und auch meine Standardeinstellung.$LOCAL $BASE $REMOTE
kommt wirklich zur Geltung, wenn es viel zu tun gibt und Sie genau wissen, welche Codeabschnitte aus welcher Datei stammen. Der Shared Commit-Vorfahr kann ein guter, übersichtlicher Ausgangspunkt sein. Manchmal stört die Hervorhebung von Konflikten tatsächlich und eine sauberere Basis ist ein Segen.=
cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output="$MERGED"
Während die andere Antwort richtig ist, ist hier der schnellste Weg, um Meld als Ihr visuelles Diff-Tool zu konfigurieren. Kopieren Sie einfach Folgendes:
Führen Sie es nun
git difftool
in einem Verzeichnis aus und Meld wird für jede andere Datei gestartet.Randnotiz: Meld vergleicht CSV-Dateien überraschend langsam , und kein Linux-Diff-Tool, das ich gefunden habe, ist schneller als dieses Windows-Tool namens Compare It! (zuletzt aktualisiert im Jahr 2010).
quelle
git config --global difftool.meld.cmd 'meld "$LOCAL" "$REMOTE"'
dort wahrscheinlich auch eine Zeile. Dies ist die "Standardeinstellung", aber sobald Sie a konfigurierenmergetool
,difftool
wird die Mergetool-Konfiguration als Standard verwendet, wenn die Diff-Konfiguration nicht gefunden wird. Da die Zusammenführung im Allgemeinen so konfiguriert ist, dass drei Dateien für eine 3-Wege-Zusammenführung übergeben werden, bedeutet dies, dass Ihrmeld
Diff- Fenster plötzlich drei Bereiche hat, was keinen Sinn ergibt.Für Windows . Führen Sie diese Befehle in Git Bash aus:
(Aktualisieren Sie den Dateipfad für Meld.exe, falls Ihr Pfad anders ist.)
Für Linux . Führen Sie diese Befehle in Git Bash aus:
Sie können den Pfad von Meld mit diesem Befehl überprüfen:
quelle
git config --global --get-regex diff*
?git config --global difftool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
?Ich bevorzuge es, meld als separaten Befehl einzurichten, wie folgt:
Dies ähnelt dem Skript git-meld.pl hier: https://github.com/wmanley/git-meld
Sie können dann einfach laufen
quelle
--dir-diff
Teil als persönliche Präferenz entfernt habe.)Für Windows 10 musste ich dies in meine .gitconfig einfügen:
Alles , was Sie wissen müssen , ist in dieser super geschrieben Antwort weiter oben durch mattst.
PS: Aus irgendeinem Grund funktionierte dies nur mit Meld 3.18.x, Meld 3.20.x gibt mir einen Fehler.
quelle
Dies ist eine Antwort, die sich hauptsächlich an Entwickler richtet, die Windows verwenden, da sich die Pfadsyntax des Diff-Tools von anderen Plattformen unterscheidet.
Ich verwende Kdiff3 als Git-Mergetool, aber um das Git-Difftool als Meld einzurichten, habe ich zuerst die neueste Version von Meld von Meldmerge.org installiert und dann Folgendes zu meiner globalen .gitconfig hinzugefügt:
Hinweis: Wenn Sie Sublime Text 3 anstelle des Standard-Vim als Hauptditor verwenden möchten, können Sie dies der .gitconfig-Datei hinzufügen:
Dann fügen Sie Inn Meld als Difftool hinzu
Beachten Sie den führenden Schrägstrich im obigen cmd. Unter Windows ist dies erforderlich.
Es ist auch möglich, einen Alias einzurichten, um das aktuelle Git-Diff mit der Option --dir-diff anzuzeigen . Dadurch werden die geänderten Dateien in Meld aufgelistet. Dies ist praktisch, wenn Sie mehrere Dateien geändert haben (ein sehr häufiges Szenario).
Der Alias sieht in der .gitconfig-Datei unter dem Abschnitt [alias] folgendermaßen aus :
Um die Änderungen anzuzeigen, die ich am Code vorgenommen habe, gebe ich einfach den folgenden Befehl ein:
Das folgende Bild zeigt, wie diese Option --dir-diff eine Liste geänderter Dateien anzeigen kann (Beispiel):
Dann ist es möglich, auf jede Datei zu klicken und die Änderungen in Meld anzuzeigen.
quelle
Es kann kompliziert sein, einen Unterschied in Ihrem Kopf aus den verschiedenen Abschnitten in $ MERGED zu berechnen und anzuwenden. In meinem Setup hilft meld, indem es Ihnen diese Unterschiede visuell zeigt, indem Sie Folgendes verwenden:
Es sieht seltsam aus, bietet aber einen sehr praktischen Arbeitsablauf mit drei Registerkarten:
In Tab 1 sehen Sie (von links nach rechts) die Änderung, die Sie in Tab 2 vornehmen sollten, um den Zusammenführungskonflikt zu lösen.
Auf der rechten Seite von Registerkarte 2 übernehmen Sie die "Änderung, die Sie vornehmen sollten" und kopieren den gesamten Dateiinhalt in die Zwischenablage (mit Strg-a und Strg-c).
In Registerkarte 3 ersetzen Sie die rechte Seite durch den Inhalt der Zwischenablage. Wenn alles korrekt ist, sehen Sie jetzt von links nach rechts dieselbe Änderung wie in Registerkarte 1 (jedoch mit unterschiedlichen Kontexten). Speichern Sie die auf dieser Registerkarte vorgenommenen Änderungen.
Anmerkungen:
quelle
$BASE
stattdessen verwenden$MERGED
, um den Zusammenführungsvorgang zu starten