Как мне разнести один и тот же файл между двумя разными коммитами в одной ветке? - PullRequest
1020 голосов
/ 26 июля 2010

В Git, как я могу сравнить один и тот же файл между двумя разными коммитами (не смежными) в одной и той же ветке (например, master)?

Я ищу сравнитьФункция аналогична Visual SourceSafe (VSS) или Team Foundation Server (TFS).Возможно ли это в Git?

Ответы [ 10 ]

1342 голосов
/ 26 июля 2010

Из справочной страницы git-diff:

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

Например, чтобы увидеть разницу для файла "main.c" между сейчас и двумя коммитами назад, вот триэквивалентные команды:

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c
249 голосов
/ 27 июля 2010

Вы также можете сравнить два разных файла в двух разных ревизиях, например:

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

80 голосов
/ 03 января 2012

Если вы настроили «difftool», вы можете использовать

git difftool revision_1:file_1 revision_2:file_2

Пример: сравнение файла из его последнего коммита с его предыдущим коммитом в той же ветке: при условии, что вы находитесь в корневом каталоге проектапапка

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

У вас должны быть следующие записи в вашем ~ / .gitconfig или в файле проекта / .git / config.Установите p4merge [Это мой любимый инструмент сравнения и слияния]

[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\"
42 голосов
/ 19 апреля 2012

Проверьте $ git log, затем скопируйте идентификатор SHA 2 разных коммитов и затем выполните команду git diff с этими идентификаторами, например:

$ git diff (sha-id-one) (sha-id-two)
39 голосов
/ 27 июля 2010

Если вы хотите видеть все изменения в файле между двумя коммитами на основе коммитов, вы также можете сделать

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

21 голосов
/ 12 июля 2013

Вот скрипт perl, который выводит команды git diff для данного файла, как это указано в команде git log.

, например

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

, который можно затем вырезать N, вставить в сеанс окна оболочки или передать в /bin/sh.

Примечания:

  1. число (в данном случае 3) указывает, сколько строк вывести
  2. файл (в данном случае pom.xml) должен согласовываться в обоих местах (вы можете заключить его в функцию оболочки, чтобы обеспечить одинаковый файл в обоих местах) или поместить его в папку bin в качестве сценария оболочки

Код:

# 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;
}
13 голосов
/ 25 августа 2012

Если у вас есть несколько файлов или каталогов и вы хотите сравнить непостоянные коммиты, вы можете сделать это:

Сделать временную ветвь

git checkout -b revision

Перемотка на первую цель коммита

git reset --hard <commit_target>

Вишня на коммит заинтересовала

git cherry-pick <commit_interested> ...

Apply diff

git diff <commit-target>^

Когда вы закончите

git branch -D revision
11 голосов
/ 30 ноября 2012

Если вы хотите создать diff с более чем одним файлом, используя метод, указанный в @mipadi:

например. Разница между HEAD и вашим master, чтобы найти все .coffee файлы:

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

Это будет рекурсивно искать в вашем your_search_folder/ все .coffee файлы и проводить различия между ними и их master версиями.

8 голосов
/ 03 августа 2012

Просто еще один способ использовать удивительность git ...

git difftool HEAD HEAD@{N} /PATH/FILE.ext
1 голос
/ 08 января 2015

Если вам нужно простое визуальное сравнение в Windows, такое как вы можете получить в VSS или TFS, попробуйте это:

  • щелкните правой кнопкой мыши файл в проводнике
  • выберите «История Git»

Примечание: после обновления до Windows 10 я потерял опции контекстного меню git. Тем не менее, вы можете добиться того же, используя «gitk» или «gitk filename» в командном окне.

Как только вы вызовете «Git History», запустится инструмент Git GUI, с историей файла в верхней левой панели. Выберите одну из версий, которую вы хотите сравнить. Затем щелкните правой кнопкой мыши на второй версии и выберите либо

Diff this -> selected

или

Diff selected -> this

Различия в цветовой кодировке появятся в нижней левой панели.

...