В Git'е, как я могу сравнить один и тот же файл между двумя разными коммитами (не смежными) на одной ветке (например, master)?
Я ищу функцию сравнения, подобную той, что есть в Visual SourceSafe (VSS) или Team Foundation Server (TFS). Возможно ли это в Git'е?
Из руководства 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
Вы также можете сравнить два разных файла в двух разных ревизиях, например, так:
git diff <revision_1>:<file_1> <revision_2>:<file_2>
Если вы настроены на "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 [это мой любимый diff и объединить инструмент]
[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\"
Проверить $ журнале git
, скопируйте ша идентификатор 2 разных коммитов, а затем выполнить команду `git для различий с теми идентификаторами, например:
$ git diff (sha-id-one) (sha-id-two)
Вот Perl-скрипт, который выводит команды git diff для данного файла, как найти в команду журнала ЖКТ.
например
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
которые затем могут быть сокращены Н вставленные в окна сеанса оболочки или передается в /бен/ш.
Примечания:
Код:
# 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;
}
Если у вас есть несколько файлов или каталогов и хочу сравнить номера непрерывного обязывает, вы могли бы сделать это:
Сделать временную ветку
git checkout -b revision
Перемотка к первому фиксации цели
git reset --hard <commit_target>
Сбор вишни на тех, кто совершал интересно
git cherry-pick <commit_interested> ...
Применить дифф
git diff <commit-target>^
Когда вы сделали
git branch -D revision
Если вы хотите сделать diff с более чем один файл, с помощью метода, указанного @mipadi:
Е. Г. разница между "голова" и свой "хозяин", чтобы найти все.файлы кофе:
git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`
Это будет рекурсивно искать свой your_search_folder/
для всех .кофе
файлы, и делать различий между ними и варианты их "мастер".
Если вы хотите простое визуальное сравнение в Windows, таких как вы можете получить в VSS и TFS, попробуйте это:
Примечание: после обновления до Windows 10 я потерял контекст функции ЖКТ меню. Однако, вы можете достичь того же с помощью 'гифок' или 'гифок именем' в окно команд.
После того, как вы называете 'ГИТ истории' инструмент GUI для Git будет начать с истории файла в левом верхнем углу панели. Выберите одну из версий вы хотели бы сравнить. Затем щелкните правой кнопкой мыши по второму варианту и выбрать
Дифф это -> выбранный
или
Сравнить выбранные -> это
Цветовая кодировка различия появляются в нижней левой панели.