2014-03-13 5 views
2

Я развертываю приложение на производственном сервере, запустив git pull на этом производственном сервере.Восстановление старого git checkout при сохранении прикрепленного к ветке

Как часть резервной копии, я думаю об идее просто сохранить текущий хеш-код, а не копировать все файлы. Позже, во время восстановления, я хотел бы восстановить локальную версию репозитория из удаленного источника в сохраненный хеш фиксации. В идеале, он ведет себя так, как если бы я восстановил целое дерево, включая папку .git.

Чтобы сохранить текущий хэш совершить, я имею в виду git log -1 --format=%H

Для восстановления к определенному пересмотру, я отдаю себе отчет в команде git checkout hash. К сожалению, эта команда отделяет рабочую копию репозитория от ветки.

Есть ли команда или набор команд для восстановления локального репозитория git до состояния, которое оно было ранее (ака прозрачным способом в отношении дальнейших обновлений)? Так git pull будет обновлять рабочую копию до самой последней фиксации в соответствующей отрасли и обновить головной указатель и т.д.

ответ

0

Я знаю команду мерзавец контроль хэш. К сожалению, эта команда отсоединяет рабочую копию репозитория из филиала

Вы можете взять ветку и указать его обратно к фиксации, допускающей «прикрепление ветви», что вы спрашиваете о в теме вопроса:

$ git update-ref refs/heads/<branch> <hash> 
+0

Как будет обновлять-ref влияет на исходную копию и/или вытягивает дальнейшие обновления из источника? Пожалуйста, проверьте мой комментарий после предложения vonbrad, чего я хочу достичь. – alik

+0

@alik Я процитировал ту часть, которую я собирался затронуть в своем ответе, это было мое намерение дать вам дополнительный инструмент для работы, строго это и ничего. Теперь вы можете восстановить определенную ревизию в резервном репо и переписать ее в ветку. В остальном, не должно быть никакого эффекта на удаленные филиалы, поскольку, конечно, является локальной (отслеживающей) ветвью. – mockinterface

+0

Спасибо. Мне нужно проверить команду update-ref более глубоко. Вначале пробежать руководство было недостаточно. – alik

1

Вы можете проверить любую фиксацию, но это не приведет к восстановлению каталога .git в его прежнем состоянии, и «прикрепленный к той же ветке» не имеет никакого смысла. В git ветка - это просто ссылка на фиксацию, которая начинает последовательность фиксаций, из которой она исходит. У фиксации, которую вы проверили, есть своя история, но проверка ее приводит к специальному состоянию «отсоединенной головы» (вы не на вершине любой ветки, поэтому нет смысла, например, добавлять новые коммиты вверху).

+0

Мое видение заключается в том, что подпрограммы обновления сайта на производственном сервере не должны заботиться о том, было ли восстановление в прошлом или нет. Итак, с точки зрения дальнейших обновлений, вполне нормально, что локальный репозиторий восстановлен в состоянии, аналогичном тому, как это было бы между «git fetch» ​​и «git merge», если восстановление не было. – alik

+0

@alik Не только «привязанный к той же ветке» не имеет смысла, как указал @vonbrand, но также «отрывает рабочую копию репо из ветки», ветка остается указана на соответствующую фиксацию. Кроме того, вы намерены восстановить из удаленного репо, поэтому нет состояния «между« git fetch »и чем-либо еще, состояние - это состояние именно после извлечения и описывается набором ваших ветвей удаленного отслеживания. – mockinterface

+0

Прошу прощения за то, что я не прав, потому что я не очень люблю git. Я пытаюсь объяснить свою цель так ясно, как это позволяет мое понимание. «Между» относится к 'git pull', который выполняет то же самое, что и' git fetch', за которым следует 'git merge' с правильными аргументами. – alik

Смежные вопросы