У меня есть старый коммит, который я сделал несколько недель назад. Я хочу восстановить только один файл из этого коммита. Что мне делать?
У меня есть старый коммит, который я сделал несколько недель назад. Я хочу восстановить только один файл из этого коммита. Что мне делать?
Ответы:
git checkout 'master@{7 days ago}' -- path/to/file.txt
Это не изменит HEAD, оно просто перезапишет локальный файл path/to/file.txt
Смотрите man git-rev-parse для возможных спецификаций ревизий (конечно, простой хеш (вроде бы dd9bacb
) подойдет)
Не забудьте зафиксировать изменение (после проверки ...)
revision-specification
так это то , что просили ОП :)
shacommit~1
(ex:), git checkout 0f4bbdcd~1 -- path/to/file.txt
чтобы получить коммит непосредственно перед этим.
git checkout [Revision_Key] -- path/to/file
.git checkout
может обрабатывать отдельные файлы (см. ответ по sehe), не нужно копировать и вставлять.
HEAD
, ORIG_HEAD
или любой из них в сочетании с ^
/ ~
/ @
-style нотации.
Мне нужно было восстановить недавний файл, записанный в git. Так что просто для того, чтобы повторить и дать другую точку зрения, вам нужно сделать это, выполнив следующие два шага:
git log -3
Это показывает три последних коммитов. Прочитайте комментарии и имя автора, чтобы определить, какую именно версию вы хотите. Запишите этот длинный идентификатор (например b6b94f2c19c456336d60b9409fb1e373036d3d71
) для версии коммита, которую вы хотите.
git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 -- myfile.java
Передайте идентификатор фиксации И имя файла, который вы хотите восстановить. Убедитесь, что у вас есть пробел до и после двойного дефиса.
Есть много других способов сделать это, но это самый простой, который я могу вспомнить.
ПРИМЕЧАНИЕ. Если вы находитесь внутри пути / папки вашего проекта, то нет необходимости вводить полный путь к файлу в команде извлечения.
Все ответы упоминаются git checkout <tree-ish> -- <pathspec>
. Начиная с git v2.23.0, появился новый метод восстановления git, который должен принять на себя часть git checkout
ответственности. Смотрите основные изменения в блоге GitHub .
Поведение этой команды по умолчанию заключается в восстановлении состояния рабочего дерева с содержимым, полученным из source
параметра (который в вашем случае будет хешем коммита).
Предполагая, что коммит хеш это abcdef
команда будет выглядеть так:
git restore --source=abcdef file_name
который (по умолчанию) помещает его в рабочее дерево. Если вы хотите поместить изменение непосредственно в индекс, чтобы его можно было сразу зафиксировать:
git restore --source=abcdef --worktree --staged file_name
или с короткими именами опций:
git restore -s=abcdef -W -S file_name