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.


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.


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

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

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, 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.


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 .

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.


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 .

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.