Git обвинение - предшествующие коммиты?

Можно ли увидеть, кто редактировал конкретную строку перед коммитом, о котором сообщает 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? И кто его редактировал перед этим коммитом?

Ответ 1

git blame -L10,+1 fe25b6d^ -- src/options.cpp

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

Ответ 2

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

Например:

git log -L 15,23:filename.txt

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

Ответ 3

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

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

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

Например:

git blame master -- index.html

Полная благодарность Амбер за все знания! :)

Ответ 4

Возможно, вы захотите проверить:

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.

Ответ 5

Основываясь на предыдущем ответе, этот 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

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

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

Ответ 6

Там также recursive-blame. Его можно установить с помощью

npm install -g recursive-blame

Ответ 7

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

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

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

Ответ 8

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

enter image description here

Ответ 9

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

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

Ответ 10

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

Ответ 11

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

Ответ 12

Настроить на 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
}

Ответ 13

Начиная с Git 2.23 вы можете использовать git blame --ignore-rev

Для примера, приведенного в вопросе, это будет:

git blame -L10,+1 src/options.cpp --ignore-rev fe25b6d

(однако это вопрос с подвохом, потому что fe25b6d - это первая версия файла!)