Виноват - предыдущие коммиты? - PullRequest
335 голосов
/ 24 февраля 2011

Можно ли увидеть, кто редактировал определенную строку до коммита, сообщенного git blame, как история коммитов для данной строки?

Например, я запускаю следующее (в превосходном uncrustify проекте):

$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"

Как мне узнать, кто редактировал эту строку до commit fe25b6d? И кто его редактировал до того коммита?

Ответы [ 12 ]

342 голосов
/ 24 февраля 2011
git blame -L10,+1 fe25b6d^ -- src/options.cpp

Вы можете указать ревизию для отвратительного просмотра, начиная с (вместо значения по умолчанию HEAD);fe25b6d^ является родителем fe25b6d.

163 голосов
/ 04 сентября 2015

Вы можете использовать git log -L для просмотра эволюции ряда линий.

Например:

git log -L 15,23:filename.txt

означает «проследить эволюцию строк с 15 по 23 в файле с именем filename.txt».

25 голосов
/ 20 мая 2014

Амбер ответит правильно, но я нашел его неясным;Синтаксис:

git blame {sha1} -- {path/to/file}

Примечание: -- используется для отделения дерева sha1 от относительных путей к файлам. 1

Например:

git blame master -- index.html

Полный кредит Янтарь за знание всех вещей!:)

24 голосов
/ 20 сентября 2016

Вы можете проверить:

git gui blame <filename>

Дает вам хорошее графическое отображение изменений, таких как "git blame", но с кликабельными ссылками на строку, чтобы перейти к более ранним коммитам. Наведите указатель мыши на ссылки, чтобы получить всплывающее окно с подробной информацией о коммите. Не мои кредиты ... нашел его здесь:

http://zsoltfabok.com/blog/2012/02/git-blame-line-history/

git gui - графический интерфейс Tcl / Tc для git. Без каких-либо других параметров он запускает довольно простое, но полезное графическое приложение для фиксации файлов, фрагментов или даже отдельных строк и других подобных команд, таких как изменение, возврат, нажатие ... Это часть пакета git stock. На окнах это включено в установщик. В Debian - я не знаю о других * nix системах - он должен быть установлен отдельно:

apt-get install git-gui

Из документов:

https://git -scm.com / документы / ГИТ-гуй

* * ОПИСАНИЕ тысяча двадцать-один

Графический пользовательский интерфейс на основе Tcl / Tk для Git. Git Gui фокусируется на позволяя пользователям вносить изменения в свой репозиторий, делая новые коммиты, исправление существующих, создание веток, выполнение локальных объединяет и извлекает / отправляет в удаленные репозитории.

В отличие от gitk, git gui фокусируется на генерации коммитов и отдельном файле аннотации и не показывает историю проекта. Это однако поставка действия в меню для запуска сеанса gitk из git gui.

Известно, что git gui работает на всех популярных системах UNIX, Mac OS X и Windows (под Cygwin и MSYS). По мере возможности ОС соблюдаются определенные правила пользовательского интерфейса, что делает git gui довольно родной интерфейс для пользователей.

КОМАНДЫ

порицание

Запустить программу просмотра обвинений для указанного файла в указанной версии (или в рабочем каталоге, если он не указан).

браузер

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

citool

Запустите git gui и сделайте ровно один коммит перед выходом и возвращением в оболочку. Интерфейс ограничен только совершать действия, немного сокращая время запуска приложения и упрощение меню.

версия

Показать текущую версию git gui.

17 голосов
/ 27 сентября 2012

Опираясь на предыдущий ответ, этот однострочный bash должен дать вам то, что вы ищете. Он отображает историю мерзавца за конкретную строку определенного файла за последние 5 ревизий:

LINE=10 FILE=src/options.cpp REVS=5; for commit in $(git rev-list -n $REVS HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done

В выходных данных этой команды вы можете увидеть, как меняется содержимое строки или даже может измениться отображаемый номер строки для конкретного коммита.

Это часто означает, что строка была добавлена ​​в первый раз, после этой конкретной фиксации. Это также может указывать на то, что строка была перемещена из другой части файла.

12 голосов
/ 04 сентября 2015

Там также recursive-blame. Может быть установлен с

npm install -g recursive-blame
9 голосов
/ 29 мая 2016

Уникальным решением этой проблемы является использование git log:

git log -p -M --follow --stat - путь / к / вашему / файлу

Как объяснил Андре здесь

5 голосов
/ 18 декабря 2017

Если вы используете JetBrains Idea IDE (и его производные), вы можете выбрать несколько строк, щелкнуть правой кнопкой мыши контекстное меню, затем Git -> Показать историю для выбора.Вы увидите список коммитов, которые влияли на выбранные строки:

enter image description here

1 голос
/ 30 мая 2016

Опираясь на ответ DavidN, и я хочу следовать переименованному файлу:

LINE=8 FILE=Info.plist; for commit in $(git log --format='%h%%' --name-only --follow -- $FILE | xargs echo | perl -pe 's/\%\s/,/g'); do hash=$(echo $commit | cut -f1 -d ','); fileMayRenamed=$(echo $commit | cut -f2 -d ','); git blame -n -L$LINE,+1 $hash -- $fileMayRenamed; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

ref: приятно отображать историю переименования файлов в git log

1 голос
/ 20 сентября 2015

Основываясь на ответе Уилла Шепарда, его вывод будет включать дубликаты строк для коммитов, в которых не было изменений, поэтому вы можете отфильтровать их следующим образом (используя этот ответ )

LINE=1 FILE=a; for commit in $(git rev-list HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

Обратите внимание, что я удалил аргумент REVS, и это восходит к корневому коммиту.Это связано с наблюдением Макса Нанаси выше.

...