Как я могу перечислить все коммиты, которые изменили определенный файл?


805

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


1
Вы ищете изменения в файле через одну ветку; через все местные филиалы; через все филиалы на одном пульте; или через все это? Я думаю, что через все это потребуется сценарий.
Бенхорген

Ответы:


1085

В --followработах для конкретного файла

git log --follow -- filename

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

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


32
+1 --followучитывает переименования, так что это более git log -- path
надежно,

42
Обратите внимание, что --followдопускается путь , который может быть как файлом, так и каталогом. В последнем случае он будет работать рекурсивно и сообщать об изменениях во все файлы ниже этой точки. (Такое поведение не задокументировано на странице руководства и может не быть постоянным.)
StvnW

5
Какая разница между этим и простоgit log filename?
VaTo

8
@SaulOrtega, git log filenameне следует за переименованием файла, то есть он покажет все коммиты относительно этого имени файла (не фактический файл). Если вы создаете файлы Xи Y, изменили оба, затем удалили Yи переименовали Xв, Yа затем также изменили его, и вы запустили git log Y, вы получите сообщения как для старого, так Y и для нового . И наоборот, --followвы получите коммиты для этого файла, когда он был назван X и когда он был назван Y.
MarSoft

7
используйте "git log --all filename" для просмотра всех
коммитов

122

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.

11
Не работает, если путь к файлу изменился. ответ крольчонка действительно работает для этого случая.
Кван

1
Это работает, если вам нужно ограничить журнал определенной веткой
ams

64

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

Вот то, что я придумал, возиться с опциями просмотра редактирования 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

11
Это идеально подходит для тех случаев, когда кто-то вносит изменения, но забывает, где они вносили изменения.
earthmeLon

2
Очень полезный. Включает также
тайники

Это должно быть предпочтительным ответом. Вопрос заключался в том, чтобы найти все коммиты, этот делает.
Карл Вербиест

Обратите внимание, что --reflogвключает коммиты, которые были перебазированы / исправлены или иным образом отброшены. Может быть, это должно быть очевидно, но я пытался использовать это с git logи пытался выяснить, почему я вижу, казалось бы, дублированные коммиты!
Сорен Бьорнстад

43

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

git log -p filename

8
Я понимаю, что это не совсем отвечает на вопрос, так как он хотел получить список коммитов, но это золото, и оно у меня в файле.
zkent

3
Это не будет работать вообще, если файл не существует в текущей проверенной ветке. Вы можете добавить ветку как git log -p mybranch -- filenameили просто использовать git log --all -- filenameдля просмотра всех веток.
Сорен Бьорнстад

37

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

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


9
Или даже -pесли вы хотите увидеть полный diff, а не только то, что в нем было изменено некоторое количество строк.
Каскабель

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

git log --stat --follow - * .html => выводить список коммитов с ровно одним файлом в каждом коммите. Очень хорошо!
Серхио Белевский

18

В качестве альтернативы (начиная с 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


17

Как указал 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работает только для одного файла.


4
--followработает для одного пути , который может быть каталогом. Если передать каталог, он будет работать рекурсивно и сообщать об изменениях во всех файлах ниже этой точки.
StvnW

10

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

git log --follow -- filename

3
Для gitновичков: используйте git log -p --follow -- filenameдля отображения изменений. Также обратите внимание: «имя файла» может быть файлом, каталогом или подмодулем.
Тино

8

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

git log --follow --all <filepath>


6

Если вы хотите увидеть все изменения, сделанные в коммитах, которые изменили конкретный файл (а не только изменения в самом файле), вы можете передать --full-diff:

git log -p --full-diff [branch] -- <path>

или без[branch]
Anentropic

1
@Anentropic Квадратные скобки должны были указывать, что аргумент является необязательным.
Куб

Это все, что мне нужно, Это показывает полное изменение, включает в себя некоторые изменения от слияния.
ThanhLD

5

Используйте git log --all <filename>для просмотра коммитов, влияющих <filename>на все ветви.


4
gitk <path_to_filename>

Предполагая, что пакет "gitk" уже установлен.

Если он не установлен, сделайте это:

sudo apt-get install gitk

А затем попробуйте указанную выше команду. Это для Linux ... Это может помочь пользователям Linux, если они хотят графический интерфейс.


Для пользователей Windows, обратите внимание, что gitkпоставляется в комплекте с Git для Windows.
Сорен Бьорнстад

2

Чтобы просто получить список хэшей коммитов, используйте git rev-list

 git rev-list HEAD <filename>

Вывод:

b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d

что означает 5 коммитов коснулись этого файла. Это обратный хронологический порядок, поэтому первый коммит в списке b7c4f0d7самый последний.


1

В Linux вы можете использовать gitk для этого.

Его можно установить с помощью "sudo apt-get install git-gui gitk". Его можно использовать для просмотра фиксаций определенного файла с помощью «gitk <Filename>».


1
# 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>

Ссылка

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.