Git - Найти коммит, где файл был добавлен

208

Скажем, у меня есть файл, foo.jsкоторый был зафиксирован некоторое время назад. Я хотел бы просто найти коммит, где этот файл был впервые добавлен.

После прочтения ответов и моей собственной работы, это работает для меня

git log --follow --diff-filter=A --find-renames=40% foo.js
Стивен Пенни
источник

Ответы:

318

Вот более простой «чистый Git» способ сделать это без необходимости в конвейере:

git log --diff-filter=A -- foo.js

Проверьте документацию. Вы можете сделать то же самое для Удаленных, Модифицированных и т. Д.

https://git-scm.com/docs/git-log#Documentation/git-log.txt---diff-filterACDMRTUXB82308203

У меня есть удобный псевдоним для этого, потому что я всегда забываю это:

git config --global alias.whatadded 'log --diff-filter=A'

Это делает это так просто, как:

git whatadded -- foo.js

Приведенная ниже строка содержит рекурсивный поиск по подкаталогам $PWDдля foo.jsбез необходимости указывать абсолютный или относительный путь к файлу, и при этом файл не должен находиться в том же каталоге, что и файл.$PWD

git log --diff-filter=A -- **foo.js
stelterd
источник
27
+1! Однако мой файл был в подпапке, поэтому работал только после того, как я добавил звездочку впередиgit log --diff-filter=A -- *subfolder/foo.js
Geo
4
Как это работает с файлами, которые объединены из других ветвей, но которые не обязательно были добавлены в ветку, слитую пользователем, выполняющим объединение?
g33kz0r
Ссылка на документ выше не переходит к информации о флаге. Может быть, это изменилось с момента публикации. git-scm.com/docs/git-log#Documentation/…
webbower
1
Да, они изменили структуру якоря в документах. Обновлено, спасибо!
Stelterd
@ Geo, я думаю, что я понимаю, что вы говорите, но не совсем, но у меня есть похожий вариант использования, где я обычно остаюсь в корне проекта из каталога git и выполняю команды оттуда, а использование поставляемого одного вкладыша git log --diff-filter=A -- foo.jsне печатало зафиксировать ID / хеш для STDOUT в моем терминале, а мне пришлось
указать
17
git log --oneline -- foo.js | tail -n 1
Сет Робертсон
источник
1
Я был бы рад иметь --follow.
Ясуши Сёдзи
Принятое решение не сработало для меня, но это сработало. Спасибо!
Стиви Ховард
1

Следующее может быть не в ваших интересах, но я думаю, что это поможет вам в будущем и является частью отладочной экосистемы в Git:

Вы можете использовать, git-blameчтобы показать, какая ревизия и автор последней изменяли каждую строку файла, особенно аннотацию файла. Посетите https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git

Например,

git blame -L 174,190  xx.py
Reidel
источник
Не могли бы вы объяснить, что делает каждый из операндов? Я понимаю, что вы предоставили ссылку на соответствующий RTFM, но небольшое разъяснение сделает ваш пост универсальным магазином.
rossmcm
Как говорится в книге Pro-Git. Если вы обнаружили ошибку в своем коде и хотите знать, когда она появилась и почему, аннотации к файлам часто являются вашим лучшим инструментом. Он показывает, какой коммит был последним, который изменил каждую строку любого файла, поэтому в этом примере, который я показал, используется опция -L, чтобы ограничить вывод строками со строки 174 до 190, а последнее - просто целевой файл, который вы хотите проверить ( xx.py) в данном случае файл Python @rossmcm
Reidel