Я хочу найти самый последний коммит, который изменил исходный файл.
Я могу использовать, git blame
чтобы увидеть все даты коммитов по каждой строке, но трудно точно определить, какой коммит был последним, кто коснулся файла.
Как мне найти последний коммит, который коснулся данного файла в моем git-репозитории?
--all
опцию.Если вы просто хотите найти самый последний коммит, то вам не нужен
git-log
, вам нуженgit-rev-list
список объектов фиксации, изменяющих этот файл, в этом пути фиксации, начиная с самого последнего (в хронологическом порядке). Проще говоря:git rev-list -1 <commit> <filename>
В
git-rev-list
вашем случае вы просто поставляете:Это просто возвращает самый последний идентификатор фиксации в текущей ветви, чтобы изменить этот файл, например:
215095e2e338525be0baeeebdf66bfbb304e7270
Для более сложного примера вы можете использовать имена тегов и даже удаленные ссылки и включать относительные имена путей с подстановочными знаками, например:
git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt
... Что скажет вам, что было самым последним изменением в сопоставлении символов подстановки в истории этой ветви. Опции для rev-list являются экстремальными, это одна из самых важных команд, поэтому вы можете включать или исключать практически любые критерии, которые вы можете себе представить.
Конечно, обратитесь к странице руководства git-rev-list (1) .
источник
git-log
уступает.git-log
это фарфор,git-rev-list
это сантехника.Если вы хотите просто получить хеш последнего коммита для изменения определенного набора файлов (и хотите избежать
awk
), вы можете использовать:Это может быть полезно для получения хеша коммита для последующего использования с
git describe
.Например (на случай, если это кому-нибудь пригодится)…
Я создаю идентификатор текущей версии, учитывая последнюю фиксацию для изменения любого исходного файла (при условии, что вы помечаете версии такими тегами
mycode-1.2.1
):Это производит идентификаторы как:
mycode-1.2.1
- когда текущее состояние исходных файлов соответствует теговой версииmycode-1.2.1-g3k7s2
- когда текущее состояние исходных файлов соответствует фиксации после теговой версииmycode-1.2.1-g3k7s2-mod
- когда текущее состояние исходных файлов было изменено с момента последнего коммита после теговой версииmycode-unknown
- когда еще не создан тег версииисточник
$VN
выглядит как какая-то кошмарная нежить SVNЯ не уверен, что это то, что вы хотите, но если вы делаете,
git log <thefile>
чтобы получить коммиты, которые изменили этот файл. Вы можете выбрать самый верхний. Это должен быть тот, кого вы ищете.источник
git log -n1 -- <thefile>
(или перенаправляете вывод,head -1
если хотите тратить ресурсы), вам не нужно вручную выбирать верхнюю строку (см. ответ Джо Лисса )-n
и использовать-1
напрямую.Чтобы получить только ссылку на одну строку, попробуйте:
источник
Как только у вас будет идентификатор SHA для коммита, который вы хотите использовать
git log FILENAME
, вы сможетеgit show SHA_ID_HERE
увидеть, что вы сделали для этого коммита. Вам даже не нужно вводить весь идентификатор; первых 6 символов должно быть достаточно.источник
git show $(git log -1 --pretty="%H" -- FILENAME)