Обвинять ГИТ - до нарушает?
Я люблю git blame
команда, это очень полезно для отслеживания людей, которые не владеют до написания кода. : -)
однако, можно ли увидеть, кто редактировал конкретную строку до о фиксации сообщает git blame
, например, история коммитов для данной строки?
например, я запускаю следующее (на superb ):
$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"
как я могу узнать, кто редактировал эту строку до commit fe25b6d
? И кто отредактировал его перед это совершал? Я уверен, что это было бы возможно, но мой ГИТ-фу слаб.
12 ответов:
git blame -L10,+1 fe25b6d^ -- src/options.cpp
вы можете указать ревизию для git blame, чтобы оглянуться назад, начиная с (вместо значения по умолчанию
HEAD
);fe25b6d^
родительfe25b6d
.
можно использовать git log-L для просмотра эволюции ряда линий.
например :
git log -L 15,23:filename.txt
означает " проследить эволюцию строк от 15 до 23 в файле с именем filename.формат txt."
основываясь на предыдущем ответе, этот bash one-liner должен дать вам то, что вы ищете. Он отображает историю ошибок 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
в выходных данных этой команды вы можете увидеть, что содержимое строки изменяется, или отображаемый номер строки может даже измениться для определенной фиксации.
это часто указывает на то, что строка была добавлена в первый раз, после этого конкретного совершать. Это также может означать, что строка была перемещена из другой части файла.
вы можете проверить:
git gui blame <filename>
дает вам хорошее графическое отображение изменений, таких как" git blame", но с кликабельными ссылками на строку, чтобы перейти к более ранним коммитам. Наведите указатель мыши на ссылки, чтобы получить всплывающее окно с деталями фиксации. Не мои кредиты... нашел его здесь:
http://zsoltfabok.com/blog/2012/02/git-blame-line-history/
git gui
представляет собой графический интерфейс Tcl / Tc для git. Без каких-либо других параметров он начинается довольно просто, но полезное графическое приложение для фиксации файлов, кусков или даже отдельных строк и других подобных команд, таких как amend, revert, push... Это часть пакета акций git. На windows он включен в установщик. На debian-я не знаю о других системах *nix - он должен быть установлен отдельно:apt-get install git-gui
документы:
https://git-scm.com/docs/git-gui
описание
основанный Tcl/Tk графический интерфейс пользователя для Git. Git gui фокусируется на позволяет пользователям вносить изменения в свой репозиторий, создавая новые коммиты, внесение изменений в существующие, создание филиалов, выполнение локальных слияния и выборка/нажатие на удаленные репозитории.
В отличие от gitk, Git gui фокусируется на генерации фиксации и одном файле аннотация и не показывает историю проекта. Однако он поставляет действия меню для запуска сеанса gitk из графического интерфейса git.
интерфейс в Git известно, что работает на всех популярных системах UNIX, Mac OS X и Windows (как под Cygwin, так и под MSYS). По мере возможности ОС следовать конкретные руководящие принципы пользовательского интерфейса, что делает git графический интерфейс с довольно родной интерфейс для пользователей.
команды
вину
запустите средство просмотра обвинений в указанном файле в данной версии (или рабочий каталог, если он не указан).
обозреватель
запустите древовидный браузер, показывающий все файлы в указанной фиксации. Файлы, выбранные через браузер, открываются в средстве просмотра обвинений.
citool
запустите Git gui и организуйте выполнение ровно одного коммита перед выходом и возвращением в оболочку. Интерфейс ограничен только совершать действия, немного сокращая время запуска приложения и упрощение меню.
версия
отображение текущей версии Git gui.
там же
recursive-blame
. Он может быть установлен сnpm install -g recursive-blame
очень уникальным решением этой проблемы является использование git log:
git log-p-M --follow --stat -- path/to/your/file
Как объяснил Андре здесь
Если вы используете JetBrains Idea IDE (и производные), вы можете выбрать несколько строк, щелкните правой кнопкой мыши контекстное меню, а затем Git -> показать историю для выбора. Вы увидите список коммитов, которые повлияли на выбранные строки:
основываясь на ответе Уилла Шепарда, его вывод будет включать повторяющиеся строки для коммитов, где не было никаких изменений, поэтому вы можете отфильтровать их следующим образом (используя this ответ)
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$/!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$/!P; D'
ref:красиво отображать историю переименования файлов в git log
Я использую этот маленький скрипт bash, чтобы посмотреть на историю обвинений.
первый параметр: файл для просмотра
последующие параметры: передано в git blame
#!/bin/bash f= shift { git log --pretty=format:%H -- "$f"; echo; } | { while read hash; do echo "--- $hash" git blame $@ $hash -- "$f" | sed 's/^/ /' done }
вы можете поставить вину-параметры, такие как - L 70,+10 но лучше использовать регулярное выражение-поиск вины git, потому что номера строк обычно "меняются" с течением времени.
построить stangls ' s ответ, Я поставил этот скрипт в моем пути (даже на Windows) как git-bh:
это позволяет мне искать все коммиты, где было задействовано слово:
git bh path/to/myfile myWord
сценарий:
#!/bin/bash f= shift csha="" { git log --pretty=format:%H -- "$f"; echo; } | { while read hash; do res=$(git blame -L"//",+1 $hash -- "$f" 2>/dev/null | sed 's/^/ /') sha=${res%% (*} if [[ "${res}" != "" && "${csha}" != "${sha}" ]]; then echo "--- ${hash}" echo "${res}" csha="${sha}" fi done }