Восстановить файл из старого фиксации в git

У меня есть старый фиксат, который я сделал несколько недель назад. Я хочу восстановить только один файл из этого коммита. Что мне делать?

Ответ 1

git checkout '[email protected]{7 days ago}' -- path/to/file.txt

Это не изменит HEAD, он просто перезапишет локальный файл path/to/file.txt

См. man git -rev-parse для получения возможных спецификаций пересмотра (конечно, простой хеш (например, dd9bacb) будет делать красиво)

Не забудьте зафиксировать изменение (после обзора...)

Ответ 2

  • Проверьте файл с вашего старого фиксатора через git checkout [Revision_Key] -- path/to/file.
  • Добавить, зафиксировать, нажимать соответственно.

Ответ 3

Мне нужно было восстановить недавний файл, записанный в git. Так что, просто чтобы повторить и дать другую точку зрения, вам нужно сделать это, выполнив следующие два шага:

  1. Git Log -3
    Это показывает три последних коммитов. Прочитайте комментарии и имя автора, чтобы определить, какую именно версию вы хотите. Запишите этот длинный идентификатор фиксации (т.е. b6b94f2c19c456336d60b9409fb1e373036d3d71) для нужной версии фиксации.

  2. git checkout b6b94f2c19c456336d60b9409fb1e373036d3d71 - myfile.java
    Передайте идентификатор фиксации И имя файла, который вы хотите восстановить. Убедитесь, что у вас есть пробел до и после двойного дефиса.

Есть много других способов сделать это. Но этот самый простой, который я помню. Надеюсь, это поможет.

ПРИМЕЧАНИЕ. Если вы находитесь внутри пути/папки вашего проекта, нет необходимости вводить полный путь к файлу в команде извлечения.

Ответ 4

Во всех ответах упоминается git checkout <tree-ish> -- <pathspec>. Начиная с git v2.23.0, появился новый метод git restore, который должен предполагать часть того, за что 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