Jak odróżnić ten sam plik pomiędzy dwoma różnymi commitami w tej samej gałęzi?

W Git, Jak mogę porównać ten sam plik pomiędzy dwoma różnymi commitami (nie sąsiadującymi) w tej samej gałęzi (na przykład master)?

Szukam Porównaj funkcja taka jak w Visual SourceSafe (VSS) lub Team Foundation Server (TFS). Czy jest to możliwe w Git?

 902
Author: Fabio Turati, 2010-07-26

10 answers

Z git-diff manpage:

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

Na przykład, aby zobaczyć różnicę dla pliku " main.c " pomiędzy now a dwoma commitami z powrotem, oto trzy równoważne polecenia:

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c
 1196
Author: mipadi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-20 05:25:17

Możesz również porównać dwa różne pliki w dwóch różnych wersjach, Jak to:

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

 220
Author: Jakub Narębski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-27 12:18:06

Jeśli skonfigurowałeś "difftool" możesz użyć

git difftool revision_1:file_1 revision_2:file_2

Przykład: porównanie pliku z ostatniego commita do poprzedniego commita w tej samej gałęzi: Zakładając, że jeśli znajdujesz się w głównym folderze projektu

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

Powinieneś mieć następujące wpisy w swoim~/.gitconfig lub w projekcie/.plik Git / config. Zainstaluj p4merge [to jest moje preferowane narzędzie do różnicowania i scalania]

[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\"
 69
Author: Anver Sadhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-18 09:03:09

Jeśli chcesz zobaczyć wszystkie zmiany w pliku pomiędzy dwoma commitami na podstawie commit-by-commit, możesz również wykonać

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

 36
Author: cxreg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-26 20:50:54

Sprawdź $ git log, skopiuj SHA id 2 różnych zatwierdzeń i uruchom git diff Polecenie z tymi identyfikatorami, na przykład:

$ git diff (sha-id-one) (sha-id-two)
 35
Author: Vibhuti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-20 17:24:18

Tutaj znajduje się skrypt Perla, który wypisuje polecenia git diff dla danego pliku, które znajdują się w Komendzie Git log.

Np.

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

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

, które następnie można wyciąć N wklejając w sesji okna powłoki lub przesłać do /bin / sh.

Uwagi:

  1. Liczba (3 w tym przypadku) określa, ile linii wydrukować
  2. plik (pom.xml w tym przypadku) musi zgadzać się w obu miejscach (można go zawinąć w funkcję powłoki, aby dostarczyć ten sam plik w obu miejsca) lub umieścić go w katalogu bin jako skrypt powłoki

Kod:

# 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
Author: user2520657,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-11 22:24:10

Jeśli masz kilka plików lub katalogów i chcesz porównać nieciągłe commity, możesz to zrobić:

Stwórz gałąź czasową

git checkout -b revision

Przewiń do pierwszego celu zatwierdzenia

git reset --hard <commit_target>

Cherry picking on those commit interested

git cherry-pick <commit_interested> ...

Zastosuj diff

git diff <commit-target>^

Kiedy skończysz

git branch -D revision
 12
Author: dvdvck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-25 14:08:51

Jeśli chcesz zrobić diff z więcej niż jednym plikiem, przy pomocy metody podanej przez @mipadi:

Np. diff pomiędzy HEAD a twoim master, aby znaleźć wszystkie .coffee pliki:

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

Spowoduje to rekurencyjne przeszukanie your_search_folder/ w poszukiwaniu wszystkich .coffee plików i utworzenie różnic między nimi a ich wersjami master.

 11
Author: Andrei Petre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-30 15:04:43

To kolejny sposób na wykorzystanie wspaniałości Gita ...

git difftool HEAD HEAD@{N} /PATH/FILE.ext
 8
Author: Eddie B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-02 20:13:45

Jeśli chcesz proste wizualne porównanie Na Windows, takie jak można uzyskać w VSS lub TFS, spróbuj tego:

  • Kliknij prawym przyciskiem myszy plik w Eksploratorze plików
  • Wybierz 'Git History'

Uwaga: Po aktualizacji do Windows 10 utraciłem opcje menu kontekstowego git. Jednak możesz osiągnąć to samo używając 'gitk' lub 'gitk filename' w oknie poleceń.

Jeśli kliknąłeś na 'Git History', narzędzie GUI uruchomi się z historią pliku w lewym górnym okienku. Wybierz jedną z wersji, które chcesz porównać. Następnie kliknij prawym przyciskiem myszy na drugiej wersji i wybierz

Diff this - > selected

LUB

Diff selected - > this

Różnice oznaczone kolorami pojawią się w lewym dolnym okienku.

 1
Author: Resource,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-09 13:57:45