Не перезаписывайте историю, если вы уже отправили ветку в удаленный репозиторий или, рассматривая ситуацию с другой стороны, не отправляйте свою ветку в удаленный репозиторий, пока вы не будете ею довольны!
Одна из основных особенностей Git заключается в том, что основную часть своей работы вы делаете в локальном репозитории. По этой причине вы можете изменять историю своих коммитов так, как вам хочется. Исправлять их, объединять, разделять, удалять, переставлять местами и пр.
Это будет выражаться в том, что вместо прежних коммитов 1C:EDT будет создавать новые коммиты, содержащие те же самые изменения. В результате вы будете иметь у себя те же самые изменения, которые вам нужны, но с более понятной и красивой историей.
Однако как только вы отправляете ветку в удаленный репозиторий, все коммиты, содержащиеся в ней, перестают быть «вашими» и становятся «общими». Другие разработчики могут извлечь из репозитория вашу ветку, слить ее со своей и таким образом использовать ваши изменения, ваши коммиты, в своей работе.
Что произойдет, когда вы перезапишите коммиты в своей ветке и отправите ее в удаленный репозиторий? Окажется, что тех ваших коммитов, которыми уже пользуются другие разработчики, как бы никогда не существовало. В результате все разработчики, которые уже используют вашу ветку, будут вынуждены исправлять у себя эту ситуацию, что может оказаться совсем не просто.
Таким образом, не спешите отправлять на удаленный сервер свою ветку, если вы не до конца ею довольны. Или, если вы уже отправили свою ветку, не перезаписывайте локальную историю, т.к. это может принести существенные проблемы другим разработчикам.
Конечно, есть ситуации, когда перезапись истории коммитов в опубликованной ветке не вредна, а даже полезна. Например, если это чисто экспериментальная ветка или это ветка, предназначенная для проверки написанного (review branches).
Например, вы зафиксировали изменения и после этого поняли, что забыли исправить что-то, относящееся к этой задаче. Или забыли написать что-то важное в сообщении коммита.
Вместо того, чтобы исправить забытое и зафиксировать это новым, вторым коммитом, вы можете выполнить забытые изменения и добавить их к последнему коммиту. В результате новый коммит просто заменит ваш последний коммит.
Вместо последнего коммита будет создан новый коммит (с новым Id), который содержит прежние и новые изменения и новое сообщение коммита.
Например, у вас есть последний коммит, «третий коммит», к которому вы хотите добавить некоторые доработки, о которых вы забыли.
Вы выполняете эти доработки, исправляете последний коммит, меняете сообщение коммита на «третий коммит + забытые доработки» и фиксируете изменения.
Прежний коммит заменяется новым коммитом, с новым Id, новым содержимым и новым сообщением коммита.
Однако теперь, запустив приложение и посмотрев на полученный результат, вы поняли, что поспешили исправлять последний коммит. Лучше вернуть все в исходное состояние, которое было до того, как вы стали добавлять забытые доработки. Но как это сделать, если старый коммит уже исчез?
На самом деле старый коммит не исчез, он все еще находится в базе данных объектов. Просто он больше не виден в истории, т.к. не принадлежит ни одной из веток.
Чтобы увидеть этот коммит вам понадобится панель Журнал ссылок Git. Она входит в стандартный состав перспективы Git, но вы можете открыть ее и в любой другой перспективе.
В этой панели убедитесь, что выбрана ветка HEAD (или текущая ветка), а среди ссылок вы увидите тот коммит, на котором был указатель ветки до его исправления. Он будет предпоследним.
Чтобы отменить исправление последнего коммита нужно выполнить жесткий сброс на этот предпоследний коммит (Сброс — Жестко (HEAD, индекс и рабочий каталог) в контекстном меню). Ваша ветка вернется к исходному состоянию.
Например, вы зафиксировали изменения и после этого поняли, что забыли написать в сообщение коммита что-то важное. Вы можете исправить сообщение коммита путем создания нового коммита.
В том числе вы можете исправить сообщение не только последнего коммита, но и предыдущих.
Вместо этого коммита будет создан новый. Если это не последний коммит, то вместо коммитов, следующих за этим, также будут созданы новые коммиты;
После того, как вы зафиксировали последний коммит, его можно исправить и добавить в него изменения, которые вы забыли.
Аналогичным образом можно исправить и один из предыдущих коммитов, но для этого используется другая команда и в результате выполняется другая операция — интерактивное перебазирование.
Исправить предыдущий коммит можно в панели История:Перед слиянием своей ветки с проектом у вас может возникнуть желание скрыть коммиты, которые имели смысл только для вас и только на этапе разработки. Вы можете объединить второстепенные коммиты с коммитами, имеющими значение, или даже можете собрать все коммиты в один.
Используйте для этого интерактивное перебазирование:
В результате вместо прежних трех коммитов будет создан один новый коммит, содержащий все их изменения.