Перечислите все версии данного номера строки в истории GIT
Возможно ли в Git перечислить все предыдущие версии данной строки в файле по номеру строки?
Причина, по которой мне показалось бы полезной, - это упростить устранение неполадок, связанных с протоколом трассировки стека протоколов.
то есть. У меня есть undefined method exception
, записанный в строке 100 данного файла. Файл включен в множество коммитов, которые заставляют данную строку "перемещаться" вверх и вниз по файлу даже без внесенных в нее изменений.
Как я могу распечатать содержимое строки 100 данного файла через последние х??
Ответы
Ответ 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.