Как вернуться к предыдущему коммиту без потери последнего коммита в Git?
Вот что я хочу сделать. Я хочу вернуться к 2 коммитам раньше, вернуть файлы, которые изменились в этом коммите, возможно, как новый коммит. Но я не хочу потерять свой последний коммит. В моем последнем коммите есть некоторые ошибки в коде, но я бы хотел оставить это пока.
Я прочитал некоторые документы, но никто не дал понять, что происходит, когда вы перезагружаете голову. Вы теряете все коммиты вплоть до того, к которому вы сбрасываете (например, назад)?
Я пытаюсь понять, как все это работает, но я немного запутался в Git revert
, reset
а также checkout
команды.
Я понимаю, что я должен был спрятать последний коммит вместо коммитов, но это уже другая история.
2 ответа
revert
делает новый коммит, который отменяет изменения, сделанные старым коммитом. reset --hard
изменяет заголовок текущей ветви на указанный коммит. checkout
переключает рабочую копию в указанную ветку или коммит.
Когда вы переустанавливаете ветку на более старый коммит, более новые коммиты теряются, если они не являются частями других веток или предками тегов (они все еще доступны через reflog
хоть).
Не совсем понятно, что нужно делать, наиболее вероятные решения revert
(чтобы полностью вернуть старый коммит или серию коммитов) и rebase -i
(изменить старый коммит или удалить его из истории).
Если вы хотите вернуться, скажем, 2 коммитов предыдущего, вы можете просто сделать git checkout HEAD~2
, Это даст вам все как было тогда. Если бы вы были на ветке master
, git checkout master
вернет вас в настоящее. Если, однако, вы хотите сохранить текущее состояние, но запустить там новую ветку developmnt, git checkout -b HEAD~2
начну новую ветку там. Если вы хотите перемотать мастер, но не потерять свою текущую, незаконченную / сломанную работу, сделайте
git branch wip # New branch ends a current tip
git reset --hard HEAD~2 # Old branch rewound, get files from then
С участием $ git reflog
вы можете увидеть последние хэши, которые полезны для возврата в предыдущее состояние после потери последних коммитов, принудительно нажав на предыдущий коммит.
Также:
$ git fsck --no-reflog
$ git show <hash>
$ git checkout -b <new-branch> <hash>
GL