Вам еще предстоит ответить на комментарий meagar , но в любом случае стоит отметить несколько вещей:
Каждый коммит представляет собой полный снимок всего источника.То есть каждый коммит содержит полное дерево всех файлов.Кто-то побежал git commit
;это заморозило все файлы в той форме, в которой они находились в то время.Это стало моментальным снимком коммита.
Запуск git grep
позволяет Git выполнять поиск по некоторым видам дерева (ей) файлов, ища файлы, содержащие регулярные выражения.
Предоставляя git grep
список коммитов, вы говорите ему найти каждое совпадение в каждом файле каждого такого дерева.Так что конечно если коммиты A, B и C содержат совпадающие файлы, Git расскажет вам о файлах в A, B и C.
Возможно, ваша цельвзять каждую пару коммитов и что-то с ними сделать.Например, предположим, что в репозитории ровно три коммита без слияния: A
, B
и C
:
A <-B <-C <--master
Коммит A
не имеет родителя (это корневой коммит),поэтому в целях сопряжения Git вставит пустой коммит - тот, у которого нет файлов - перед A
.Мы можем назвать это ε.Затем мы можем сравнить Git:
- ε против
A
: все файлы добавлены A
против B
: некоторые файлы изменены B
против C
: некоторые файлы изменены
Мы могли бы сделать это вручную, по одной паре за раз, но есть способ автоматизировать это: git log -p
делает это.В каждом из этих наборов изменений будет показано несколько строк некоторых файлов.Мы также можем git log
искать этих наборов изменений, используя git log -S
или git log -G
.
Эти два поиска - -S
и -G
- похожи,но не идентичны.-G
принимает обычное регулярное выражение (а-ля git grep
);-S
принимает строку по умолчанию, но можно сказать, что ее аргумент является регулярным выражением с использованием --pickaxe-regex
.
В общем, оба сообщают git log
, что она должна показывать commit (вообще), если change-set содержит данное выражение (но см. следующий бит).Поэтому вы можете пропустить -p
, если вы просто заинтересованы в коммите.Если вы хотите увидеть изменения, сделанные на , которые фиксируют, включите -p
:
git log -p -G regex
Другое различие между -S
и -G
, кроме этого -S
принимает строку по умолчанию, -S
просматривает count из вхождений совпадений.Следовательно, если вы ищете определенное слово, и патч изменяет строку, которая содержит слово, но не добавляет или удалить слово, -G
покажет коммит, в то время как -S
не будет.
Если вы пытаетесь увидеть, кто заставил какую-то определенную строку (и) какого-то конкретного файла (ов) выглядеть так, как они, git diff
не правильный инструмент, но git grep
и git log
тоже не правы.Вместо этого используйте git annotate
или git blame
(это по сути одна и та же команда; см. документацию git annotate
).