Wie kann ich die gleiche Datei zwischen zwei verschiedenen Commits im gleichen Zweig vergleichen?

Wie kann ich in Git dieselbe Datei zwischen zwei verschiedenen (nicht zusammenhängenden) Übertragungen auf demselben Zweig (z. B. Master) vergleichen?

Ich suche nach einer Vergleichsfunktion, wie sie in Visual SourceSafe (VSS) oder Team Foundation Server (TFS) vorhanden ist. Ist das in Git möglich?

Lösung

Aus der git-diff Manpage:

git diff [--options]   [--] [<path>...]

Um zum Beispiel den Unterschied zwischen der Datei "main.c" und zwei Übertragungen zurück zu sehen, gibt es drei gleichwertige Befehle:

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c
Kommentare (12)

Sie können auch zwei verschiedene Dateien in zwei verschiedenen Revisionen vergleichen, etwa so:

git diff <revision_1>:<file_1> <revision_2>:<file_2>

Kommentare (3)

Wenn Sie das "difftool&quot konfiguriert haben; konfiguriert haben, können Sie

git difftool revision_1:file_1 revision_2:file_2

Beispiel: Vergleichen einer Datei von ihrer letzten Übertragung mit ihrer vorherigen Übertragung auf demselben Zweig: Angenommen, dass, wenn Sie sich in Ihrem Projekt-Root-Ordner befinden

$git difftool HEAD:src/main/java/com.xyz.test/MyApp.java HEAD^:src/main/java/com.xyz.test/MyApp.java

Sie sollten die folgenden Einträge in Ihrer ~/.gitconfig oder in der Datei project/.git/config haben. Installieren Sie p4merge [Dies ist mein bevorzugtes Diff- und Merge-Werkzeug].

[merge]
    tool = p4merge
    keepBackup = false
[diff]
    tool = p4merge
    keepBackup = false
[difftool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
[mergetool]
    keepBackup = false
[difftool]
    keepBackup = false
[mergetool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
    cmd = p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
Kommentare (0)

Prüfen Sie $ git log, kopieren Sie dann die SHA-ID von 2 verschiedenen Commits und führen Sie dann z.B. den Befehl git diff mit diesen ids aus:

$ git diff (sha-id-one) (sha-id-two)
Kommentare (3)

Wenn Sie alle Änderungen an der Datei zwischen den beiden Commits auf einer Commit-by-Commit-Basis sehen möchten, können Sie auch Folgendes tun

git log -u $start_commit..$end_commit -- path/to/file

Kommentare (2)

Hier ist ein Perl-Skript, das Git-Diff-Befehle für eine gegebene Datei ausgibt, wie sie in einem Git-Log-Befehl zu finden sind.

z.B.

git log pom.xml | perl gldiff.pl 3 pom.xml

Renditen:

git diff 5cc287:pom.xml e8e420:pom.xml
git diff 3aa914:pom.xml 7476e1:pom.xml
git diff 422bfd:pom.xml f92ad8:pom.xml

die dann in einer Shell-Fenster-Sitzung N-geklebt oder nach /bin/sh gepiped werden konnte.

Anmerkungen:

  1. die Zahl (in diesem Fall 3) gibt an, wie viele Zeilen gedruckt werden sollen
  2. Die Datei (in diesem Fall pom.xml) muss an beiden Stellen übereinstimmen (Sie könnten sie in eine Shell-Funktion einbinden, um an beiden Stellen die gleiche Datei bereitzustellen) oder sie als Shell-Skript in ein Bin-Verzeichnis legen

Kodex:

# gldiff.pl
use strict;

my $max  = shift;
my $file = shift;

die "not a number" unless $max =~ m/\d+/;
die "not a file"   unless -f $file;

my $count;
my @lines;

while () {
    chomp;
    next unless s/^commit\s+(.*)//;
    my $commit = $1;
    push @lines, sprintf "%s:%s", substr($commit,0,6),$file;
    if (@lines == 2) {
        printf "git diff %s %s\n", @lines;
        @lines = ();
    }
    last if ++$count >= $max *2;
}
Kommentare (0)

Wenn Sie mehrere Dateien oder Verzeichnisse haben und nicht kontinuierliche Übergaben vergleichen möchten, können Sie dies tun:

Erzeugen Sie einen temporalen Zweig

git checkout -b revision

Zum ersten Commit-Ziel zurückspulen

git reset --hard 

Die Kirsche hackt auf Interessierten herum

git cherry-pick  ...

Diff anwenden

git diff ^

Wenn Sie fertig sind

git branch -D revision
Kommentare (1)

Wenn Sie einen Diff mit mehr als einer Datei durchführen möchten, verwenden Sie die durch @mipadi angegebene Methode:

Z.B. diff zwischen HEAD und Ihrem master, um alle `.coffee'-Dateien zu finden:

git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`

Dadurch wird Ihr Ihr_Suchordner/ rekursiv nach allen .coffee'-Dateien durchsucht und eine Unterscheidung zwischen ihnen und ihrenMaster'-Versionen gemacht.

Kommentare (0)

Nur eine andere Art git's awesomeness zu nutzen ...

git difftool HEAD HEAD@{N} /PATH/FILE.ext
Kommentare (1)

Wenn Sie einen einfachen visuellen Vergleich unter Windows wünschen, wie Sie ihn in VSS oder TFS erhalten können, versuchen Sie dies:

  • Klicken Sie mit der rechten Maustaste auf die Datei im Datei-Explorer
  • wählen Sie 'Git-Geschichte'

Hinweis: Nach dem Upgrade auf Windows 10 habe ich die Optionen des Git-Kontextmenüs verloren. Sie können jedoch dasselbe mit 'gitk&#39 erreichen; oder 'gitk filename' in einem Befehlsfenster.

Sobald Sie 'Git History' aufrufen, startet das Git-GUI-Tool, mit einer Historie der Datei im oberen linken Fensterbereich. Wählen Sie eine der Versionen aus, die Sie vergleichen möchten. Klicken Sie dann mit der rechten Maustaste auf die zweite Version und wählen Sie entweder

Diff dies -> ausgewählt

oder

Diff ausgewählt -> dieses

Farbcodierte Unterschiede werden im unteren linken Fensterbereich angezeigt.

Kommentare (1)