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

Видео урок: Жесткая отмена

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

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

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

Я действительно хочу вернуться назад и сделать жесткий сброс с этой точки, а затем двигаться дальше. Ну что ж, давайте попробуем. Снова же, как и с двумя другими, возьмите несколько из этих коммитов и вставьте их в новый текстовый файл, так чтобы у нас были ссылки на эти коммиты, если мы захотим к ним вернуться. А коммит, к которому мы вернемся, будет тем же самым, мы просто вернемся вот к этому. Вот git reset с опцией hard к этому SHA, вот здесь, так что мы возвращаемся и меняем реверсивный коммит, который мы сделали.

Мы знаем, что HEAD сейчас находится на этой точке, и мы получаем имя коммита. Если мы взглянем на логи, то увидим, что по факту он указывает на более поздний коммит. И если мы напишем git status, то можно увидеть, что наша рабочая директория чиста, нет никаких следов этого файла. Нет никаких следов изменений, что мы сделали в resources.html. В этот момент мы бы могли снова сделать наше зеркальное отображение, если нужно, или если бы нам захотелось сделать что-то другое. Сейчас мы на самом деле перемотали наш проект к его предыдущему состоянию во времени.

Я сказал, что он все выбрасывает, но это не совсем правда, он не выбрасывает все. Он просто не сидит и ждет, что мы сделаем эти коммиты. Все же эти старые коммиты до сих пор тут, мы все еще можем переместить HEAD обратно к самой последней точке во времени. Давайте сделаем это, git reset дефис дефис hard, и мы снова вставим последний коммит. Вот он снова здесь, этот коммит все еще здесь, он до сих пор сидит в папке git, просто указатель HEAD перемещен от него.

В какой-то момент, если бы мы ничего с этим не делали, он бы собрал мусор и выбросил. Это был бы долгий путь. На какой-то момент он бы здесь "завис", просто чтобы убедиться, что мы не хотим к этому вернуться. Но нам не так легко было бы вернуться, если бы здесь мы не записали эту ссылку. У нас не было бы этих изменений в рабочей директории, и мы бы не знали имя коммита, который мог бы нас сюда вернуть. И хотя мы не делали это в двух других примерах сброса, давайте предпримем дополнительный шаг и сделаем здесь новый коммит.

Пишем git log, и вместо того, чтобы просто сделать зеркальное отображение этого коммита, давайте перемотаем сюда, прежде чем все реорганизуем. Я использую номер 2907 в качестве SHA, пишем git reset hard, и давайте перемотаем обратно на эту точку. Мы переходим обратно на git log. Мы видим, что вернулись к удаленным сокращениям с текста страницы. git status, в буфере и рабочей директории ничего нет. И если мы откроем resources.html, прокрутим вниз до этого списка, вы увидите, что он снова находится в исходном состоянии.

То есть на самом деле была сделала реверсия, и мы смогли сделать перемотку. Допустим, сейчас мы хотим сделать дополнительные изменения и пойти дальше. Вот мы хотим переместить солнечный очки сюда, перед шляпой, вставить их впереди, затем сохраняем, закрываем, git status. Давайте напишем git commit и используем опцию -a, тогда за раз буду закоммичены все мои изменения с сообщением, пишем "Moved sunglasses higher in list of suggested outdoor items".

Сейчас сделан новый коммит. Ничего в директории. git log. Вставлен новый коммит. После этого идет этот. На самом деле я сделал перемотку во времени и начал записывать. И теперь HEAD указывает на этот новый коммит. Все мои будущие коммиты будут идти от него. Другие коммиты, что мы сделали, теперь просто потеряны. Они сидят заброшенными в папке git, и, очевидно, они будут собраны в коллекцию мусора. Вот так вы можете использовать три разные опции для reset – soft, mixed и hard.

Еще раз, будьте осторожны, потому что они позволяют переписывать данные.