Как перечислить все коммиты, которые изменили определенный файл? - PullRequest
691 голосов
/ 13 сентября 2010

Есть ли способ перечислить все коммиты, которые изменили определенный файл?

Ответы [ 15 ]

941 голосов
/ 10 января 2012

--follow работает для определенного файла

git log --follow -- filename

Разница с другими решениями

Обратите внимание, что другие решения включают git log path (без --follow). Такой подход удобен, если вы хотите отслеживать, например, изменяется в каталоге , но запинается при переименовании файлов (таким образом, используйте --follow filename).

121 голосов
/ 13 сентября 2010

git log path должен делать то, что вы хотите.От git log человек :

[--] <path>…

Show only commits that affect any of the specified paths. To prevent confusion with 
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.
46 голосов
/ 08 января 2016

Я внимательно посмотрел на это, и все эти ответы, похоже, не показывают мне все коммиты во всех ветвях.

Вот то, что я придумал, возиться с опциями просмотра редактирования gitk. Это показывает мне все коммиты для файла независимо от ветки, local, reflog и remote.

gitk --all --first-parent --remotes --reflog --author-date-order -- filename
41 голосов
/ 02 апреля 2013

Используйте команду ниже, чтобы получить коммиты для определенного файла:

git log -p filename
35 голосов
/ 13 сентября 2010

Это должно быть так же просто, как git log <somepath>;проверьте man-страницу (git-log(1)).

Лично мне нравится использовать git log --stat <path>, чтобы я мог видеть влияние каждого коммита на файл.

14 голосов
/ 19 декабря 2013

Как указал jackrabb1t, --follow более устойчив, поскольку продолжает перечислять историю после переименований / перемещений.Таким образом, если вы ищете файл, который в данный момент не находится на том же пути, или файл, который был переименован во время различных коммитов, --follow будет отслеживать его.

Это может быть лучшим вариантом, если вы хотитедля визуализации изменений имени / пути:

git log --follow --name-status -- <path>

Но если вам нужен более компактный список, содержащий только то, что имеет значение:

git log --follow --name-status --format='%H' -- <path>

или даже

git log --follow --name-only --format='%H' -- <path>

Недостатком является то, что --follow работает только для одного файла.

11 голосов
/ 13 августа 2015

В качестве альтернативы (начиная с Git 1.8.4), также возможно просто получить все коммиты, которые изменили определенную часть файла. Вы можете получить это, передав начальную строку и номер конечной строки.

Возвращенным результатом будет список коммитов, которые изменили эту конкретную часть. Команда выглядит так:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

, где upperLimit - это start_line_number, а lowerLimit - это ending_line_number

.

Подробнее - https://www.techpurohit.com/list-some-useful-git-commands

10 голосов
/ 07 декабря 2015

Если вы пытаетесь - проследить за удаленным файлом при предыдущем коммите, используйте

git log --follow -- filename
8 голосов
/ 15 ноября 2016

Если вы хотите просмотреть все коммиты, которые изменили файл, во всех ветках, используйте это:

git log --follow --all <filepath>
6 голосов
/ 05 января 2017

Если вы хотите искать все коммиты по filename и , а не по filepath, используйте:

git log --all -- '*.wmv'
...