В git, как я могу сравнить один и тот же файл между двумя разными коммитами (непересекающимися) в одной ветки (например, master)?
Я ищу функцию Сравнить, такую как VSS или TFS, возможно ли это в Git?
В git, как я могу сравнить один и тот же файл между двумя разными коммитами (непересекающимися) в одной ветки (например, master)?
Я ищу функцию Сравнить, такую как VSS или TFS, возможно ли это в Git?
Из git-diff
manpage:
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>
Если вы настроили "diffftool", вы можете использовать
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 или в файле project/.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\"
Если вы хотите увидеть все изменения в файле между двумя коммитами на основе commit-by-commit, вы также можете сделать
git log -u $start_commit..$end_commit -- path/to/file
Проверьте $ git log
, затем скопируйте SHA-идентификатор из двух разных коммитов, а затем запустите команду git diff
с этими идентификаторами, например:
$ git diff (sha-id-one) (sha-id-two)
Вот perl script, который выводит команды git diff для заданного файла, найденные в команде журнала git.
например.
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.
Примечания:
код:
# 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;
}
Если вы хотите сделать diff с более чем одним файлом, с помощью метода, указанного @mipadi:
например. diff между HEAD
и вашим master
, чтобы найти все .coffee
файлы:
git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`
Это будет рекурсивно искать ваши your_search_folder/
для всех .coffee
файлов и делать разницу между ними и их версиями master
.
Еще один способ использовать git удивительность...
git difftool HEAD [email protected]{N} /PATH/FILE.ext
Если у вас несколько файлов или каталогов и вы хотите сравнить неконфиденциальные коммиты, вы можете сделать это:
Сделайте временную ветвь
git checkout -b revision
Перемотка назад к первой цели фиксации
git reset --hard <commit_target>
Выбор вишни на тех, кого интересует
git cherry-pick <commit_interested> ...
Применить diff
git diff <commit-target>^
Когда вы закончили
git branch -D revision
Если вам нужно простое визуальное сравнение в Windows, например, вы можете попасть в VSS или TFS, попробуйте следующее:
Запустится инструмент GUI Git с историей файла в верхней левой панели. Выберите одну из версий, которые вы хотели бы сравнить. Затем щелкните правой кнопкой вторую версию и выберите
Diff this → selected
или
Diff selected → this
В нижней левой панели появятся цветовые коды.