Как восстановить весь каталог из истории репозитория git?

91

Я хотел бы восстановить весь каталог (рекурсивно) из истории моего репозитория git.

Есть только 1 ветка (мастер).

Я знаю коммит, в котором были ошибки.

Могу ли я использовать хэш sha1 родительского коммита для восстановления состояния каталога, которое было до включения ошибок?

Я подумал примерно так:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

но это не сработало.

самый разыскиваемый
источник
7
попробуйте добавить '-' между ревизиями и путями:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
Карлос Кампдеррос,
это помогло. Спасибо большое.
Mostwanted
1
@ CarlosCampderrós Напиши это как реальный ответ и собери свои 15 баллов, прежде чем это сделает кто-то другой;)
ralphtheninja
@MagnusSkog Я не был уверен, что это сработает, поэтому оставил комментарий, просто чтобы проверить. Теперь, когда я уверен, что это работает, я записал это в качестве ответа :)
Карлос Кампдеррос,
2
Как общий намек, «это не сработало» не очень полезно. Расскажите, почему это не сработало, в идеале с выводом ошибок (обрезать, если он очень длинный).
me_and

Ответы:

156

попробуйте добавить '-' между ревизиями и путями:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

И если вы хотите восстановить каталог из предыдущей фиксации, вы можете заменить хеш фиксации на HEAD ~ 1, например:

git checkout HEAD~1 -- path/to/the/folder/ 
Карлос Кампдеррос
источник
та же команда, почти другое назначение: stackoverflow.com/questions/953481/…
cregox 06
18
Однако есть одна проблема: OP не указывает, существует ли еще каталог. Чтобы восстановить существующий каталог до состояния фиксации, сначала необходимо удалить содержимое каталога. В противном случае существующие файлы, которых не было в старой фиксации, не будут удалены.
Альберто
7
+1 @ Альберто однозначно согласен. rm -Rf path/to/the/folderЗатем я сделал git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/- Результат: на этом пути были точно такие же файлы, как и в этой фиксации, без различий и дополнительных файлов, которые были созданы после этой фиксации. Вот чего я хочу.
therobyouknow
2
что делает --?
Рэй Фосс
2
@RayFoss сообщает git, что следующие параметры являются файлами (иначе их можно спутать с хешем фиксации, веткой или чем-то еще). Обычно они не нужны, но их не помешает поставить
Карлос Кампдеррос
3

Это можно сделать двумя простыми способами:

Если фиксация, включающая ошибки, включала только ошибки, используйте, git revertчтобы инвертировать их последствия.

Если нет, то простой путь таков:

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"
Дэниел Питтман
источник
1

Если вы просто сделаете git checkout <SHA-ID>это, это временно переместит вас в этот ша-коммит.

Каждый объект фиксации содержит всю структуру диска в то время, поэтому, если у вас есть файлы и вам нужно их скопировать, вы можете это сделать. Предупреждение: вы не будете ни в одной ветке, поэтому вам придется вернуться к мастеру, прежде чем копировать файл в свое рабочее дерево и фиксировать его.

Марк Фишер
источник
re "вернуться к мастеру" вы имеете в виду мастер оформления заказа?
Pacerier