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

Видео урок: Возврат коммита

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

В предыдущем ролике мы рассмотрели, как можно использовать команду amend для старых коммитов, создавая новый коммит, который отменяет изменения предыдущего. Мы поговорили о том, как это можно сделать вручную, просто изменяя файлы, или делая чекаут предыдущей версии файла, а затем собирая все вместе, чтобы мы могли сделать коммит. Но Git также дает нам полезную возможность, когда мы можем отменить изменения коммита целиком и полностью, мы можем использовать команду revert. Давайте посмотрим на git log. Вот коммит, о котором мы говорили - "Rearrange the items to bring on an outdoor trip".

Команда revert возьмет все изменения, которые здесь были, и уберет их. Она сделает прямую противоположность тому, что есть в этих изменениях. Таким образом, все, что было добавлено, будет удалено, все, что было удалено, будет снова добавлено, а все, что было изменено, будет возвращено в предыдущее состояние. Это будет полностью зеркальное отображение данного коммита. И использовать это довольно просто. Нам нужно взять часть ссылки на коммит. Помните, что целиком она нам не нужна. Я просто копирую ее и использую git revert, а затем я вставляю этот S-H-A.

И это говорит о том, что все будет сделано за один шаг. Команда не будет собирать коммит, а затем ждать нас, она пройдет дальше и просто сделает этот коммит. Таким образом, я нажимаю Return, и тогда у меня появляется шанс отредактировать сообщение для коммита, и это будет сделано в TextMate. Вот он появляется и говорит - все верно, если вы хотите отредактировать это сообщение, прежде чем я его закоммичу, сделайте это сейчас. В принципе, сообщение по умолчанию меня устраивает. Только строки 1, 2 и 3 будут частью коммита, все остальное, что закомментированно, будет игнорироваться, и не войдет в сообщение для коммита.

Я просто нажимаю Save и Close, а затем в игру вступает Git и делает то, что должен. Он сделал полный коммит. Если я напишу git status, вы увидите, что моя рабочая директория чиста, но если написать git log, вы увидите, что я сделал новый коммит, который "переворачивает" старый коммит. И теперь, если мы откроем resources и посмотрим сюда, вы увидите, что средство против мошкары, солнечные очки и крем для загара снова находятся внизу списка. Также, с revert мы можем передать опцию -in, и тогда коммит не будет сделан, изменение будет отправлено в буфер, и оно будет дожидаться, когда вы сами сделаете коммит.

Вы сможете сами написать сообщение, а также внести другие изменения, которые вы, возможно, захотите внести. git revert работает действительно хорошо с простыми вещами. Мы просто делаем изменение с A на B, а затем мы переключаемся с B обратно на A. Но что, если изменения действительно сложные? Что если в это время были сделаны другие изменения? Что если, например, файлы перемещали или переименовывали? Тогда немного сложнее сделать точное зеркальное отображение коммита. Git в таком случае использует более сложный набор правил для работы с такими изменениями, и в этом наборе правил присутствует то, что мы используем для слияния.

Слияние (merging) - это более продвинутый технический прием, о котором мы поговорим немного позже. Но если вам нужно сделать возврат чего-то сложного, вы будете делать слияние между текущим бранчем и новым набором изменений, которые вы хотите с ним объединить.