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

Видео урок: Использование reset для отмены коммита

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

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

А здесь же мы говорим Git: "Я хочу сам все контролировать, я хочу переместить указатель HEAD сюда, вот теперь отсюда начнется запись, и отсюда я начну делать коммиты". Похоже, мы снова возвращаемся к метафоре, о которой я вам говорил раньше, насчет касетного магнитофона. Помните, как я говорил, что указатель HEAD похож на воспроизведение и записывающую головку в касетном проигрывателе. Давайте представим, что мы записали час аудио. Мы нажимаем Stop, и если мы снова начнем запись. Конечно, она начнется прямо здесь, где было остановлено наше часовое аудио.

Но что будет, если мы перемотаем аудио на 10 минут назад? Теперь, если мы нажмем Record, новая запись перекроет последние 10 минут старого аудио. Это будет очень разрушительно. Теперь вы видите, почему git reset является такой мощной командой. Она делает то же самое. Она говорит - давайте сделаем перемотку на предыдущий коммит, и теперь отсюда будет идти запись. Мы просто перепишем все, что шло после него. Команда git reset всегда перемещает указатель HEAD. Это то, что она делает в любом случае. Но есть три различные опции, которые я хочу рассмотреть, и мы можем их использовать, чтобы контролировать поведение этой команды. Этими опциями являются soft, mixed и hard.

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

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

Но она не меняет рабочую директорию. Таким образом, буфер и репозиторий будут установлены на одну точку, а в рабочей директории будут все те изменения, что мы сделали. Все то, что было в последних версиях репозитория, все еще находится в рабочей директории. Работа не потеряна. Все можно заново отправить в буфер и закоммитить. А последняя опция самая "разрушительная", и это hard. Опция hard reset не только переместит указатель в репозитории. Она также сделает так, что буфер и рабочая директория будут ему соответствовать.

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