Как найти последнюю версию git, которая изменила файл?
Я хочу найти последнюю фиксацию, которая изменила исходный файл.
Я могу использовать git blame
, чтобы увидеть все даты для коммитов по каждой строке, но трудно увидеть, какой именно фиксация была последней, чтобы коснуться файла.
Как я могу найти последнее коммит, касающееся данного файла в моем репозитории git?
Ответы
Ответ 1
git log
поддерживает просмотр истории определенных файлов (и каталогов), поэтому вы можете написать это:
git log my/file.c
Если вы действительно хотите только перечислить последнее последнее сообщение, например, использовать его в script, вы можете использовать -n 1
:
git log -n 1 --pretty=format:%H -- my/file.c
--pretty=format:%h
сообщает git log
показывать только хеш фиксации (благодаря TheBamf). Разделитель --
останавливает имя файла, получая интерпретацию как имя фиксации, на всякий случай, если оно неоднозначно.
Ответ 2
Если вы хотите просто получить хэш последней фиксации для изменения определенного набора файлов (и хотите избежать awk
), вы можете использовать:
git log -n 1 --pretty=format:%h -- <path>
Это может быть полезно для получения хэша commit для последующего использования с помощью git describe
.
Например (в случае, если это полезно для всех)...
Я создаю текущий идентификатор версии, рассматривая последнюю фиксацию для изменения любого исходного файла (при условии, что вы отмечаете версии с тегами, например mycode-1.2.1
):
COMMIT=$(git log -n 1 --pretty=format:%h -- *.c *.h)
if VN=$(git describe --always --abbrev=5 --match "mycode-*" $COMMIT 2>/dev/null) &&
case "$VN" in
mycode-*)
git update-index -q --refresh
test -z "$(git diff-index --name-only HEAD *.c *.h)" ||
VN="$VN-mod" ;;
*) VN="mycode-unknown-g$VN" ;;
esac
then
continue
else
VN="mycode-unknown"
fi
Это создает идентификаторы типа:
-
mycode-1.2.1
- если текущее состояние исходных файлов соответствует помеченной версии
-
mycode-1.2.1-g3k7s2
- если текущее состояние исходных файлов соответствует фиксации, следуя помечаемой версии
-
mycode-1.2.1-g3k7s2-mod
- когда текущее состояние исходных файлов было изменено с момента последнего коммита после маркированной версии
-
mycode-unknown
- если еще не создан тег версии
Ответ 3
Если вы просто хотите найти самую последнюю фиксацию, то вам не нужно git-log
, вы хотите git-rev-list
, в котором перечислены объекты фиксации, изменяющие этот файл, в этом пути фиксации, начиная с самого последнего (в хронологическом порядке). Проще говоря:
git rev-list -1 <commit> <filename>
Для git-rev-list
в вашем случае вы просто поставьте:
- Количество коммитов для включения или -1 только для последних,
- Отладка (или фиксация id), чтобы начать оглядываться назад, HEAD, если вы уже на ней, или - все, если вы хотите, чтобы все известные коммиты и
- Относительный путь к вашему файлу.
Это просто возвращает самый последний идентификатор фиксации в текущей ветке для изменения этого файла, например: 215095e2e338525be0baeeebdf66bfbb304e7270
Для более сложного примера вы можете использовать имена тегов и даже удаленные ссылки и включать относительные имена путей с помощью подстановочных знаков, например:
git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt
... Что скажет вам, что самое последнее изменение было в подстановочном матче в этой истории ветвей. Параметры rev-list экстремальны, это одна из самых важных команд сантехники, поэтому вы можете включать или исключать практически любые критерии, которые вы можете себе представить.
Конечно, обратитесь к git -rev-list (1) странице руководства.
Ответ 4
Я не уверен, что это то, что вы хотите, но если вы делаете git log <thefile>
, чтобы получить коммиты, которые изменили этот файл. Вы можете выбрать самый верхний. Это должен быть тот, который вы ищете.
Ответ 5
Как только у вас есть идентификатор SHA для фиксации, который вы хотите использовать с помощью git log FILENAME
, вы сможете сделать git show SHA_ID_HERE
, чтобы узнать, что вы сделали для этого конкретного коммита. Вам даже не нужно вводить полный идентификатор; первых 6 символов должно быть достаточно.
Ответ 6
чтобы получить только ссылку на одну строку, попробуйте:
git log -n1 --oneline <path> | awk '{print $1;}'