Ответы:
В --followработах для конкретного файла
git log --follow -- filename
Разница с другими решениями
Обратите внимание, что другие решения включают git log path(без --follow). Этот подход удобен, если вы хотите отслеживать, например, изменения в каталоге , но запинается, когда файлы переименовываются (таким образом, используются --follow filename).
--followучитывает переименования, так что это более git log -- path
--followдопускается путь , который может быть как файлом, так и каталогом. В последнем случае он будет работать рекурсивно и сообщать об изменениях во все файлы ниже этой точки. (Такое поведение не задокументировано на странице руководства и может не быть постоянным.)
git log filename?
git log filenameне следует за переименованием файла, то есть он покажет все коммиты относительно этого имени файла (не фактический файл). Если вы создаете файлы Xи Y, изменили оба, затем удалили Yи переименовали Xв, Yа затем также изменили его, и вы запустили git log Y, вы получите сообщения как для старого, так Y и для нового . И наоборот, --followвы получите коммиты для этого файла, когда он был назван X и когда он был назван Y.
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.
Я внимательно посмотрел на это, и все эти ответы, похоже, не показывают мне все коммиты по всем веткам.
Вот то, что я придумал, возиться с опциями просмотра редактирования gitk. Это показывает мне все коммиты для файла независимо от ветки, local, reflog и remote.
gitk --all --first-parent --remotes --reflog --author-date-order -- filename
Это также работает с git log:
git log --all --first-parent --remotes --reflog --author-date-order -- filename
--reflogвключает коммиты, которые были перебазированы / исправлены или иным образом отброшены. Может быть, это должно быть очевидно, но я пытался использовать это с git logи пытался выяснить, почему я вижу, казалось бы, дублированные коммиты!
Используйте команду ниже, чтобы получить коммиты для определенного файла:
git log -p filename
git log -p mybranch -- filenameили просто использовать git log --all -- filenameдля просмотра всех веток.
Это должно быть так же просто, как git log <somepath>; проверьте страницу руководства ( git-log(1)).
Лично мне нравится использовать, git log --stat <path>чтобы я мог видеть влияние каждого коммита на файл.
-pесли вы хотите увидеть полный diff, а не только то, что в нем было изменено некоторое количество строк.
git showпо конкретным коммитам, которые выглядят так, как будто они имеют значение.
В качестве альтернативы (начиная с 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
Как указал 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работает только для одного файла.
--followработает для одного пути , который может быть каталогом. Если передать каталог, он будет работать рекурсивно и сообщать об изменениях во всех файлах ниже этой точки.
Если вы пытаетесь - следовать за файлом, удаленным при предыдущем использовании фиксации
git log --follow -- filename
gitновичков: используйте git log -p --follow -- filenameдля отображения изменений. Также обратите внимание: «имя файла» может быть файлом, каталогом или подмодулем.
Если вы хотите просмотреть все коммиты, которые изменили файл, во всех ветвях используйте это:
git log --follow --all <filepath>
Если вы хотите искать все коммиты по, filenameа не по filepath , используйте:
git log --all -- '*.wmv'
Если вы хотите увидеть все изменения, сделанные в коммитах, которые изменили конкретный файл (а не только изменения в самом файле), вы можете передать --full-diff:
git log -p --full-diff [branch] -- <path>
[branch]
gitk <path_to_filename>
Предполагая, что пакет "gitk" уже установлен.
Если он не установлен, сделайте это:
sudo apt-get install gitk
А затем попробуйте указанную выше команду. Это для Linux ... Это может помочь пользователям Linux, если они хотят графический интерфейс.
gitkпоставляется в комплекте с Git для Windows.
Чтобы просто получить список хэшей коммитов, используйте git rev-list
git rev-list HEAD <filename>
Вывод:
b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d
что означает 5 коммитов коснулись этого файла. Это обратный хронологический порядок, поэтому первый коммит в списке b7c4f0d7самый последний.
В Linux вы можете использовать gitk для этого.
Его можно установить с помощью "sudo apt-get install git-gui gitk". Его можно использовать для просмотра фиксаций определенного файла с помощью «gitk <Filename>».
# 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>