В любой момент вам может потребоваться что-либо отменить. Здесь вы рассмотрите несколько основных способов отмены сделанных изменений.
Будьте осторожны, не все операции отмены в свою очередь можно отменить! Это одна из редких областей Git, где неверными действиями можно необратимо удалить результаты своей работы.
Отмена может потребоваться, если вы сделали коммит слишком рано, например, забыв добавить какие-то файлы или комментарий к коммиту.
Допустим, у вас есть коммит, в котором вы исправили сообщение, выводимое одним из скриптов.
Обратите внимание, что идентификатор этого коммита 1f1124b9, вам это понадобится в дальнейшем.
Если вы хотите изменить (дополнить) только комментарий к последнему коммиту, нажмите в дополнительном меню раздела ( )Система управления версиями (Source Control).
Visual Studio Code откроет редактор коммита, в котором вы можете изменить сообщение.
Измените сообщение коммита, сохраните изменения и закройте редактор.
В разделе Граф системы управления версиями (Source Control Graph) в увидите, что сообщение изменилось, как вы и хотели. Если вы посмотрите на подробности то увидите, что изменился и идентификатор коммита. Вместо 1f1124b9 он стал 14d28d8b.
Это наглядно демонстрирует тот факт, что Visual Studio Code не редактирует существующий коммит. Она удаляет его, а вместо него создает новый коммит.
Если вы хотите изменить сам коммит, добавить в него другие измененные файлы, выполните недостающие изменения и добавьте их в индекс. После этого нажмите кнопку Фиксация (Исправление) (Commit (Amend)).
Visual Studio Code откроет редактор коммита, в котором вы можете изменить сообщение. Измените его, сохраните изменения и закройте редактор. Или, если в этом нет необходимости, можете не изменять сообщение, а просто закрыть редактор. После этого Visual Studio Code зафиксирует изменения в репозитории и вместо старого коммита вы увидите новый коммит.
Очень важно понимать, что когда вы вносите правки в последний коммит, вы не столько исправляете его, сколько заменяете новым, который полностью его перезаписывает. В результате все выглядит так, будто первоначальный коммит никогда не существовал, а так же он больше не появится в истории вашего репозитория.
Очевидно, смысл изменения коммитов в добавлении незначительных правок в последние коммиты и, при этом, в избежании засорения истории сообщениями вида «Ой, забыл добавить файл» или «Исправление грамматической ошибки».
Этот и следующий раздел демонстрируют как работать с индексом и изменениями в рабочем каталоге.
Например, вы изменили два файла и хотите добавить их в разные коммиты, но случайно проиндексировали все изменения, которые были в рабочем каталоге. Как исключить из индекса один из файлов?
Чтобы сделать это, нажмите (Отменить промежуточное изменение / Unstage Changes) в строке того файла, который нужно удалить из индекса. Значки появляются при наведении мыши на файл.
Файл пропадет из раздела Промежуточные изменения (Staged Changes) и появится в разделе Изменения (Changes). То есть он изменен, но не проиндексирован.
Что делать, если вы поняли, что не хотите сохранять свои изменения файла bitdepth.sbsl? Как можно просто отменить изменения в нем?—?вернуть к тому состоянию, которое было в последнем коммите, или к начальному после клонирования, или еще как-то полученному?
Чтобы сделать это, нажмите (Отменить изменения / Discard Changes) в строке нужного файла. Значки появляются при наведении мыши на файл.
Важно понимать, что это?опасная команда. Все локальные изменения в файле пропадут, Git просто заменит его версией из последнего коммита. Ни в коем случае не используйте эту команду, если вы не уверены, что изменения в файле вам не нужны.
Если вы хотите сохранить изменения в файле, но прямо сейчас их нужно отменить, то есть способы получше, такие как ветвление и припрятывание?—?вы рассмотрите их в главе Ветвление в Git.
Помните, все что попало в коммит почти всегда Git может восстановить. Можно восстановить даже коммиты из веток, которые были удалены. Но все, что не было включено в коммит и потеряно?—?скорее всего, потеряно навсегда.
Помимо отмены изменений отдельных файлов вы можете отменять изменения всех файлов, добавленных в индекс или всех измененных файлов. Для этого в разделах Промежуточные изменения (Staged Changes) и Изменения (Changes) есть аналогичные команды (Отменить промежуточное изменение / Unstage Changes) и (Отменить изменения / Discard Changes), которые действуют на все файлы, содержащиеся в разделе.
Если вы используете расширение Git Graph, то в нем эти операции выполняются немного иначе. Пока у вас есть измененные файлы, добавлены они в индекс или нет, в списке коммитов Git Graph будет существовать первая строка Uncommitted Changes. В контекстном меню этой строки есть пункт Reset uncommitted changes....
Этот пункт поможет вам отменить изменения и в индексе и в рабочем каталоге. После нажатия Visual Studio Code предложит вам выбрать один из двух возможных вариантов.
Mixed — Keep working tree, but reset index. В этом случае будет отменено добавление в индекс всех файлов, которые в нем есть на данный момент и еще не зафиксированы. То есть, на картинке, файл coldev.sbsl переедет в раздел Изменения (Changes).
Hard — Discard all changes. В этом случае, помимо предыдущих действий, будут отменены все изменения файлов в рабочем каталоге, которые еще не проиндексированы. То есть рабочий каталог вернется к состоянию последнего коммита (HEAD).
Важно понимать, что жесткий сброс изменений (Hard — Discard all changes) —?опасная команда. Любые локальные изменения, внесенные в файлы, исчезнут. Git просто заменит файлы последней зафиксированной версией. Никогда не используйте эту команду, если точно не знаете, нужны ли вам эти несохраненные локальные изменения.
По материалам книги Pro Git (авторы Scott Chacon и Ben Straub, издательство Apress). Книга распространяется по лицензии Creative Commons Attribution Non Commercial Share Alike 3.0 license.