Предыдущий ролик Следующий ролик  

Видео урок: Смешанная отмена

Git: обучение основам

В последнем ролике мы видели, что команда reset soft переместила указатель HEAD, но не сделала больше ничего. Она оставила наш буфер и рабочую директорию в покое. Теперь же мы рассмотрим reset mixed. Команда reset mixed работает так же, как и reset soft, с одной дополнительной особенностью, а она заключается в том, что буфер выглядит так же, как и репозиторий. Как я отмечал в последнем ролике, это хорошая идея - при работе с reset просто захватить несколько последних коммитов, скопировать их и вставить их в новый документ. Таким образом, мы сможем сослаться на них, если нам нужно будет попасть сюда позже.

Давайте сделаем тот же коммит, давайте вернемся в ту же точку во времени, но в этот раз давайте использовать reset mixed вместо reset soft. Мы не собираемся смотреть на действительный файл для refs/heads/master, мы сделали это в предыдущем ролике, мы знаем, что указатель HEAD перемещается в каждом из этих случаев. Так что давайте его скопируем и напишем git reset mixed, а затем наш новый SHA, который будет на него ссылаться. git reset mixed, она появляется и называет изменения, не находящиеся в буфере после сброса. Это то, что она обычно нам говорит, когда мы что-то вынимаем из буфера.

Давайте посмотрим, git status, и вы видите изменения, которые не находятся в буфере для коммита, то есть изменения, находящиеся в рабочей директории, включают модификации в resources.html. Если мы напишем git diff, мы увидим, что эти изменения существуют, и мы видим, что это наша ревизия, когда мы переместили солнечные очки, крем для загара, средство от мошкары обратно вниз. Опять же, эта команда сделала то же самое, что и git soft, единственное различие здесь заключается в том, как выглядит буфер.

Изменения, которые мы сделали, никуда не исчезли, они просто находятся только в рабочей директории. Они не находятся в двух местах, только в одном. Поэтому данная команда почти так же безопасна, как и reset soft, потому что изменения все еще существуют. Их можно снова отправить в буфер и закоммитить. Если мы быстренько посмотрим на логи, то увидим, что по факту мы обратно вернулись к этому коммиту, и отсюда будет начинаться новая запись. На самом деле, мы просто отменили этот коммит. В общем, если вы сделали два или три коммита, а затем подумали - знаете что? Я хочу вернуться обратно и переписать эти коммиты. Вы можете сделать это таким способом. Эта команда позволяет отмотать назад, например, три коммита, и все эти изменения до сих пор находятся в рабочей директории, и теперь вы можете продолжить и сделать снова эти коммиты.

Теперь, я хотел бы кое-что отметить насчет сброса (reset) - если написать git add для всего, вы увидите файл в буфере. Обратите внимание, что командой здесь является команда reset. Это то, что нужно сделать, если мы хотим вытащить что-то из буфера. git reset для HEAD, это коммит, который используется, на что бы сейчас ни указывал HEAD. Вместо SHA используется HEAD - а затем говорится, какой нужен файл. Мы не говорим Git переместить указатель, а затем сделать так, чтобы буфер выглядел так же, мы просто говорим ему получить файл, на который указывает HEAD.

То есть HEAD не перемещается, HEAD остается на том же месте, что и сейчас, но затем команда просто сбрасывает этот один файл от HEAD, чтобы буфер ему соответствовал. Это еще один вариант работы git reset, и, возможно, не очевидно, что он делает точно такую же работу. Вот и все, отправить изменения в буфер после сброса, они снова в нашей рабочей директории, точно так же, как при перемещении указателя HEAD, когда буфер выглядит так же.

Таким образом, git reset - это то же самое, что git reset mixed. Так же как и раньше, поскольку мы не записали никаких коммитов, старый коммит все еще здесь. Мы на самом деле можем к нему вернуться. Давайте быстренько это сделаем, пишем git reset, и мы просто убеждаемся, что сработала опция mixed, так что наш буфер выглядит так же. git reset и mixed обратно к будущей версии, статус без изменения. git log, и наша ревизия снова вернулась.