Операции отмены

В любой момент вам может потребоваться что-либо отменить. Здесь вы рассмотрите несколько основных способов отмены сделанных изменений.

Будьте осторожны, не все операции отмены в свою очередь можно отменить! Это одна из редких областей Git, где неверными действиями можно необратимо удалить результаты своей работы.

Дополнить последний коммит

Отмена может потребоваться, если вы зафиксировали изменения слишком рано, например, забыв добавить какие-то файлы или комментарий к коммиту.

Например, вы добавили новый отчет Прибыль, зафиксировали изменения, и после этого вспомнили, что не задали для отчета расширенное представление.

Как быть? Создавать еще один коммит «Забыл добавить представление»?

Нет, не нужно. Есть более красивый способ. Вы можете дополнить последний коммит: добавить в него еще какие-то изменения или просто дописать к сообщению коммита забытую информацию.

Чтобы сделать это выполните забытые изменения (в данном случае задайте расширенное представление для отчета), а затем:
  1. В панели Навигатор нажмите Групповая разработка > Коммит... в контекстном меню проекта;
  2. В панели Индексирование Git нажмите (Дополнить (редактировать сообщение предыдущего коммита)) в командной панели поля Сообщение коммита.

1C:EDT добавит ваши новые изменения в индекс, а в поле Сообщение коммита подставит сообщение предыдущего коммита для того, чтобы вы могли его отредактировать или дополнить.

После этого просто нажмите Фиксировать и изменения будут помещены в репозиторий.

Обратите внимание, что Git создает новый коммит вместо того, который был до этого (сравните идентификаторы коммитов). Это происходит даже в том случае, когда вы не добавляете никаких новых изменений, а только меняете сообщение прежнего коммита.

В результате все выглядит так, будто первоначальный коммит никогда не существовал, а так же он больше не появится в истории вашего репозитория.

Пока вы работаете со своей локальной веткой и не делились своим первоначальным коммитом с другими разработчиками, в таких действиях нет ничего страшного.

Но если свой последний коммит, который вы хотите дополнить, вы уже отправили в удаленный репозиторий (см. Работа с удаленными репозиториями), то такая операция становится крайне нежелательной. Если другие разработчики уже забрали себе ваши изменения, то потом окажется, что они забрали «то, чего нет». Ведь первоначальный коммит исчезнет не только в вашей локальной истории, но и на удаленном сервере тоже.

Отменить изменения проекта

Что делать, если вы поняли, что не хотите сохранять свои изменения проекта: добавление отчета Прибыль и изменение документа ПриходТовара, которые вы уже проиндексировали? Как вернуть проект к тому виду, который был в последнем коммите?

Сейчас вы специально рассматриваете простой пример, но в реальности ваши изменения могут быть гораздо сложнее и объемнее.

Чтобы вернуться к тому состоянию, которое было в последнем коммите, в панели Навигатор нажмите Заменить на > HEAD-ревизия в контекстном меню проекта.

1C:EDT поинтересуется, действительно ли вы хотите отменить все незафиксированные изменения — нажмите Отклонить изменения. Изменения будут отменены.

Обратите внимание, что, как и обещала 1C:EDT в своем сообщении, файлы, которые не находятся еще под версионным контролем (новый отчет Прибыль), она не трогала и оставила в индексе. С такими файлами вам нужно будет разобраться вручную. Вы рассмотрите это на примере одного файла, но перечисленные действия нужно применить ко всем новым файлам.

Сначала, их нужно удалить из индекса. Для этого нажмите (Убрать все файлы из индекса) в командной панели поля Индексированные изменения. Файлы переместятся в Неиндексированные изменения.

Здесь все эти файлы нужно выделить (Ctrl+A) и нажать Удалить в их контекстном меню. После этого ваш рабочий каталог примет то состояние, которое было во время последнего коммита.

Предупреждение: Важно понимать, что Заменить на — опасная команда. Любые изменения измененных файлов пропадают — вы просто копируете поверх них другие файлы. Используйте эту команду только в том случае, если вы убеждены, что измененные объекты вам не нужны.

Если вы хотите сохранить изменения объекта, но пока отложить их в сторону, воспользуйтесь тем, как прятать изменения и создавать ветки в разделе Ветвление в Git. Эти способы обычно лучше.

Помните, все, что зафиксировано коммитом в Git, почти всегда можно восстановить. Можно восстановить даже коммиты, сделанные в удаленных ветках, или измененные коммиты. Но те изменения, которые вы не зафиксируете, скорее всего будут потеряны, и вы их больше не увидите.

Отменить несколько последних коммитов

Например, вы изменили отчет и зафиксировали изменения в репозитории. Но через некоторое время вы поняли, что эти изменения были не нужны, от них нужно отказаться совсем и вернуть ваш репозиторий к тому состоянию, которое он имел на один или несколько коммитов назад.

Чтобы сделать это, в панели История выделите коммит, который должен стать последним в вашем репозитории, и нажмите Сброс > Жестко (HEAD, индекс и рабочий каталог) в его контекстном меню.

Следующие за ним коммиты будут удалены из истории, а содержимое рабочего каталога вернется в то состояние, которое было на момент выбранного вами коммита.

Как и в случае с дополнением последнего коммита, не выполняйте эту операцию в том случае, если вы уже отправили «лишние» коммиты в удаленный репозиторий (см. Работа с удаленными репозиториями). Если другие разработчики уже забрали себе ваши изменения, то потом окажется, что они забрали «то, чего нет». Ведь «лишние» коммиты исчезнут не только в вашей локальной истории, но и на удаленном сервере тоже.

По материалам книги Pro Git (авторы Scott Chacon и Ben Straub, издательство Apress). Книга распространяется по лицензии Creative Commons Attribution Non Commercial Share Alike 3.0 license.