Как восстановить предыдущую версию в качестве новой фиксации в 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. Это работает подобно тому, как ..
означает "родительский каталог". Я рекомендую прочитать следующее:
- https://askubuntu.com/questions/54900/what-do-and-mean-when-in-a-folder
- https://superuser.com/questions/37449/what-are-and-in-a-directory
- что такое двойная точка(..) и одна точка(.) в Linux?
- https://unix.stackexchange.com/questions/118175/what-are-some-uses-of-single-period-double-period-in-the-shell-command
о checkout
имейте в виду:checkout
является перегруженной командой в git - это может означать переключение ветвей (a la svn switch
) или получить конкретный файл или зафиксировать из истории и поместить в рабочее пространство (a la svn update -r <id>
). Это может означать и другие вещи.: https://git-scm.com/docs/git-checkout - я ценю, что это может смутить людей, особенно меня, когда я начал использовать git после использования TFS в течение многих лет (где "проверка" означает что-то совсем другое).
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