remove - make git tag




Как мне разбить один и тот же файл между двумя разными коммитами в одной ветви? (7)

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

Я ищу функцию сравнения, например, в Visual SourceSafe (VSS) или Team Foundation Server (TFS). Возможно ли это в Git?


Вот скрипт 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;
}

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

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\"

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

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


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

Создание временной ветви

git checkout -b revision

Перемотка назад к первой цели фиксации

git reset --hard <commit_target>

Выбор вишни на тех, кто заинтересован

git cherry-pick <commit_interested> ...

Применить diff

git diff <commit-target>^

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

git branch -D revision

Еще один способ использовать git's awesomeness ...

git difftool HEAD [email protected]{N} /PATH/FILE.ext

Из git-diff системы 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