Что такое перебазирование
Перебазирование применяет выбранную цепочку коммитов поверх указанного коммита.
Обычно это может понадобиться в следующей ситуации. Вы ведете разработку в ветке
feature («задача 1», «задача 2», «задача 3»), которая
была создана из ветки master. Пока вы ведете разработку, в
ветке master появляются изменения, например, от других
разработчиков («третий коммит», «четвертый коммит»). Эти изменения нужно включить в
ветку feature, т.к. они нужны в вашей разработке тоже.
Для этого можно перебазировать ветку feature на ветку
master. Технически это означает, что коммиты, которые
есть в ветке feature после ответвления от
master («задача 1», «задача 2», «задача 3») будут
перенесены один за другим с помощью операции Cherry-Pick в ветку
master .
Обратите внимание, что коммиты «задача 1», «задача 2», «задача 3» не теряются и не
изменяются, вместо них будет создана новая цепочка коммитов «задача 1_», «задача
2_», «задача 3_» с теми же изменениями и сообщениями о коммитах, что и исходные
коммиты (но с другими идентификаторами коммитов). Старые коммиты «задача 1», «задача
2», «задача 3» все еще находятся в базе данных объектов, но больше не видны,
поскольку они больше не доступны ни из одной ветки. Новые коммиты «задача 1_»,
«задача 2_», «задача 3_» отличаются от старых, поскольку теперь они также содержат
изменения «третий коммит» и «четвертый коммит».
Перебазировать текущую ветку на другую ветку (rebase)
Перебазировать текущую ветку на
другую ветку можно разными способами.
- В панели История:
- Извлеките
ветку, которую вы хотите перебазировать;
- Выберите коммит, на который вы хотите перебазировать извлеченную
ветку;
- Нажмите Перебазировать HEAD на в контекстном меню этого коммита.
- В панели Навигатор:
- Нажмите Групповая разработка —
Перебазировать... в контекстном меню проекта;
- Выберите ветку, на которую надо перебазировать текущую, и нажмите
Перебазировать.
- В панели Репозитории Git
выберите ветку, на которую надо перебазировать текущую, и нажмите Перебазировать.
Конфликты перебазирования
Как и в любом другом случае, когда изменения вносятся в разные ветки, может так
случиться, что в каждой из веток будут выполнены изменения, похожие друг на друга.
Если в процессе перебазирования, во время выполнения очередного Cherry-Pick,
выясняется, что 1C:EDT не может автоматически объединить изменения, операция
перебазирования останавливается после применения конфликтующего изменения. Далее вы
можете выбрать один из следующих вариантов решения проблемы:
- Start Merge Tool to resolve conflicts — запустить панель
сравнения файлов для того, чтобы разрешить возникшие конфликты вручную. После
того, как вы разрешите конфликт, нажмите в панели Индексирование Git
Продолжить или Прервать;
- Skip this commit and continue rebasing the next commits —
пропустить текущий коммит и продолжить перебазирование со следующего
коммита;
- Abort rebase — полностью прервать перебазирование;
- Do nothing (return to the workbench) — не предпринимать
никаких действий, все, что нужно сделать, вы сделаете самостоятельно: некоторым
образом разрешите конфликт (например, с помощью внешней программы), а затем в панели Индексирование Git нажмете
Продолжить или Прервать.
Как отменить перебазирование
Например, у вас есть ветка feature, которую вы хотите
перебазировать поверх ветки master.
Вы начали перебазирование и оказалось, что коммит «задача 2» содержит конфликтные изменения.
Вы решили пропустить этот коммит чтобы потом, после перебазирования, заново выполнить
те же изменения, которые были в этом коммите.
Вы выбрали вариант Skip this commit and continue rebasing the next
commits, нажали Продолжить, и перебазирование
успешно завершилось.
Однако теперь, когда вы попытались воспроизвести изменения, которые были в коммите
«задача 2» оказалось, что сделать это крайне сложно. Гораздо лучше было бы внести
изменения в исходную ветку feature, чтобы она не
конфликтовала с веткой master, и после этого выполнить
перебазирование.
Для этого нужно вернуть все в исходное состояние, которое было до перебазирования. Но
как это сделать, если изменения уже перенесены в ветку
master, а старые коммиты ветки feature
пропали?
На самом деле, как говорилось в разделе Что такое перебазирование, старые коммиты ветки feature все еще находятся в базе
данных объектов, но больше не видны, поскольку они больше не доступны ни из одной
ветки. Вы можете увидеть эти коммиты и использовать их для отмены
перебазирования.
Чтобы увидеть старые коммиты ветки feature, в панели История нажмите (Показать меню) — Показать —
Дополнительные ссылки в
командной панели. После этого в истории появится ссылка ORIG_HEAD, которая указывает на тот коммит, на котором находился
HEAD перед выполнением опасной операции.
Чтобы отменить перебазирование нужно выполнить жесткий сброс на этот
коммит (Сброс —
Жестко (HEAD, индекс и рабочий
каталог) в контекстном меню). Ветка feature, извлеченная в рабочий
каталог, станет такой же, как до перебазирования.
Несмотря на то, что коммиты «задача 3» и «задача 1», созданные во время
перебазирования, остались в базе данных объектов, они не принадлежат ветке
master. Указатель этой ветки во время перебазирования не
менялся, он указывает на «четвертый коммит».
Чтобы дополнительно убедиться в том, что состояние веток вернулось к исходному, отключите в
панели История показ
дополнительных ссылок: (Показать меню) - Показать -
Дополнительные ссылки.
Что такое интерактивное перебазирование
Интерактивное перебазирование позволяет вам быстро изменить последовательность
коммитов. Для каждого из них заранее можно выбрать одно из доступных действий, и
затем выполнить их все:
- Выбрать — это действие позволяет вам изменить порядок
коммитов и переместить данный коммит вперед или назад:
- Вместо этого коммита создается новый;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Также новые коммиты создаются для тех коммитов, которые затрагивает
изменение порядка;
- Пропустить — удалить коммит:
- Этот коммит исключается из истории;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Редактировать — исправить коммит, добавить в
него изменения:
- Вместо этого коммита создается новый;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Squash — изменения, содержащиеся в этом коммите, и его
сообщение добавить в предыдущий коммит:
- Вместо предыдущего коммита создается новый;
- Этот коммит исключается из истории;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Вставить без сообщения — в предыдущий
коммит добавить только изменения, содержащиеся в этом коммите, сообщение этого
коммита отбросить:
- Вместо предыдущего коммита создается новый;
- Этот коммит исключается из истории;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Редактировать сообщение — изменить
сообщение этого коммита:
- Вместо этого коммита создается новый;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
Предупреждение: Интерактивное перебазирование перезаписывает
историю коммитов. Поэтому, не выполняйте интерактивное перебазирование, если вы уже
опубликовали свою ветку в удаленном репозитории. Ваши коллеги, возможно, уже
использовали опубликованные вами изменения в своей работе. Ваше интерактивное
перебазирование заставит их также перезаписывать и изменять свою работу. Исключение
могут составлять только те ветки, которые предназначены исключительно для
экспериментов или для проверки написанного (review branches).
Выполнить интерактивное перебазирование
Выполнить интерактивное
перебазирование можно в панели История:
- Извлеките ветку,
которую вы хотите перебазировать;
- Выберите коммит, на который вы хотите перебазировать извлеченную ветку, обычно
это родительский коммит;
- Нажмите Interactive Rebase в контекстном меню этого коммита. Для того, чтобы вы могли задать операции,
применяемые к коммитам, 1C:EDT откроет панель Interactive
Rebase;
- Выберите для коммитов желаемые действия;
- Переставьте коммиты выше или ниже, если это нужно;
- Нажмите Старт, чтобы выполнить интерактивное
перебазирование.
Ловкий прием: Если результат интерактивного
перебазирования вас не устраивает, вы можете вернуть все к исходному состоянию так
же, как и в случае с обычным перебазированием. Как это сделать, рассказано в разделе
Как отменить перебазирование.
Панель «Interactive Rebase»
Панель Interactive Rebase показывает план перебазирования:
последовательность коммитов и действия, которые должны быть выполнены с каждым из
них в процессе интерактивного перебазирования.
Эту панель 1C:EDT открывает и заполняет данными автоматически, в результате
выполнения команды
интерактивного перебазирования.
В верхней части панели находятся команды перебазирования (Старт, …,
Прервать), команды установки действий
(Выбрать, …, Редактировать
сообщение) и команды перемещения коммитов
(Выше, Ниже).
Далее находится таблица, содержащая коммиты, которые должны быть обработаны во время
интерактивного перебазирования.
Заполняя эту таблицу, 1C:EDT устанавливает всем коммитам действие
Выбрать. Коммиты с таким действием можно перемещать вверх
и вниз с помощью одноименных кнопок командной панели.
Последовательность ваших действий при работе с этой панелью может выглядеть следующим
образом:
- Перемещаете выбранные коммиты выше или ниже;
- Устанавливаете коммитам нужные действия;
- Чтобы начать интерактивное перебазирование, нажмите
Старт;
- Если в процессе перебазирования требуются ваши интерактивные действия, процесс будет
останавливаться и ждать ваших действий. Чтобы продолжить процесс, нажмите
Продолжить.
-
- Командная панель
-
- Команды перебазирования:
- Старт — начинает
интерактивное перебазирование;
- Продолжить — продолжает интерактивное перебазирование после
того, как были выполнены необходимые интерактивные
действия;
- Пропустить — удалить
текущий коммит и продолжить перебазирование;
- Прервать — отменить
начатую операцию интерактивного перебазирования и
вернуть все в исходное состояние;
- Команды установки действий:
- Выбрать — это действие позволяет вам изменить порядок
коммитов и переместить данный коммит вперед или назад:
- Вместо этого коммита создается новый;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Также новые коммиты создаются для тех коммитов, которые затрагивает
изменение порядка;
- Пропустить — удалить коммит:
- Этот коммит исключается из истории;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Редактировать — исправить коммит, добавить в
него изменения:
- Вместо этого коммита создается новый;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Squash — изменения, содержащиеся в этом коммите, и его
сообщение добавить в предыдущий коммит:
- Вместо предыдущего коммита создается новый;
- Этот коммит исключается из истории;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Вставить без сообщения — в предыдущий
коммит добавить только изменения, содержащиеся в этом коммите, сообщение этого
коммита отбросить:
- Вместо предыдущего коммита создается новый;
- Этот коммит исключается из истории;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Редактировать сообщение — изменить
сообщение этого коммита:
- Вместо этого коммита создается новый;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Команды перемещения:
- Выше — перемещает выделенный коммит на строку выше;
- Ниже — перемещает выделенный коммит на строку ниже.
- Контекстное меню
-
- Выбрать — это действие позволяет вам изменить порядок
коммитов и переместить данный коммит вперед или назад:
- Вместо этого коммита создается новый;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Также новые коммиты создаются для тех коммитов, которые затрагивает
изменение порядка;
- Пропустить — удалить коммит:
- Этот коммит исключается из истории;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Редактировать — исправить коммит, добавить в
него изменения:
- Вместо этого коммита создается новый;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Squash — изменения, содержащиеся в этом коммите, и его
сообщение добавить в предыдущий коммит:
- Вместо предыдущего коммита создается новый;
- Этот коммит исключается из истории;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Вставить без сообщения — в предыдущий
коммит добавить только изменения, содержащиеся в этом коммите, сообщение этого
коммита отбросить:
- Вместо предыдущего коммита создается новый;
- Этот коммит исключается из истории;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Редактировать сообщение — изменить
сообщение этого коммита:
- Вместо этого коммита создается новый;
- Вместо коммитов, следующих за этим, создаются новые коммиты;
- Открыть коммит — открывает коммит в
панели просмотра;