How to list all commits that changed a specific file?
Есть ли способ перечислить все коммиты, которые изменили определенный файл?
18 ответов
--follow
работает для определенного файла
git log --follow -- filename
Разница с другими решениями
Обратите внимание, что другие решения включают git log path
(без --follow
). Такой подход удобен, если вы хотите отслеживать, например, изменения в каталоге, но запинается, когда файлы переименовываются (поэтому используйте --follow filename
).
Я внимательно посмотрел на это, и все эти ответы, похоже, не показывают мне все коммиты по всем веткам.
Вот то, что я придумал, возиться с опциями просмотра редактирования gitk. Это показывает мне все коммиты для файла независимо от ветки, local, reflog и remote.
gitk --all --first-parent --remotes --reflog --author-date-order -- filename
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.
Используйте команду ниже, чтобы получить коммиты для определенного файла:
git log -p filename
Это должно быть так просто, как git log <somepath>
; проверьте страницу руководства (git-log(1)
).
Лично я люблю использовать git log --stat <path>
так что я могу видеть влияние каждого коммита на файл.
В качестве альтернативы (начиная с Git 1.8.4), также можно просто получить все коммиты, которые изменили определенную часть файла. Вы можете получить это, передав начальную строку и номер конечной строки.
Возвращенным результатом будет список коммитов, которые изменили эту конкретную часть. Команда выглядит так:
git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>
где upperLimit
это start_line_number
а также lowerLimit
это ending_line_number
Как указал 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
работает только для одного файла.
Чтобы получить все фиксации для конкретного использования файла:
git rev-list HEAD --oneline FileName
Например
git rev-list HEAD --oneline index.html
Выход
7a2bb2f update_index_with_alias
6c03e56 update_changes
e867142 Revert "add_paragraph"
Если вы хотите увидеть все изменения, сделанные в коммитах, которые изменили конкретный файл (а не только изменения в самом файле), вы можете передать --full-diff
:
git log -p --full-diff [branch] -- <path>
Если вы хотите посмотреть все коммиты по filename
и не filepath
, используйте:
git log --all -- '*.wmv'
Если вы пытаетесь - следовать за файлом, удаленным при предыдущем использовании фиксации
git log --follow -- filename
Если вы хотите просмотреть все коммиты, которые изменили файл, во всех ветках, используйте это:
git log --follow --all <filepath>
Использование git log --all <filename>
просматривать коммиты, влияющие <filename>
во всех филиалах.
gitk <path_to_filename>
Предполагая, что пакет "gitk" уже установлен.
Если он не установлен, сделайте это:
sudo apt-get install gitk
А затем попробуйте указанную выше команду. Это для Linux... Это может помочь пользователям Linux, если они хотят графический интерфейс.
Чтобы просто получить список хэшей коммитов, используйте git rev-list
git rev-list HEAD <filename>
Выход:
b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d
Это означает, что 5 коммитов коснулись этого файла. Это обратный хронологический порядок, поэтому первая фиксация в спискеb7c4f0d7
самый последний.
# Shows commit history with patch
git log -p -<no_of_commits> --follow <file_name>
# Shows brief details like "1 file changed, 6 insertions(+), 1 deletion(-)"
git log --stat --follow <file_name>
В Linux вы можете использовать gitk для этого.
Его можно установить с помощью "sudo apt-get install git-gui gitk". Его можно использовать для просмотра фиксаций определенного файла с помощью "gitk