Как восстановить предыдущую версию в качестве новой фиксации в Git?

Итак, вот оно: как восстановить в Git предыдущую версию в моей истории, чтобы она стала новой фиксацией поверх моей текущей истории?

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

Edit: Если я просто сделаю git revert эта ошибка происходит:

git revert HEAD~1
error: could not revert f1b44e3... Towards translating API to kernel.
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

3 ответов


просто "checkout фиксация". Это перезапишет ваш текущий рабочий каталог с указанным снимком (фиксацией) вашего РЕПО из истории и сделает его вашим новым рабочим набором, который вы можете этапировать и зафиксировать по своему желанию. Если ты ... --2--> сразу после этого ваше РЕПО будет иметь то же содержимое файловой системы, что и фиксация, которую вы выполнили checkout to (при условии, что у вас нет других неустановленных или поэтапных изменений)

это не переписывают историю, ни редактировать или удалять любые предыдущие коммиты-так что он работает аналогично "откату" на Mediawiki:

cd ~/git/your-repo-root
git log
# find the commit id you want
git checkout <commitId> . 
# IMPORTANT NOTE: the trailing `.` in the previous line is important!
git commit -m "Restoring old source code"

Читайте также: откат к старому git commit в публичном РЕПО

о . (точка)

на . (точка) символ означает "текущий каталог" - это не что-то особенное или уникальное для git, это стандартное соглашение о файловой системе командной строки, которое одинаково для Windows, Linux, macOS и даже MS-DOS. Это работает подобно тому, как .. означает "родительский каталог". Я рекомендую прочитать следующее:

о checkout

имейте в виду:checkout является перегруженной командой в git - это может означать переключение ветвей (a la svn switch) или получить конкретный файл или зафиксировать из истории и поместить в рабочее пространство (a la svn update -r <id>). Это может означать и другие вещи.: https://git-scm.com/docs/git-checkout - я ценю, что это может смутить людей, особенно меня, когда я начал использовать git после использования TFS в течение многих лет (где "проверка" означает что-то совсем другое).


использовать git revert https://git-scm.com/docs/git-revert

git revert HEAD~1

Edit: Я вижу, что вы хотите сохранить историю, поэтому мой ответ ниже аннулируется. Тем не менее, это все еще полезно. Вы можете изменить порядок строк в редакторе, а затем продолжить.

теперь вернемся к исходному ответа.

вы можете попробовать команду rebase.

git rebase -i HEAD~n

здесь n примерно на один больше, чем количество коммитов между текущим и тем, к которому вы хотите вернуться. Итак, скажем, удаление последних 3 commits:

git rebase -i HEAD~4

как только вы там, он откроется в VIM или Nano (или другом редакторе). Просто удалите строки коммитов для удаления и выйдите из редактора.

в VIM это было бы esc и типа :exit enter.

теперь просто нажмите его. Это приведет к ошибке, поэтому сделайте принудительный толчок.

git push -f

возможно, вам придется указать имя ветви и вверх по течению. Этого должно хватить!

этот метод полностью удаляет плохие коммиты, поэтому он не просто добавит новую фиксацию с изменениями revert.

вот документы:https://git-scm.com/docs/rebase