Ответ 1
git blame -L10,+1 fe25b6d^ -- src/options.cpp
Вы можете указать ревизию для git вины, чтобы оглянуться назад, начиная с (вместо значения по умолчанию HEAD
); fe25b6d^
является родительским элементом fe25b6d
.
Можно ли увидеть, кто редактировал конкретную строку перед коммитом, о котором сообщает git blame
, например историю коммитов для данной строки?
Например, я запускаю следующее (в превосходном проекте uncrustify
):
$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"
Как я могу узнать, кто редактировал эту строку перед коммитом fe25b6d
? И кто его редактировал перед этим коммитом?
git blame -L10,+1 fe25b6d^ -- src/options.cpp
Вы можете указать ревизию для git вины, чтобы оглянуться назад, начиная с (вместо значения по умолчанию HEAD
); fe25b6d^
является родительским элементом fe25b6d
.
Вы можете использовать git log -L, чтобы просмотреть эволюцию диапазона строк.
Например:
git log -L 15,23:filename.txt
означает "проследить эволюцию строк с 15 по 23 в файле с именем filename.txt".
Янтарный ответ правильный, но я нашел его неясным; Синтаксис:
git blame {commit_id} -- {path/to/file}
Примечание: --
используется для ветки дерева sha1 от относительных путей к файлам. 1
Например:
git blame master -- index.html
Полная благодарность Амбер за все знания! :)
Возможно, вы захотите проверить:
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/docs/git-gui
DESCRIPTION
Графический пользовательский интерфейс на основе Tcl/Tk для Git. Git Gui фокусируется на позволяя пользователям вносить изменения в свой репозиторий, делая новые коммиты, исправление существующих, создание веток, выполнение локальных объединяет и извлекает/отправляет в удаленные репозитории.
В отличие от gitk, git gui фокусируется на генерации коммитов и отдельном файле аннотации и не показывает историю проекта. Это однако поставка действия в меню для запуска сеанса Gitk из Git GUI.
Известно, что git gui работает на всех популярных системах UNIX, Mac OS X и Windows (под Cygwin и MSYS). По мере возможности ОС соблюдаются определенные правила пользовательского интерфейса, что делает git gui довольно родной интерфейс для пользователей.
COMMANDS
blame
Запустите средство просмотра вины для указанного файла в указанной версии (или в рабочем каталоге, если он не указан).
browser
Запустите браузер дерева, отображающий все файлы в указанном коммите. Файлы, выбранные в браузере, открываются в программе просмотра обвинений.
citool
Запустите git gui и сделайте ровно один коммит перед выходом и возвращением в оболочку. Интерфейс ограничен только совершать действия, немного сокращая время запуска приложений и упрощение меню.
version
Показать текущую версию git gui.
Основываясь на предыдущем ответе, этот bash однострочный должен предоставить вам то, что вы ищете. Он отображает историю вины git для конкретной строки конкретного файла через последние 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
В выводе этой команды вы можете увидеть содержание изменения строки или отображаемый номер строки, возможно, даже изменится для конкретной фиксации.
Это часто указывает, что строка была добавлена в первый раз после этого конкретного коммита. Он также может указывать, что линия была перемещена из другой части файла.
Там также recursive-blame
. Его можно установить с помощью
npm install -g recursive-blame
Очень уникальным решением для этой проблемы является использование git log:
git log -p -M --follow --stat - path/to/your/file
Как объяснил Andre здесь
Если вы используете JetBrains Idea IDE (и его производные), вы можете выбрать несколько строк, щелкнуть правой кнопкой мыши контекстное меню, затем Git → Показать историю для выбора. Вы увидите список коммитов, которые влияли на выбранные строки:
На основе ответа Уилла Шепарда его вывод будет включать повторяющиеся строки для коммитов, где не было изменений, поэтому вы можете отфильтровать их следующим образом (используя этот ответ)
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, и это вернется к корневому фиксации. Это связано с наблюдением Макс Нэнаси выше.
Основываясь на ответе 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
Я использую этот маленький bash script, чтобы посмотреть историю вины.
Первый параметр: файл для просмотра
Последующие параметры: Принято к git вину
#!/bin/bash
f=$1
shift
{ git log --pretty=format:%H -- "$f"; echo; } | {
while read hash; do
echo "--- $hash"
git blame [email protected] $hash -- "$f" | sed 's/^/ /'
done
}
Вы можете указать параметры вины как -L 70, + 10, но лучше использовать regex-поиск для git вины, потому что строки обычно меняются со временем.
Настроить на stangls ответ, я помещал этот script в мой PATH (даже на Windows) в качестве git -bh:
Это позволяет мне искать все коммиты, где было задействовано слово:
git bh path/to/myfile myWord
Script:
#!/bin/bash
f=$1
shift
csha=""
{ git log --pretty=format:%H -- "$f"; echo; } | {
while read hash; do
res=$(git blame -L"/$1/",+1 $hash -- "$f" 2>/dev/null | sed 's/^/ /')
sha=${res%% (*}
if [[ "${res}" != "" && "${csha}" != "${sha}" ]]; then
echo "--- ${hash}"
echo "${res}"
csha="${sha}"
fi
done
}
Начиная с Git 2.23 вы можете использовать git blame --ignore-rev
Для примера, приведенного в вопросе, это будет:
git blame -L10,+1 src/options.cpp --ignore-rev fe25b6d
(однако это вопрос с подвохом, потому что fe25b6d - это первая версия файла!)