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

Перечислите все версии данного номера строки в истории GIT

Возможно ли в Git перечислить все предыдущие версии данной строки в файле по номеру строки?

Причина, по которой мне показалось бы полезной, - это упростить устранение неполадок, связанных с протоколом трассировки стека протоколов.

то есть. У меня есть undefined method exception, записанный в строке 100 данного файла. Файл включен в множество коммитов, которые заставляют данную строку "перемещаться" вверх и вниз по файлу даже без внесенных в нее изменений.

Как я могу распечатать содержимое строки 100 данного файла через последние х??

4b9b3361

Ответ 1

Это вызовет git blame для каждой значимой версии, чтобы показать строку $LINE файла $FILE:

git log --format=format:%H $FILE | xargs -L 1 git blame $FILE -L $LINE,$LINE

Как обычно, в вине отображается номер ревизии в начале каждой строки. Вы можете добавить

| sort | uniq -c

чтобы получить агрегированные результаты, что-то вроде списка коммитов, которые изменили эту строку. (Не совсем, если только код был перемещен, это может отображать один и тот же идентификатор фиксации дважды для различного содержимого строки. Для более подробного анализа вам нужно будет выполнить отставленное сравнение результатов git blame для смежных коммитов Кто-нибудь?)

Ответ 2

Это не то, о чем вы просите, но с git blame <file> вы можете увидеть фиксацию, которая в последний раз модифицировала каждую строку.

первые столбцы показывают идентификатор фиксации:

$ git blame my-file.txt
65126918 (David Pärsson 2013-07-22 12:53:02 +0200 1) Heading
c6e6d36d (David Pärsson 2013-07-22 12:53:10 +0200 2) =======
65126918 (David Pärsson 2013-07-22 12:53:02 +0200 3) 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 4) Text on first line
8b3d2e15 (David Pärsson 2013-07-22 12:49:49 +0200 5) Text on second line
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 6) Text on third line

Вы можете посмотреть за пределами последней модификации, предоставив ревизию, например

$ git blame 8b3d2e15 my-file.txt

Вы также можете выбрать определенные строки с помощью аргумента -L, например:

$ git blame my-file.txt -L 4,+3
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 4) Text on first line
8b3d2e15 (David Pärsson 2013-07-22 12:49:49 +0200 5) Text on second line
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 6) Text on third line

Более подробную информацию и умные трюки можно найти на странице git -blame man.

Ответ 3

Посмотрите также на этот короткий учебник: http://zsoltfabok.com/blog/2012/02/git-blame-line-history/

В принципе, она проведет вас через комбинацию git blame и git show, чтобы увидеть, какая фиксация изменяет определенную строку (git blame, как уже было предложено особенно в ответе Дэвида Парссона) и как эта строка изменяется (git show <commit-id>). Таким образом, итерация на коммитах, чередующихся git blame <commit-id> git show <commit-id>, даст вам полную историю определенной строки файла.

Кроме того, не забудьте git blame -M, если вы сомневаетесь, что строка была скопирована из другого файла. Из https://www.kernel.org/pub/software/scm/git/docs/git-blame.html

-M | num |

    Обнаружение перемещенных или скопированных строк внутри файла. Когда фиксация перемещает или копирует блок строк (например, исходный файл имеет A, а затем B, а фиксация изменяет его на B, а затем A), традиционный алгоритм вины отмечает только половину движения и обычно обвиняет строки, которые были переместился вверх (т.е. B) к родительскому объекту и назначил вину линиям, которые были перенесены вниз (то есть A) на дочерний фиксатор. С помощью этой опции обе группы линий обвиняются в родительском процессе, выполняя дополнительные проверки.

num является необязательным, но это нижняя граница количества буквенно-цифровых символов, которые git должна определять как перемещение/копирование в файле, чтобы связать эти строки с родительским фиксатором. Значение по умолчанию - 20.

Ответ 4

git blame <file> -L <line>,<line>

Ответ 5

На самом деле графический графический интерфейс поставляется с Git, что позволяет легко перемещаться вперед и назад во времени, чтобы увидеть, как изменилась конкретная строка. Попробуйте

git gui blame <file>

Вы можете щелкнуть по ревизии рядом со ссылкой на "путешествие назад во времени".

Ответ 6

Я думаю, что вы после git blame, он сообщает вам фиксацию, которая добавила каждую строку.

Итак, запустите git blame the-file-that-has-that-line.txt и перейдите к строке 100, он скажет вам, что добавило его (и когда оно было совершено, и кем).

Ответ 7

используйте git blame для достижения

посмотреть, работает ли он

NAME
       git-blame - Show what revision and author last modified each line of a file

SYNOPSIS
       git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L n,m]
                   [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] [--abbrev=<n>]
                   [<rev> | --contents <file> | --reverse <rev>] [--] <file>

DESCRIPTION
       Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision.