У меня есть Git-репозиторий с n коммитами.
У меня есть файл, который мне нужен, и который раньше находился в хранилище, и который я вдруг ищу и думаю: «О! Куда этот файл пошел?»
Есть ли (серия) команда (-ы) Git, которая сообщит мне, что «файл действительно_needed.txt был удален при коммите n-13»?
Другими словами, не просматривая каждый отдельный коммит и не зная, что в моем репозитории Git содержатся все изменения каждого файла, могу ли я быстро найти последний коммит, в котором был этот файл, и получить его обратно?
Ответы:
git log --full-history -- [file path]
показывает изменения файла, работают, даже если файл был удален.Пример:
Если вы хотите видеть только последний коммит, который удалил файл, используйте -1, например,
git log --full-history -1 -- [file path]
См. Какой коммит удалил файл
источник
git log -- */<<filename>>.<<file extension>>
не зная полного пути к файлу.Короткий ответ:
покажет вам все коммиты в истории вашего репо, включая коммиты слияния, которые коснулись
your_file
. Последний (верхний) - тот, который удалил файл.Некоторое объяснение:
--full-history
Флаг здесь важен. Без этого Git выполняет «упрощение истории», когда вы запрашиваете лог файла. В документах подробно рассказывается о том, как именно это работает, и мне не хватает смелости и смелости, необходимых для того, чтобы понять это из исходного кода, но в документации git-log есть, что сказать:Это, очевидно, относится к случаю, когда файл, история которого мы хотим, удаляется , поскольку самой простой историей, объясняющей конечное состояние удаленного файла, не является история . Есть ли риск, что
git log
без него--full-history
просто заявят, что файл никогда не создавался? К сожалению, да. Вот демонстрация:Обратите внимание на то, что
git log -- bar
в приведенном выше дампе терминала буквально не было вывода; Git «упрощает» историю до вымысла, которогоbar
никогда не было.git log --full-history -- bar
с другой стороны, дает нам коммит, который создалbar
и коммит, который его удалил.Чтобы было ясно: этот вопрос не просто теоретический. Я только просмотрел документы и обнаружил
--full-history
флаг, потомуgit log -- some_file
что мне не удавалось в реальном хранилище, где я пытался отследить удаленный файл. Упрощение истории иногда может быть полезно, когда вы пытаетесь понять, каким образом существующий в данный момент файл оказался в его текущем состоянии, но при попытке отследить удаление файла он с большей вероятностью испортит вас, скрыв коммит, который вас волнует , Всегда используйте--full-history
флаг для этого варианта использования.источник
git log
вывода совсем не очевидно, что последний коммит удалил файл. Я также попыталсяgit log --name-status --full-history -- file_name
иgit log -p --stat --full-history -- file_name
, но ни явно указывает на то, что файл был удален в последней фиксации. Это похоже на ошибку.mkdir somedir && cd somedir && git init && touch foo && git add foo && git commit -m "Added foo" && git checkout -b newbranch && touch bar && git add bar && git commit -m "Added bar" && git checkout master && git rm foo && git commit -m "Deleted foo" && git checkout newbranch && git rm bar && git commit -m "Deleted bar" && git checkout master && git merge newbranch && git log --name-status --full-history -- bar
включаетD bar
иA bar
для меня в вывод журнала с Git 2.12.2. Вы не видите эти строки в выводе? Какая у вас версия?git version 2.15.1
Да, ваша последовательность команд сообщаетD bar
иA bar
. Возможно, моя проблема связана с историей моего файла. Я прослеживал историю.htaccess
файла, который был gitignore'ed и удален. Я наконец понял это и добавил файл обратно. Когда я включаю--name-status
вgit log
команду, я вижу двеA .htaccess
записи (так как я добавил его обратно в последнем коммите), но нетD .htaccess
. Таким образом, кажется, что в некоторых случаях, даже если файл был удален из хранилища,git log
не будет отображаться явнаяD file_name
запись..htaccess
был добавлен в коммит X, но не включен в коммит слияния, который привел X на master? Это единственное, о чем я могу подумать, что я могу поспорить, должно выглядеть как файл, который был добавлен и никогда не удалялся, но все еще не присутствовал. Было бы интересно попытаться выяснить MCVE, а затем выяснить, является ли это ошибкой в Git, и если нет, то можно ли настроить мой ответ для обработки вашего случая.Журнал Git, но вы должны префикс пути с
--
Например:
источник
Я только что добавил здесь решение (есть ли способ в git перечислить все удаленные файлы в хранилище?) Для поиска коммитов удаленных файлов с помощью регулярного выражения:
Это возвращает все удаленное в каталоге с именем
some_dir
(каскадный). Любой sed regexp там, где\/some_dir\/
будет делать.OSX (спасибо @triplee и @keif)
источник
sed: 1: "/^commit/h;/\/some_dir\ ...": bad flag in substitute command: '}'
sed
, видимо, не всегда хороши с точками с запятой в качестве разделителей команд. Попробуйте изменить их на новые строки или переключиться наsed -n -e '/^commit/h' -e '\:/some_dir/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
работал для меня на OSX.Вы можете найти последний коммит, который удалил файл, следующим образом:
Дополнительная информация доступна здесь
источник
Пытаться:
источник