HotLog

понедельник, 21 ноября 2011 г.

Git. Восстановление удаленных в предыдущих ревизиях файлов или обход Already up-to-date при мерже..

Иногда надо восстановить потертые несколько ревизий назад файлы, сохранив их историю. Попытка мержить с тем, что находится ниже по дереву ревизий приводит к ошибке Already up-to-date. Например. Выполним следующие команды: Вывод последней команды будет такой (у вас будет отличаться хешами ревизий): Итак. Допустим, мы вспомнили, что в ревизии 91185e8 зря удалили файл 1.txt и надо его восстановить. Причем, сохранив историю изменений. Если мы попробуем мерж с ревизией 4629fbed(где файл еще существовал), нам скажут, что уже все смержено: Выход в использовании более низкоуровневых команд гита. Алгоритм следующий:
  1. привести текущие файлы в интересующее нас состояние (в данном случае - восстановить 1.txt из ревизии 4629fbed)
    $ git checkout 4629fbedf7d57 1.txt
  2. записать текущее дерево в базу (выведет хеш записанного дерева)
    $ git write-tree
    82a6654d94d0425c747f1926279a9487bdc95c6a
  3. записать коммит с деревом, записанным в предыдущей ревизии, и парентами: текущая ревизия и ревизия, где файл еще существовал
    $ echo "merge" | git commit-tree 82a6654d -p 0301aba7 -p 4629fbed
    a75e4109b929b7b0f53b2bc0a8284fcf8569a5e
  4. перейти на новый коммит
    $ git reset a75e41
После чего можно просмотреть историю файла 1.txt c помощью git blame 1.txt, а увидеть дерево с помощью git log --graph.

2 комментария:

  1. приветствую...
    а как с Вами связаться можно? спасибо

    ОтветитьУдалить
  2. Спасибо за статью. Интересно и качественно описали всё.

    Интересно SEO и маркетинг - mr-nelus.com

    ОтветитьУдалить