Как мне найти самый последний git commit, который изменил файл? - PullRequest
151 голосов
/ 24 января 2011

Я хочу найти самый последний коммит, который изменил исходный файл.

Я могу использовать git blame, чтобы увидеть все даты коммитов по каждой строке, но трудно точно определить, какой коммит был последним, кто коснулся файла.последний коммит, который коснулся указанного файла в моем git-репозитории?

Ответы [ 6 ]

185 голосов
/ 24 января 2011

git log поддерживает просмотр истории определенных файлов (и каталогов), поэтому вы можете назвать ее так:

git log my/file.c

Если вы действительно хотите перечислить один последний коммит, например, чтобы использовать его в скрипте, используйте параметр -n 1:

git log -n 1 --pretty=format:%H -- my/file.c

--pretty=format:%h говорит git log показывать только хеш коммита. Разделитель -- предотвращает интерпретацию имени файла как имени коммита, на случай, если оно неоднозначно.

32 голосов
/ 25 сентября 2015

Если вы просто хотите найти самый последний коммит, то вам не нужно git-log, вам нужен git-rev-list, в котором перечислены объекты фиксации, изменяющие этот файл, в этом пути фиксации, начиная с самого последнего (в хронологическом порядке). Проще говоря:

git rev-list -1 <commit> <filename>

Для git-rev-list в вашем случае вы просто поставляете:

  • Количество коммитов для включения или -1 только для самых последних
  • ветвь (или идентификатор коммита), с которой нужно начать оглядываться назад, HEAD , если вы уже на ней, или - все , если вы хотите все известные коммиты, и
  • Относительный путь к вашему файлу.

Это просто возвращает самый последний идентификатор фиксации в текущей ветви, чтобы изменить этот файл, например: 215095e2e338525be0baeeebdf66bfbb304e7270

В более сложном примере вы можете использовать имена тегов и даже удаленные ссылки и включать относительные имена путей с подстановочными знаками, например:

git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt

... Что скажет вам, что было самым последним изменением в подстановочном совпадении в истории этой ветви. Варианты списка оборотов экстремальны, это одна из наиболее важных команд сантехники, поэтому вы можете включать или исключать практически любые критерии, которые вы можете себе представить.

Конечно, обратитесь к руководству git-rev-list (1) .

26 голосов
/ 24 января 2013

Если вы хотите просто получить хеш последней фиксации для изменения определенного набора файлов (и хотите избежать awk), вы можете использовать:

git log -n 1 --pretty=format:%h -- <path>

Это может быть полезно для получения хеша коммита для последующего использования с 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 - когда еще не создан тег версии
9 голосов
/ 24 января 2011

Я не уверен, что вы этого хотите, но если вы делаете git log <thefile>, чтобы получить коммиты, которые изменили этот файл. Вы можете выбрать самый верхний. Это должен быть тот, кого вы ищете.

1 голос
/ 24 января 2011

Получив идентификатор SHA коммита, на который вы хотите посмотреть, используя git log FILENAME, вы сможете выполнить git show SHA_ID_HERE, чтобы увидеть, что вы сделали для этого конкретного коммита. Вам даже не нужно вводить весь идентификатор; первых 6 символов должно быть достаточно.

0 голосов
/ 17 августа 2012

, чтобы получить только ссылку на одну строку, попробуйте:

git log -n1 --oneline <path> | awk '{print $1;}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...