Git: Показать все различные изменения в одной строке в указанном файле за всю историю Git - PullRequest
91 голосов
/ 30 марта 2012

Я огляделся и не уверен, возможно ли это, но здесь идет речь:

У меня есть файл (javascript) (скажем, /lib/client.js), в котором у меня есть уникальный идентификатор, назначенный переменной, например: var identifier = "SOME_IDENTIFIER";

Вы можете думать об идентификаторе как о номере версии: периодически мы меняем эту переменную на новый идентификатор.

Я хотел бы найти все уникальные идентификаторы, которые мы когда-либо использовали. Как я могу сделать это с помощью git?

Я предполагаю, что может быть способ поиска по истории git и печати строки, соответствующей "var identifier =". Я мог бы обмануть этот список вручную.

В любом случае, я был бы признателен за понимание. Спасибо.

Ответы [ 5 ]

83 голосов
/ 24 ноября 2014

Начиная с git 1.8.4 , существует более прямой способ ответить на ваш вопрос.

Предполагая, что строка 110 - это строка, в которой говорится var identifier = "SOME_IDENTIFIER";, тогда сделайте следующее:

git log -L110,110:/lib/client.js

Это вернет каждый коммит, который коснулся этой строки кода.

[ Git Documentation (см. Параметр командной строки "-L")]

43 голосов
/ 30 марта 2012

См. Справочную страницу для git-log и gitdiffcore.Я полагаю, что эта команда сделает это, но она может быть не совсем правильной:

git log -G "var identifier =" file.js

РЕДАКТИРОВАТЬ: Вот грубый старт для сценария bash, чтобы показать действительные строки.Это может быть больше, чем вы ищете.

for c in $(git log -G "something" --format=%H -- file.js); do
    git --no-pager grep -e "something" $c -- file.js
done

Он использует git log -G, чтобы найти интересные коммиты, используя --format=%H, чтобы создать список хэшей коммитов.Затем он перебирает каждый интересный коммит, запрашивая git grep показать строки из этого коммита и файл, содержащий регулярное выражение, с предваряющим хэшем коммита.


РЕДАКТИРОВАТЬ: Измененоиспользовать -G вместо -S, как предлагается в комментариях.

14 голосов
/ 30 марта 2012

Вы также можете сделать это с помощью gitk:

gitk file.js

В раскрывающемся списке «коммит» выберите «добавление / удаление строки:», а в текстовом поле рядом с ним введите «var identifier =», и любые коммиты, добавляющие или удаляющие строки, содержащие эту строку, будут выделены. .

8 голосов
/ 05 января 2013

Если вы немного измените ответ @ rob, git log в основном сделает это за вас, если все, что вам нужно, это визуальное сравнение:

git log -U0 -S "var identifier =" path/to/file

-U0 означает вывод в режиме патча (-p) и показывает нулевые строки контекста вокруг патча.

Вы можете даже сделать это через филиалы:

git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file

Может быть способ подавить заголовок diff, но я не знаю ни одного.

2 голосов
/ 20 февраля 2016

В magit вы можете сделать это с помощью

l, =L

. Затем он запросит у вас файл и начало, конец строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...