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