Як відновити цілий каталог з історії репозиторію git?


91

Я хотів би відновити цілий каталог (рекурсивно) з історії мого сховища git.

Існує лише 1 гілка (майстер).

Я знаю коміт, де були включені помилки.

Чи можу я використовувати хеш sha1 батьківського коміту для відновлення стану каталогу, як це було до включення помилок?

Я думав про щось подібне:

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

але це не спрацювало.


7
спробуйте додати '-' між версіями та шляхами:git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
Карлос Кампдеррос,

це допомогло. дуже тобі дякую.
розшукуваний

1
@ CarlosCampderrós Напишіть це як справжню відповідь і зберіть свої 15 балів, перш ніж хтось інший зробить це;)
ralphtheninja

@MagnusSkog Я не був впевнений, що це спрацює, тому я зробив коментар лише для перевірки. Тепер, коли я впевнений, що це працює, я записав це як відповідь :)
Carlos Campderrós

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

18
Хоча є одна проблема: в OP не вказано, чи існує каталог ще. Щоб відновити існуючий каталог до стану коміту, спочатку слід видалити вміст каталогу. В іншому випадку існуючі файли, яких не було в старому коміті, не буде видалено.
Альберто

7
+1 @ Альберто однозначно погоджуюсь. Я зробив rm -Rf path/to/the/folderтоді git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/- Результат: у цьому шляху були точно такі ж файли, як у цьому коміті, ніяких відмінностей та зайвих файлів, які були створені після цього коміту. Що я хочу.
therobyouknow

2
що робить --?
Ray Foss

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>це, це тимчасово перемістить вас до цього sha-commit.

На той час кожен об’єкт коміту містить всю структуру диска, тому якщо у вас є файли і вам потрібно їх скопіювати, ви можете це зробити. Попередження, однак, ви не будете знаходитись у жодній гілці, тому вам доведеться повернутися до майстра, перш ніж копіювати файл у ваше робоче дерево та зафіксувати його.


повторно "повернутися до майстра" ви маєте на увазі майстра оплати?
Пейс’єр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.