Wie bringt man Diff dazu, wie Git-Diff zu arbeiten?


147

Ich mag die Ausgabeformatierung von git diff. Die Farbe und die +/ -Darstellung von Änderungen zwischen Zeilen ist leichter zu lesen als GNU diff.

Ich kann git diffmit --no-indexFlag außerhalb eines Git Repo laufen und es funktioniert gut. Es scheint jedoch die --excludeOption zum Ausschließen von Dateien oder Unterverzeichnissen von einem Rekursiv zu fehlen diff.

Gibt es eine Möglichkeit, das Beste aus beiden Welten zu bekommen? (Farboptionen und +/ -Format git diffund --excludeOption von GNU diff).

Ich habe damit experimentiert colordiff, aber ich bevorzuge immer noch das Ausgabeformat vongit diff


1
Wechseln Sie newtextin, um das Blau für Ergänzungen grün zu machen /etc/colordiff. Ich denke, Git verwendet Grün?
Rudie

1
Ich hatte bis jetzt noch nie von der Flagge --no-index gehört. Ich habe es gerade verwendet, um die Ausgabe von git show mit dem Unterschied zweier Dateien zu vergleichen - danke dafür!
AJM-Reinstate-Monica

Antworten:


175

Ich weiß nicht, wie man Farbe macht, aber das macht +/-eher das als <und >.

diff -u file1 file2

6
Cool, das kombiniert mit Colordiff bringt mich nah genug an das heran, was ich will. Ich schätze, ich muss das nächste Mal weiter unten auf der Manpage scrollen ... Danke!
Mzzzzzz

13
Eine einfache Möglichkeit, die Färbung mit diff -u zu erhalten, besteht darin, die Ausgabe an tig, den Befehlszeilen-Git-Repo-Viewer, weiterzuleiten : diff -u file1 file2 | tig.
Samuel Lampa

3
Installieren Sie es colordiffvon Ihrem apt / yum / pacman-Repository und verwenden Sie es.
iBug

Erforderlich, um Extra Packages für Enterprise Linux (EPEL) unter Amazon Linux für die Installation zu aktivierencolordiff : docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
Pat Myron

1
Außerdem colordiffkönnen Sie vimdurch Definieren auch Farbe erhalten cdiff() { diff -u $@ | vim -R -; }.
Syrtis Major

94

Sie können auch verwenden git diff --no-index -- A B(über Manpage ).


1
+1, aber leider funktioniert dies nicht, wenn eine der Dateien ein Symlink ist.
Emil Lundberg

2
Diese +1 ist sehr nützlich , da es zeigt , wie git Bericht zu machen , wo zwei Dateien aufgespürt Aund Bunterscheiden sich im Vergleich zu jedem anderen statt , wo jede Datei auf ihre jeweils letzte Revision geändert relativ ist.
J. Katzwinkel

@EmilLundberg: funktioniert für mich mit Symlinks in Git 1.9.1 unter Linux. Ich weiß nicht, ob frühere Versionen kaputt sind.
km

3
git diff --no-indexist großartig, aber wie das OP hervorhob, fehlt ihm die --excludeFlagge, so dass es oft von sehr begrenztem Nutzen ist.
Ken Williams

25
  1. Installieren Sie colordiff .

  2. Aktualisieren Sie Ihre ~ / .colordiffrc (kopieren Sie ggf. zuerst / etc / colordiffrc):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. Verwenden Sie diese Option colordiff -u file1 file2für zwei Dateien oder colordiff -ruN path1 path2zum rekursiven Vergleichen von Pfaden.

Es ist nicht genau das gleiche, aber es ist sehr nah.


18

Dies ist, was ich vorschlage und es ist ziemlich nah

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: Sie müssen dies installieren
    • brew install colordiff auf meinem Mac.
    • port install colordiff auf einigen Macs.
    • sudo apt-get install colordiff auf Debian oder Ubuntu
    • Laden Sie für andere Plattformen die Quelle von der Hauptseite oder von GitHub herunter und befolgen Sie die Installationsanweisungen
  • -R: Dies weist Less an, Farben anstelle der Rohcodes anzuzeigen.

Ich habe es letztendlich verwendet, -wweil ich keine Leerzeichenunterschiede sehen wollte.

diff -w -u FILE1 FILE2 | colordiff | less -R

Bearbeiten: Wie von @Ciprian Tomoiaga im Kommentar vorgeschlagen, können Sie dies zu einer Funktion machen und auch in Ihre ~/.bashrcDatei einfügen .

function gdiff () { diff -u $@ | colordiff | less -R; }

4
Um eine einzige Bash-Funktion dafür zu haben, fügen Sie die .bashrc hinzu:function gdiff () { diff -u $@ | colordiff | less -R; }
Ciprian Tomoiagă

4

GNU diffhat --colorseit Version 3.4 Ende 2016 eine Option gemäß dieser Antwort auf der Unix SE. Das nebenbei -usollte ausreichen, um die Ausgabe von git diff:

diff -u --color=always file1 file2 | less -r

--colorMuss alwaysbei Verwendung in einem Rohr verwendet werden, autoschaltet die Farbe in Rohren aus.

Ich habe dies nur mit Git Bash unter Windows versucht, wo less -Rnur die erste Zeile eines Stücks eingefärbt wurde. less -rhat es für mich in diesem Fall behoben.


3

Mit nur bash, diff, tput, und lesskönnen wir den Ausgang eng annähern git diff. Aufgrund der Kurzsichtigkeit der diffProgrammierer wird es jedoch einige bemerkenswerte Unterschiede geben .

Fügen Sie die folgende Bash-Funktionsdefinition in eine Datei ein, die automatisch von Ihrem Benutzerkonto bezogen wird, und Sie können über die Befehlszeile auf die Funktion zugreifen:

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

Diese Funktion funktioniert wie folgt:

  1. Letzten Endes, diffWird mit verschiedenen Formatierungsoptionen aufgerufen, um festzulegen, wie Änderungen in den Dateien angezeigt werden.
  2. tputwird verwendet, um ANSI-Farbcodes in diese Formatierungsoptionen einzufügen. Beachten Sie, dass bei Nicht-ANSI - Terminals verwenden, können Sie ersetzen müssen tput setafmit tput setf.
  3. Der Ausgang von diffwird in geleitet less. -Rermöglicht die Beibehaltung von ANSI-Farben. -Xverhindert, dass lessder Bildschirm beim Verlassen gelöscht wird. -Fverhindert, dass es lessals Pager fungiert, wenn die Ausgabe in einen Bildschirm passt.
  4. Wenn der erste Parameter ist @full, zeigt die Funktion alle unveränderten Zeilen zusätzlich zu den hinzugefügten und entfernten Zeilen an.

Beachten Sie die folgenden Unterschiede zwischen diesem Ansatz und git diff:

  1. git diffmeldet drei Kontextzeilen, die jede Änderung umgeben. Leider diffscheint sich zu beschweren und zu beenden, wenn Sie die Anzahl der Kontextzeilen angeben und gleichzeitig Formatierungsoptionen angeben möchten. (Zumindest in Mac OS X Yosemite). Danke diffProgrammierer. Daher können Sie entweder keine Kontextzeilen für jede Änderung anfordern, was das Standardverhalten ist, oder Sie können anfordern, dass alle unveränderten Zeilen in der Datei ebenfalls gemeldet werden, indem Sie angeben@full als ersten Parameter angeben.
  2. Da sich die Kontextzeilen von unterscheiden git diff, unterscheiden sich auch die von dieser Funktion gemeldeten Zeilennummern von den vongit diff .
  3. Möglicherweise werden einzeilige Änderungen gemeldet. Dies ist das richtige Verhalten. Es ist jedoch ärgerlich, wenn Ihre geänderte Datei das Einfügen einzelner leerer Zeilen enthält. Ich denke, es git diffgeht besser damit um, über seine Kontextlinien. diffWenn Sie möchten, können Sie versuchen, verschiedene Optionen zu übergeben, um besser mit Leerzeichen umzugehen.


2

Platzieren Sie dies in Ihrem .bashrcoder .zshrc:

diff() { git diff --no-index "$1" "$2" | colordiff; }

Anforderungen: gitund colordiffsollte vorher installiert werden.

Verwendung : diff file1 file2

Beispiel: für $diff .tmux.conf .zshrc.pre-oh-my-zsh

Beispiel für eine Diff-Funktion


0

Die andere Möglichkeit besteht darin, dies von außerhalb des Repositorys zu tun, damit git weiß, dass es zwischen Dateien unterschiedlich ist. z.B. eine Shell-Funktion wie:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}

0

Verwenden Sie colordiff :

Installation:

sudo apt-get install colordiff

Verwendung:

colordiff -u file_one file_two

Gibt genau den gleichen Unterschied wie gezeigt git diff.


0

Wenn Sie nicht haben colordiffoder git diff, können Sie Farbe durch bekommen vim.

cdiff() { diff -u $@ | vim -R -; }

oder einfach

cdiff() { diff -u $@ | view -; }

0

Da Fledermaus eine schöne Färbung hat, habe ich getestet, ob das funktioniertdiff und überraschenderweise hat es sehr gut funktioniert.

$ diff file1 file2 | bat oder $ diff -u file1 file2 | bat

Ich nehme an, Sie könnten eine Funktion wie diese unten effizienter gestalten:

function bdiff () { diff -u $@ | bat;}


-2

Ich denke die Konfigurationseinstellung:

[color]
     ui = true

kombiniert mit der --relative=<path>Option "diff" würde das tun, was Sie wollten. Hast du versucht ?


3
Dies ist für den Unterschied in git. Er fragte nach den diffProgrammoptionen
tr33hous
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.