Git blame-prior commits?

Я люблю 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"

как я могу узнать, кто редактировал эту строку до фиксация fe25b6d? И кто отредактировал его перед это совершал? Я уверен, что это было бы возможно, но мой git-fu слаб.

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 gui.

Git gui известный для работы на всех популярных системах UNIX, Mac OS X, и Windows (как под Cygwin, так и под MSYS). Насколько это возможно OS конкретные рекомендации пользовательского интерфейса соблюдаются, что делает Git gui a довольно родной интерфейс для пользователей.

команды

вину

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

обозреватель

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

citool

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

версия

отображение текущей версии Git gui.


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

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

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

например:

git blame master -- index.html

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


там же recursive-blame. Его можно установить с

npm install -g recursive-blame

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

git log-p-M --follow --stat -- path/to/your/file

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


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

enter image description here


основываясь на ответе Уилла Шепарда, его вывод будет включать повторяющиеся строки для коммитов, где не было изменений, поэтому вы можете фильтровать их следующим образом (используя 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, и это возвращается к корневой фиксации. Это объясняется выше наблюдения Макс Nanasy по.


основываясь на ответе 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 blame, потому что номера строк обычно "меняются" с течением времени.


построить 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
}