Frage Wie kann ich die gleiche Datei zwischen zwei verschiedenen Commits auf demselben Zweig verteilen?


In Git, wie könnte ich die gleiche Datei zwischen zwei verschiedenen Commits (nicht zusammenhängend) auf dem gleichen Zweig (Master zum Beispiel) vergleichen?

Ich suche nach einem vergleichen Funktion wie die in Visual SourceSafe (VSS) oder Team Foundation Server (TFS). Ist es in Git möglich?


881
2017-07-26 19:10


Ursprung


Antworten:


Von dem git-diff Manpage:

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

Um zum Beispiel den Unterschied für eine Datei "main.c" zwischen jetzt und zwei Commits zurück zu sehen, hier sind drei äquivalente Befehle:

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c

1171
2017-07-26 19:13



Sie können auch zwei verschiedene Dateien in zwei verschiedenen Versionen vergleichen:

git diff <Revision_1>:<Datei_1> <Revision_2>:<Datei_2>


212
2017-07-27 12:18



Wenn Sie das "difftool" konfiguriert haben, das Sie verwenden können

git difftool revision_1:file_1 revision_2:file_2

Beispiel: Vergleiche eine Datei von ihrem letzten Commit mit ihrem vorherigen Commit auf derselben Verzweigung: Angenommen, Sie befinden sich in Ihrem Projektstammordner

$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 Projekt / .git / config Datei haben. Installiere das p4merge [Dies ist mein bevorzugtes Vergleichs- und Mischwerkzeug]

[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\"

68
2018-01-03 11:45



Wenn Sie alle Änderungen an der Datei zwischen den beiden Commits auf Commit-für-Commit-Basis anzeigen möchten, können Sie dies ebenfalls tun

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


36
2017-07-26 20:50



Prüfen $ git logKopieren Sie dann die SHA-ID aus zwei verschiedenen Commits und führen Sie sie aus git diff Befehl mit diesen IDs, zum Beispiel:

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

35
2018-04-19 00:14



Hier ist ein Perl-Skript, das git diff-Befehle für eine bestimmte Datei ausgibt, wie sie in einem git-log-Befehl gefunden wurde.

z.B.

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

Erträge:

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

was könnte dann geschnitten werden N eingefügt in einer Shell-Fenster-Sitzung oder Pipe an / bin / sh.

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önnen sie in eine Shell-Funktion einfügen, um dieselbe Datei an beiden Stellen bereitzustellen) oder sie in ein bin-Verzeichnis als Shell-Skript einfügen

Code:

# 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;
}

21
2017-07-11 22:24



Wenn Sie mehrere Dateien oder Verzeichnisse haben und nicht kontinuierliche Commits vergleichen möchten, können Sie Folgendes tun:

Mach einen temporären Zweig

git checkout -b revision

Zurück zum ersten Commit-Ziel

git reset --hard <commit_target>

Cherry Picking auf denen sich interessiert

git cherry-pick <commit_interested> ...

Diff anwenden

git diff <commit-target>^

Wenn du fertig bist

git branch -D revision

12
2017-08-25 14:08



Wenn Sie mit der von @mipadi angegebenen Methode ein Diff mit mehr als einer Datei erstellen möchten:

Z.B. Diff zwischen HEAD und dein masterum alles zu finden .coffee Dateien:

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

Dies wird rekursiv Ihre suchen your_search_folder/ für alle .coffee Dateien und machen einen Unterschied zwischen ihnen und ihren master Versionen.


11
2017-11-30 15:04



Nur eine weitere Möglichkeit, Git's Großartigkeit zu nutzen ...

git difftool HEAD HEAD@{N} /PATH/FILE.ext

8
2017-08-02 20:13



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

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

Hinweis: Nach dem Upgrade auf Windows 10 habe ich die git-Kontextmenüoptionen verloren. Sie können jedoch dasselbe mit 'gitk' oder 'gitk filename' in einem Befehlsfenster erreichen.

Wenn Sie "Git History" ausgewählt und darauf geklickt haben, wird das Git-GUI-Tool mit einem Verlauf der Datei im oberen linken Bereich gestartet. 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 dieses -> ausgewählt

oder

Diff ausgewählt -> dies

Farbcodierte Unterschiede werden im unteren linken Bereich angezeigt.


0
2018-01-08 14:35