Як я можу перерахувати всі коміти, які змінили певний файл?


800

Чи є спосіб перерахувати всі коміти, які змінили конкретний файл?


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

Відповіді:


1081

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

git log --follow -- filename

Відмінність від інших наведених рішень

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


32
+1 --followоблікові записи для перейменувань, тож це надійніше, ніжgit log -- path
Гейб Мутхарт

42
Зверніть увагу, що --followприймає шлях , який може бути файлом, але також і каталогом. У випадку останнього він запускатиметься рекурсивно та повідомляє про зміни у всіх файлах нижче цієї точки. (Така поведінка не зафіксована на сторінці та не може бути постійною.)
StvnW

5
git log filename?
Яка

8
@SaulOrtega, git log filenameне переслідує перейменування файлів, тобто він покаже всі зобов'язання щодо цього імені файлу (не фактичний файл). Якщо ви створили файли Xта Y, змінили обидва, потім видалили Yі перейменували Xна, Yа потім також змінили їх, і ви запустите git log Y, ви отримаєте повідомлення як для старих, так Y і для нових . І навпаки, --followви отримаєте доручення щодо цього файлу, коли він був названий X і коли він був названий Y.
MarSoft

7
використовувати "git log - всі назви файлів" для перегляду всіх
комітетів

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
Не працює, якщо шлях до файлу змінився. Відповідь jackrabbit працює в цій справі.
kwahn

1
Це працює , якщо вам необхідно обмежити журнал для конкретної галузі
Ams

63

Я уважно переглядаю це, і всі ці відповіді, схоже, не показують мені всіх порушень у всіх галузях.

Ось що я придумав, возившись з параметрами перегляду gitk edit. Це показує мені всі зобов’язання для файлу незалежно від гілки, локальної, перемикання та віддаленої.

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
Дуже корисний. Включає також
приховування комісій

Це має бути кращою відповіддю. Питання полягало в тому, щоб знайти всі комісії, це і є.
carl verbiest

Повідомлення, що --reflogвключає комітети, які були переоформлені / змінені або відхилені іншим чином. Можливо, це повинно бути очевидним, але я спробував це використати git logі намагався з'ясувати, чому я бачу, здавалося б, дублювання комітетів!
Сорен Бьорнстад

43

Використовуйте команду нижче, щоб отримати коміти для конкретного файлу:

git log -p filename

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

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

37

Він повинен бути таким же простим, як і git log <somepath>; перевірити manpage ( git-log(1)).

Особисто мені подобається використовувати, git log --stat <path>щоб я міг бачити вплив кожного комітету на файл.


9
Або навіть -pякщо ви хочете побачити повну різницю, а не лише те, що в ній була змінена деяка кількість рядків.
Каскабель

Щоправда, але це досить шумно, враховуючи, що більшість файлів за їхнє життя багато разів змінювались. Я не хочу бачити повний перелік кожного окремого комітету, який коли-небудь торкався файлу. Я зазвичай шукаю конкретну річ, тож я можу отримати журнал із просто впливами, а потім 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>

8

Якщо ви хочете шукати всі зобов’язання, filenameа не filepath , скористайтеся:

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

6

Якщо ви хочете побачити всі зміни, внесені у коміти, які змінили певний файл (а не лише зміни самого файлу), ви можете передати --full-diff:

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

або без[branch]
Anentropic

1
@Anentropic Квадратні дужки повинні були вказувати, що аргумент необов’язковий.
Кубічний

Це все, що мені потрібно. Він показує повну зміну, включає деяку зміну від злиття.
лютого

5

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


4
gitk <path_to_filename>

Якщо припустити, що пакет "gitk" вже встановлений.

Якщо він не встановлений, зробіть це:

sudo apt-get install gitk

А потім спробуйте вказану вище команду. Це для Linux ... Це може допомогти користувачам Linux, якщо вони хочуть GUI.


Для користувачів 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.