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?
Aus der git-diff
Manpage:
git diff [--options] <commit> <commit> [--] [<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
Sie können auch zwei verschiedene Dateien in zwei verschiedenen Revisionen vergleichen, etwa so:
git diff <revision_1>:<file_1> <revision_2>:<file_2>
Wenn Sie das "difftool" 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\"
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)
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:
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;
}
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 <commit_target>
Die Kirsche hackt auf Interessierten herum
git cherry-pick <commit_interested> ...
Diff anwenden
git diff <commit-target>^
Wenn Sie fertig sind
git branch -D revision
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 ihren
Master'-Versionen gemacht.
Wenn Sie einen einfachen visuellen Vergleich unter Windows wünschen, wie Sie ihn in VSS oder TFS erhalten können, versuchen Sie dies:
Hinweis: Nach dem Upgrade auf Windows 10 habe ich die Optionen des Git-Kontextmenüs verloren. Sie können jedoch dasselbe mit 'gitk' 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.