Відповіді:
У --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 edit. Це показує мені всі зобов’язання для файлу незалежно від гілки, локальної, перемикання та віддаленої.
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>
; перевірити manpage ( git-log(1)
).
Особисто мені подобається використовувати, git log --stat <path>
щоб я міг бачити вплив кожного комітету на файл.
-p
якщо ви хочете побачити повну різницю, а не лише те, що в ній була змінена деяка кількість рядків.
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, якщо вони хочуть GUI.
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>