Як я можу порівняти один і той же файл між двома різними комітами (не суміжними) в одній гілці (наприклад, master) у Git?
Я шукаю функцію порівняння, як та у Visual SourceSafe (VSS) або Team Foundation Server (TFS).
Чи можливо це в Git?
Як я можу порівняти один і той же файл між двома різними комітами (не суміжними) в одній гілці (наприклад, master) у Git?
Я шукаю функцію порівняння, як та у 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
--
корисно, наприклад, коли у вас є ім'я файлу -p
. Добре використовувати в сценаріях, тільки в рідкісних випадках, необхідних на практиці.
Ви також можете порівняти два різних файли у двох різних редакціях, таких як:
git diff <revision_1>:<file_1> <revision_2>:<file_2>
<file_1>
і <file_2>
знаходяться в поточному каталозі, а нема на рівень верхнього мерзотник керованого каталогу, один повинен препенд ./
на Unix:<revision_1>:./filename_1
Якщо ви налаштували "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 або у файлі 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\"
Перевірте $ git log
, скопіюйте ідентифікатор SHA-1 двох різних комітетів і запустіть git diff
команду з цими ідентифікаторами. наприклад:
$ git diff (sha-id-one) (sha-id-two)
git diff (sha-id-one) (sha-id-two) -- filename.ext
без імені файлу він відображатиме різницю всіх файлів у цих двох комітах.
Якщо ви хочете побачити всі зміни у файлі між двома комісіями на принципі "виконувати", ви також можете зробити це
git log -u $start_commit..$end_commit -- path/to/file
Ось сценарій Perl, який виводить команди 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
який потім можна вирізати та вставити у вікно сеансу оболонки або прокласти в нього /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;
}
Якщо ви хочете зробити різницю з більш ніж одним файлом, за допомогою методу, визначеного @mipadi:
Наприклад відмінностей між HEAD
і ваш master
, щоб знайти всі .coffee
файли:
git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`
Це дозволить рекурсивно шукати your_search_folder/
всі .coffee
файли та робити різницю між ними та їх master
версіями.
Якщо у вас є декілька файлів або каталогів і ви хочете порівняти неперервні коміти, ви можете зробити це:
Зробити тимчасову гілку ( "перегляд" у цьому прикладі)
git checkout -b revision
Перемотайтеся на першу ціль фіксації
git reset --hard <commit_target>
Вишня вибирає на тих, хто цікавиться
git cherry-pick <commit_interested> ...
Застосувати розл
git diff <commit-target>^
Коли ви зробили
git branch -D revision
Якщо ви хочете просте візуальне порівняння в Windows, наприклад, ви можете отримати в Visual SourceSafe або Team Foundation Server (TFS), спробуйте це:
Примітка. Після оновлення до Windows 10 я втратив параметри контекстного меню Git. Однак ви можете досягти того ж, використовуючи 'gitk' або 'gitk filename' у вікні команд.
Після виклику "Історії Git" запуститься інструмент Git GUI з історією файлу у верхній лівій області. Виберіть одну з версій, яку ви хочете порівняти. Потім клацніть правою кнопкою миші другу версію і виберіть будь-яку
Відмінніть це -> вибрано
або
Виділено різницю -> це
На нижній лівій панелі відображаються кольорові відмінності.
..
Чи не є необхідним, хоча він буде працювати з ним ( за винятком досить старих версій, може бути). Ви також можете використовуватиgit log
абоgitk
знаходити SHA1, які слід використовувати, якщо два комітети будуть дуже далеко один від одного.gitk
у своєму контекстному меню також є "diff selected -> this" та "diff this -> selected".