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

Видео урок: Улучшение коммитов

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

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

Если мы поменяем что-то из этой информации, тогда изменится и хеш. Это часть встроенной безопасности и интеграции данных в Git, то есть ничего не может быть изменено в истории. Нам гарантированно, что все останется тем же самым. Таким образом, сложно вернуться и отредактировать информацию в этих коммитах, поскольку то, что мы делаем, не сочетается с безопасностью данных в Git репозитории, и Git не хочет, чтобы мы это делали. Давайте я покажу вам это на примере. Допустим, мы хотим что-то изменить в коммите, который представлен слепком B, тот, что в середине. Итак, 38e73d6134

То есть он такой, как когда мы сделали этот коммит. Если мы внесем в него изменения, даже если мы просто изменим сообщение коммита, тогда SHA станет другим, и если SHA станет другим, тогда родитель слепка C также должен быть изменен, потому что он должен указывать на что-то другое. А если мы изменим родителя слепка C, теперь, если мы пропустим его через алгоритм, он также появится с другим SHA.

И таким образом, по цепочке каждый отдельный Git объект должен быть изменен, только потому, что мы ранее сделали изменение. И вот, интеграция данных, которая есть в Git, теперь сломана. Поэтому Git не хочет, чтобы мы этого делали. Однако, у нас есть возможность изменить последний коммит, поскольку от него пока что еще ничего не зависит. Итак, у нас есть возможность изменить самый последний коммит, коммит, на который указывает HEAD. Но как только мы вставим новый, этот мы уже не сможем редактировать, а тот, что в конце, мы все еще можем редактировать, и мы можем это сделать при помощи опции amend.

Допустим, у нас есть это изменение для resources, которое находится в нашей рабочей директории, изменение, которое мы сделали в последнем ролике. А теперь мы продолжим и добавим его в репозиторий. Пишем git add resources.html, и это изменение будет добавлено в буфер. Теперь мы его закоммитим, пишем commit с сообщением "Rearrange the items to bring on a trip". Теперь оно закоммичено. Пишем git log. Видим, что присутствует изменение. Оно в самом верху.

Это коммит, на который на данный момент указывает HEAD. Самый последний коммит. А что, если мы скажем: "На самом деле, это не совсем то, что мы хотели сделать. Мы хотим сделать изменение". Это изменение может быть изменением в сущности коммита. Допустим, мы хотим вернуться в resources и говорим: "Знаете что? А давайте переместим средство от мошкары. Оно должно идти прямо под солнцезащитным кремом". Перемещаем, сохраняем. И если мы напишем git status, мы увидим, что в resources у нас снова есть изменение, но этого изменения нет в предыдущем коммите.

Мы хотим добавить его в этот коммит. Мы можем отредактировать коммит, вставив изменение в буфер, добавляем resources.html, вот оно. Оно находится в буфере, и давайте изменим наш коммит, сделав это изменение, git commit amend, а затем мы снова пишем сообщение. Давайте используем это же сообщение - "Rearrange the items to bring on a trip". Копирую и вставляю его, теперь коммит изменен. Смотрим.

Пишем git log, данное изменение заключается в том, что мы всего лишь переместили вещь для поездки. Вы также можете его использовать, если хотите поменять сообщение для коммита. Допустим, это сообщение ужасно. Я ничего не отправлял в буфер, но я хочу изменить сообщение, "Rearrange the items to bring on a trip, to bring on an outdoor trip", снова его меняем, git status. Рабочая директория чиста, git log, и вот вещи, которые нужны для путешествий. Обратите внимание, что каждый раз, когда мы вносим изменения, меняется SHA.

Это происходит каждый раз. Даже если мы просто меняем сообщение, дату, когда мы делаем коммит, все меняется, меняется SHA. И поэтому у нас есть возможность редактировать только последний коммит, тот, на который указывает HEAD.