Есть ли способ заставить git выдать вам журнал коммитов только для коммитов, которые коснулись определенной строки в файле?
Как git blame
, но git blame
покажет вам последний коммит, который коснулся конкретной строки.
Мне бы очень хотелось получить похожий журнал, а не список коммитов в любом месте файла, а только коммиты, которые коснулись определенной строки.
Ответы:
Смотрите также Git: узнайте, какие коммиты когда-либо касались ряда строк .
Начиная с Git 1.8.4 ,
git log
приходится-L
просматривать эволюцию ряда линий.Например, предположим, вы смотрите на
git blame
вывод. Здесь-L 150,+11
означает «только посмотрите на строки от 150 до 150 + 11»:И вы хотите узнать историю того, что сейчас линия 155.
Затем используйте
git log
. Здесь-L 155,155:git-web--browse.sh
означает «проследить эволюцию строк с 155 по 155 в названном файлеgit-web--browse.sh
».источник
git log commitA-hash -L 155,155:file-name
?Вы можете получить набор коммитов, используя кирку.
Это даст вам все коммиты, которые повлияли на этот текст в этом файле. Если файл был переименован в какой-то момент, вы можете добавить --follow-parent.
Если вы хотите проверять коммиты при каждом из этих правок, вы можете передать этот результат в git show:
источник
git log -S'the previous version of the line'
и так далее, точно так же, как и в конечном итогеgit blame -L
. И это будет намного медленнее, чемgit blame
, поскольку он должен искать текст везде, а не только в данном месте.Попробуйте использовать приведенную ниже команду, реализованную в Git 1.8.4.
Таким образом, в вашем случае
upperLimit
иlowerLimit
является прикоснулсяline_number
Дополнительная информация - https://www.techpurohit.com/list-some-useful-git-commands
источник
--pretty=short
игнорируется при использовании-L
. Пожалуйста, исправьтеЧрезвычайно простой способ сделать это - использовать vim-fugitive . Просто откройте файл в vim, выберите интересующую вас строку (и) и
V
введитеТеперь вы можете использовать
:cnext
и,:cprev
чтобы увидеть все ревизии файла, где эта строка изменена. В любой момент введите,:Gblame
чтобы увидеть информацию о ша, авторе и дате.источник
Упрощение ответа @ Мэтта -
git blame -L14,15 -- <file_path>
Здесь вы получите вину за строки
14 to 15
.Так как
-L
option ожидаетRange
в качестве параметра, мы не можем получить aBlame
для одной строки, используя-L
option` .Ссылка
источник
Я не верю, что для этого есть что-то встроенное. Это усложняется тем фактом, что редко бывает, что одна строка меняется несколько раз без существенного изменения остальной части файла, так что вы, как правило, в конечном итоге сильно меняете номера строк.
Если вам повезло, что строка всегда имеет некоторую идентифицирующую характеристику, например, присваивание переменной, имя которой никогда не менялось, вы можете использовать выбор регулярного выражения для
git blame -L
. Например:Но это находит только первый совпадение для этого регулярного выражения, поэтому, если у вас нет хорошего способа сопоставить строку, это не слишком полезно.
Вы могли бы взломать что-нибудь, я полагаю. У меня нет времени писать код только сейчас, но ... что-то в этом роде. Беги
git blame -n -L $n,$n $file
. Первое поле - это предыдущий коммит, а второе - номер строки в этом коммите, поскольку он мог измениться. Возьмите их и запуститеgit blame -n $n,$n $commit^ $file
, т.е. то же самое, начиная с фиксации до последнего изменения файла.(Обратите внимание, что это не удастся вам, если последний коммит, который изменил строку, был коммитом слияния. Основной способ это могло произойти, если строка была изменена как часть разрешения конфликта слияния.)
Редактировать: Я случайно встретил этот пост в списке рассылки с марта 2011 года, в котором упоминается об этом,
tig
и уgit gui
меня есть функция, которая поможет вам сделать это. Похоже, что функция была рассмотрена, но не завершена, для самого git.источник
Это потребует
git blame
от каждой значимой ревизии показывать строку$LINE
файла$FILE
:Как обычно, обвинение показывает номер редакции в начале каждой строки. Вы можете добавить
чтобы получить агрегированные результаты, что-то вроде списка коммитов, которые изменили эту строку. (Не совсем, если бы только код был перемещен, это могло бы показать один и тот же идентификатор коммита дважды для разного содержимого строки. Для более детального анализа вам нужно было бы выполнить запаздывающее сравнение
git blame
результатов для смежных коммитов. Кто-нибудь? )источник
Вот решение, которое определяет псевдоним git, так что вы сможете использовать его следующим образом:
Пример вывода:
Вы можете определить псевдоним в вашем .gitconfig или просто запустить следующую команду
Это уродливая однострочная строка, так что вот неясная эквивалентная функция bash:
Решение кирки ( git log --pickaxe-regex -S'REGEX ' ) даст вам только добавление / удаление строк, а не другие изменения строки, содержащей регулярное выражение.
Ограничением этого решения является то, что git blame возвращает только 1-е совпадение с REGEX, поэтому, если существует несколько совпадений, рекурсия может «перепрыгнуть», чтобы следовать за другой строкой. Убедитесь, что проверили полный вывод истории, чтобы определить эти «скачки», а затем исправьте свой REGEX, чтобы игнорировать паразитные линии.
Наконец, вот альтернативная версия, которая запускает git show для каждого коммита, чтобы получить полный diff:
источник
Вы можете смешивать
git blame
иgit log
команды для получения сводки каждого коммита в команде git blame и добавлять их. Что-то вроде следующего скрипта bash + awk. Он добавляет сводку коммита как встроенный комментарий к коду.В одну строку:
источник
В моем случае номер строки сильно изменился с течением времени. Я также был на git 1.8.3, которая не поддерживает регулярные выражения в "git blame -L". (RHEL7 все еще имеет 1.8.3)
Один лайнер:
Это, конечно, можно превратить в скрипт или функцию.
источник