Подтвердить что ты не робот

Git diff с номерами строк (Git журнал с номерами строк)

Когда я делаю git diff или git log -p, как мне получить номера строк исходного файла (ов), вложенных в выводе?

Я попытался найти его man git-diff | grep "line numbers", и я попробовал googling, но ничего не получил быстро.

4b9b3361

Ответ 1

Вы не можете получить номера для чтения человеком с помощью git diff

В настоящее время нет опций для получения номеров строк, отображаемых вертикально со стороны с помощью git diff.

Формат Unified-diff

Эта информация доступна в заголовках (c) hunk для каждого изменения в diff, но это просто в формате унифицированного-diff:

@@ -start,count +start,count @@

Исходное состояние файла представлено -, а новое состояние представлено + (они не означают добавления и удаления в заголовке hunk. start представляет номер стартовой строки каждого версия файла, а count - количество строк, начиная с начальной точки.

Пример

diff --git a/osx/.gitconfig b/osx/.gitconfig
index 4fd8f04..fcd220c 100644
--- a/osx/.gitconfig
+++ b/osx/.gitconfig
@@ -11,7 +11,7 @@ <== HERE!
 [color "branch"]
        upstream = cyan
 [color "diff"]
-       meta = yellow
+       meta = cyan
        plain = white dim
        old = red bold
        new = green bold

Заголовок заголовка

@@ -11,7 +11,7 @@

говорит, что предыдущая версия файла начинается с строки 11 и включает в себя 7 строк:

11  [color "branch"]
12         upstream = cyan
13  [color "diff"]
14 -       meta = yellow
14 +       meta = cyan
15         plain = white dim
16         old = red bold
17         new = green bold

в то время как следующая версия файла также начинается с строки 11, а также включает 7 строк.

Формат Unified-diff на самом деле не предназначен для потребления человеком

Как вы, вероятно, можете сказать, формат unified-diff не позволяет легко определить номера строк (по крайней мере, если вы не являетесь машиной). Если вам действительно нужны номера строк, которые вы можете прочитать, вам нужно будет использовать отличный инструмент, который отобразит их для вас.

Дополнительное чтение

Ответ 2

Вот еще два решения, расширяющие код Энди Тальковски.

Простой текст:

  git diff | gawk 'match($0,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
   /^(---|\+\+\+|[^-+ ])/{print;next};\
   {line=substr($0,2)};\
   /^-/{print "-" left++ ":" line;next};\
   /^[+]/{print "+" right++ ":" line;next};\
   {print "(" left++ "," right++ "):"line}'

Цветной текст, предполагая, что \033[66m - это формат цветовых кодов:

  git diff --color=always | \
    gawk '{bare=$0;gsub("\033[[][0-9]*m","",bare)};\
      match(bare,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
      bare ~ /^(---|\+\+\+|[^-+ ])/{print;next};\
      {line=gensub("^(\033[[][0-9]*m)?(.)","\\2\\1",1,$0)};\
      bare~/^-/{print "-"left++ ":" line;next};\
      bare~/^[+]/{print "+"right++ ":" line;next};\
      {print "("left++","right++"):"line;next}'

Код изменяет строки, начинающиеся с - или + на -1:- или +1:+, и строки, начинающиеся с до (5,6): Номера являются номерами строк из соответствующего файла.

Ответ 3

Вот script, который пытается исправить это - не проверял его в гневе, но кажется, что это нормально. Он использует записи git diff и использует awk для поддержания количества строк.

# Massage the @@ counts so they are usable
function prep1() {
   cat | awk -F',' 'BEGIN { convert = 0; }
       /^@@ / { convert=1; }
       /^/  { if ( convert == 1 ) { print $1,$2,$3;
              } else { print $0;
              }
              convert=0;
             }'
}

# Extract all new changes added with the line count
function prep2() {
  cat | awk 'BEGIN { display=0; line=0; left=0; out=1;}
     /^@@ / { out=0; inc=0; line=$4; line--; display=line; left=line;        }
     /^[-]/   { left++; display=left; inc=0; }
     /^[+]/   { line++; display=line; inc=0; }
     /^[-+][-+][-+] / { out=0; inc=0; }
     /^/    { 
               line += inc;
               left += inc;
               display += inc;
               if ( out == 1 ) {
                   print display,$0;
               } else {
                   print $0;
               }
               out = 1;
               inc = 1;
               display = line;
            }'
} 

git diff $1 | prep1 | prep2 

Ответ 4

Вы можете попробовать

git blame

в файле. Он показывает вам коммиттер, идентификатор фиксации и номер строки для каждой строки в файле.

Ответ 5

Вы можете использовать git difftool для выполнения сравнения с внешним редактором, который будет отображать номера строк. Вот как это сделать с помощью vim/vimdiff:

  1. Установите vimdiff как git difftool:

    git config --global diff.tool vimdiff
    
  2. Сконфигурируйте ~/.vimrc для автоматического отображения номеров строк при использовании vimdiff:

    if &diff
        set number
    endif
    
  3. Запустите git difftool, который будет использовать vimdiff с номерами строк:

    git difftool
    

Ответ 6

Быстрый способ - использовать git diff -U0. Это установит строки контекста на 0, что приведет к тому, что значения @@будут соответствовать фактическим измененным строкам. По умолчанию значения @@включают 3 строки контекста до/после, что неудобно для человека.

Пример:

git diff # default
@@ -10,8 +10,8 @@

Трудно рассчитать номера строк измененных строк, потому что строка 10 ссылается на первую строку контекста before. Фактический номер строки первой измененной строки составляет 10 + 3 = 13. Чтобы рассчитать количество измененных строк, необходимо также вычесть контекст до и после: 8-3-3 = 2.

git diff -U0
@@ -13,2 +13,2 @@

Как видите, установка context = 0 облегчает чтение значений @@для людей. Вы можете видеть, что измененные строки начинаются со строки 13, и есть две измененные строки.

Это не идеально, так как он показывает только номер строки для каждого блока. Если вы хотите видеть номера строк для каждой строки, используйте difftool для внешнего редактора. См. fooobar.com/questions/122400/...

Ответ 7

Я хотел бы использовать git difftool с Meld как мой difftool. На него проще смотреть, чем на git diff, он имеет хорошее сравнение git diff интерфейса и показывает номера строк.

Ответ 8

Вы всегда можете использовать кошку. Недостатком является то, что вы потеряете цвета.

Пример:

git diff yourfile.cpp | cat -n