Для 1 и 2 все, что вам нужно сделать, это:
git stash -u #same effect as git reset --hard, but can be undone
, это исключит любые изменения.Будьте осторожны, если вы используете reset
.Читайте о манипулировании индексом и перестановками жестких, мягких и смешанных опций с перезагрузкой и проверкой.Книга Progit объясняет это подробно: http://progit.org/2011/07/11/reset.html
Для 3,
git reset --hard HEAD^
, но было бы лучше выдать git stash -u
до этого - на случай, если у вас есть ожидающие изменения.
Это сбросит текущую ветвь к родителю текущего коммита.Посмотрите "Tree-Ish" онлайн.^ и ~ N после ссылки позволят вам указать на любые достижимые точки в истории этой ссылки.Чтобы понять, как история отслеживается в git, «Git для компьютерных ученых» хорошо объясняет направленный ациклический граф: http://eagain.net/articles/git-for-computer-scientists/
Чтобы получить отдельные файлы из состояния текущего коммита (т. Е. Выбросить изменения),Вы можете использовать checkout
git checkout HEAD -- <a list of files>
Если вы ввели последнюю команду сброса выше по ошибке, у вас не будет проблем.Git следит за тем, какие ветки использовались в reflog.
git reflog
покажет вам историю.В этих выходных данных вы можете видеть, как ссылаться на каждый из них, поэтому:
git reset --hard HEAD@{1}
сбросит ветку до того места, где раньше было 1 изменение.
Добавить, если вы хотите стеретьигнорируемые файлы и неотслеживаемые файлы, вы можете стереть с этим:
git clean -xdf