Unterschiede von Zweigen mit Meld anzeigen?

159

Ich weiß, dass ich den Unterschied zwischen HEAD und aktuellem Zustand mit sehen kann meld .. Aber wie kann ich zum Beispiel die Unterschiede zwischen Zweigen masterund develmit Meld sehen?

Im Moment mache ich folgende Schritte:

  1. Ordner der Arbeitskopie umbenennen
    Zum Beispiel mv /projectA /projectA_master)
  2. Klonen Sie das Projekt erneut
    git clone url
  3. Zum develZweig wechseln
    cd projectA && git -b devel origin/devel
  4. Unterschiede mit meld anzeigen
    meld /projectA_Master projectA

Gibt es nicht einen einfacheren Weg, um das gleiche Ergebnis bei der Verschmelzung zu erzielen? Ich brauche es nur, um die Änderungen zu überprüfen und nicht primär zum Zusammenführen.

Marten Bauer
quelle

Antworten:

55

Ich fand dieses Problem auch ärgerlich, deshalb habe ich eine Git-Meldung erstellt, die eine bequemere Möglichkeit bietet, willkürliche Commits gegen den Arbeitsbaum oder den Staging-Bereich zu unterscheiden. Sie finden es unter https://github.com/wmanley/git-meld . Es ist ein bisschen wie Marks Skript, funktioniert aber zum Vergleichen eines beliebigen Commits oder des Staging-Bereichs oder des Arbeitsverzeichnisses mit einem der anderen. Wenn eines der Dinge, mit denen Sie vergleichen, der Arbeitsbaum ist, dann ist das auch Lesen / Schreiben, damit Sie Ihre Änderungen nicht verlieren.

Will Manley
quelle
1
Exzellentes Werkzeug, Will. Vielen Dank! Sehr zu empfehlen ... jetzt, wenn es nur bei Zusammenführungen funktioniert hat.
Ölmessstab
TYVM für ein großartiges Tool - (Erinnerung an sich selbst, um es dem Alias ​​hinzuzufügen!)
kfmfe04
26
Zitat von Will aus dem Hit-Github-Repository: "HINWEIS: git-meld ist veraltet, da git difftool die Option --dir-diff in git 1.7.11 gelernt hat."
Oluc
318

Kurz & süß:

git config --global diff.tool meld

Dadurch wird Git für die Verwendung meldals Diff-Tool konfiguriert . (Sie müssen die Befehlszeilenargumente nicht angeben, die Unterstützung für meldist in Git integriert.)

Wenn Sie dann einen grafischen Unterschied anstelle eines textuellen Unterschieds wünschen, rufen Sie einfach git difftoolstatt auf git diff(beide verwenden dieselben Argumente). In deinem Fall:

git difftool master..devel

Update: Wenn Sie nicht den Unterschied von jeweils einer Datei möchten, sondern stattdessen die Ansicht "Unterverzeichnis" von meld mit allen Änderungen zwischen den beiden Zweigen verwenden möchten, beachten Sie die Option -doder --dir-difffür git difftool. Wenn ich zum Beispiel in Zweig XYZ bin und sehen möchte, was sich zwischen diesem und Zweig ABC unterscheidet, führe ich Folgendes aus:

git difftool -d ABC
Jörg W Mittag
quelle
3
das ist nicht was ich suche. Es zeigt mir die Unterschiede Datei für Datei. Ich habe das vorher mit einem Skript diff.py und 'git diff master..devel' archiviert. Ich möchte alle Unterschiede und den Verzeichnisbaum so sehen, wie es 'meld OrdnerA / OrdnerB /' tut.
Marten Bauer
Marten, so funktioniert Git. Es wird nur die Datei verfolgt, sodass Sie den Unterschied nur Datei für Datei sehen können. In git können Sie ein leeres Verzeichnis nicht alleine festschreiben. Gibt es einen bestimmten Grund, warum Sie Unterschiede zwischen dir anzeigen möchten?
Donny Kurnia
@DonnyKurnia: Ich habe ein bisschen gebraucht, um herauszufinden, was OP versucht: Meld hat eine separate Benutzeroberfläche zum Anzeigen aller Änderungen in einem Verzeichnis. Sie können Anzeigedateien danach filtern, ob sie identisch, geändert oder neu sind. OP möchte diese Benutzeroberfläche verwenden, um die Änderungen anzuzeigen. (Auf diese Weise können Sie eine Liste aller Änderungen anzeigen und diejenigen auswählen, die Sie unterscheiden möchten.) Es handelt sich also nicht um einen Vergleich zwischen Verzeichnissen, sondern um einen Vergleich zwischen Commits, sondern als Ganzes.
idbrii
17
@MartenBauer Ich denke, das ist, was Sie wollen: Git Difftool --dir-Diff Master Devel
Stéphane
3
Kann dies so gemacht werden, dass sich der aktuelle Zweig nicht in einem tmp-Ordner befindet und daher Änderungen zulässt?
zkent
100

Ab git v1.7.11 können Sie git difftool --dir-diffeinen Verzeichnisdifferenz ausführen. Das funktioniert ganz gut mit meld ohne https://github.com/wmanley/git-meld Skripte.

Git konfigurieren

git config --global diff.tool meld

Benutze es

git difftool -d topic             // -d is --dir-diff
git difftool -d master..topic

Für macOS

brew cask install meld
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"'
git config --global difftool.meld.trustExitCode true
GutenYe
quelle
2
Ich denke, das ist wirklich das, was das OP wollte. Beachten Sie die Option -g, um das Guidiff-Tool zu verwenden, und die Option -d, um ein --dir-diff zu verwenden. Dies ist gut für Codeüberprüfungen. Nit: Die Option difftool.prompt ist nicht erforderlich, wenn -d angegeben wird, zumindest für Git 1.8.
Michael Percy
1
Das ist großartig. Genau das, was ich brauchte. Danke dir!
Nicholas
5
Kann dies so gemacht werden, dass sich der aktuelle Zweig nicht in einem tmp-Ordner befindet und daher Änderungen zulässt?
zkent
2
Ich würde mich auch über eine Antwort auf die @ zkent-Frage freuen ... :(
tavlima
3
@zkent @tavlima: Dieser Befehl ermöglicht bereits Änderungen an Ihrer aktuellen Version. Selbst wenn Sie einen tmp-Floder in meld sehen, Ctrl+swird Ihre Datei geändert , wenn Sie - - den richtigen Teil speichern.
Benjamin
13

Es ist wichtig zu sagen, dass git difftool -dSie Ihre Arbeitsdateien weiterhin in Meld bearbeiten und speichern können . Um dies zu erreichen, müssen Sie einen Zweig mit Ihrem aktuellen Arbeitsbaum vergleichen, zum Beispiel:

git difftool -d branchname

Meld zeigt an, dass sich sowohl das linke als auch das rechte Verzeichnis in / tmp befinden. Dateien im richtigen Verzeichnis sind jedoch symbolische Links zu Ihren Dateien im aktuellen Arbeitsverzeichnis (gilt nicht für Windows). Sie können sie also direkt in Meld bearbeiten. Wenn Sie sie speichern, werden Ihre Änderungen in Ihrem Arbeitsverzeichnis gespeichert.

Noch interessanter ist der Vergleich des aktuellen Arbeitsverzeichnisses mit dem Versteck. Sie können dies tun, indem Sie einfach Folgendes eingeben:

git difftool -d stash

Anschließend können Sie einige Änderungen aus dem Stash (linkes Fenster) in Ihre aktuelle Arbeitskopie (rechtes Fenster) übertragen, ohne die git stash pop/applystörende Konfliktlösung zu verwenden und zu vermeiden, die durch diese Befehle verursacht werden kann.

Ich denke, dass es den Workflow mit Stashes erheblich verbessern kann. Sie können Änderungen schrittweise vom Stash in die Arbeitskopie übertragen und nacheinander festschreiben. Wenn Sie möchten, können Sie weitere Änderungen vornehmen.

Piotr Jurkiewicz
quelle
Piotr, genau das habe ich versucht, aber in meinem Fall (unter CentOS) werden keine Symlinks erstellt. Gibt es ein erforderliches Konfigurationssetup oder eine Min-Version von meld, die dies unterstützt?
Wrjohns
Ich denke, dass Git für die Erstellung von Symlinks verantwortlich ist, nicht für Meld. Überprüfen Sie das Handbuch von Git auf den Befehl difftool. Vielleicht sollten Sie es auf eine neuere Version aktualisieren?
Piotr Jurkiewicz
2
Das Kopieren neuer Dateien vom Zweig in das Arbeitsverzeichnis funktioniert nicht :(
pykiss
5

Obwohl aus den anderen Antworten hervorgeht, dass es derzeit keine Möglichkeit gibt, dies direkt im Git-Repository zu tun, ist es (dank der Antwort auf eine andere Frage :)) einfach , ein Skript zu schreiben, das die Bäume zweier Commits extrahiert in temporäre Verzeichnisse und führen Sie meld auf diesen aus, wobei beide Verzeichnisse entfernt werden, wenn meld beendet wird:

http://gist.github.com/498628

Natürlich verlieren Sie alle Änderungen, die per Meld vorgenommen wurden, aber ich denke, es ist sehr schön, einen schnellen Überblick über die Unterschiede zu erhalten.

Mark Longair
quelle
3

Ich denke, ein einfacher Weg, dies zu tun, ist git reset --soft:

Ziel: Vergleiche die Unterschiede zwischen branch_a und branch_b mit meld

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .
Echtzeit
quelle
0

In Git V1.7.9 können Sie zwei Commits ohne die Befehlszeile vergleichen:

Sie müssen in 'git gui' Bearbeitungsoptionen global konfigurieren: "Merge-Tool verwenden: meld".

Starten Sie gitk , wählen Sie ein Commit aus, klicken Sie mit der rechten Maustaste auf ein anderes Commit> " diff this -> selected ". Klicken Sie unter "Patch" mit der rechten Maustaste auf eine Datei> " external diff ".

meld startet und zeigt das noch ausgewählte erste Commit auf der rechten Seite an.

Stefan Forster
quelle
0

Fügen Sie für Meld unter macOS Folgendes zu Ihrem hinzu, ~/.gitconfigwie vom Betreuer der macOS-Anwendung empfohlen, yousseb :

[diff]
  tool = meld
[difftool]
  prompt = false
[difftool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\"
[merge]
  tool = meld
[mergetool]
  prompt = false
[mergetool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

Sie können die mergeKonfigurationen weglassen, wenn Sie möchten.

@ GutenYes Antwort hat für mich aufgrund der automatischen Flucht und / oder etwas mit nicht geklapptzsh .

evan.bovie
quelle