Как найти последнюю версию 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;}'