Обвинять ГИТ - до нарушает?


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

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.

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

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, и это возвращается к корневой фиксации. Это связано с наблюдением Макса Нанаси выше.

основываясь на ответе 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
}