Перебазирование

Что такое перебазирование

Перебазирование применяет выбранную цепочку коммитов поверх указанного коммита.

Обычно это может понадобиться в следующей ситуации. Вы ведете разработку в ветке 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)

Перебазировать текущую ветку на другую ветку можно разными способами.

Конфликты перебазирования

Как и в любом другом случае, когда изменения вносятся в разные ветки, может так случиться, что в каждой из веток будут выполнены изменения, похожие друг на друга. Если в процессе перебазирования, во время выполнения очередного Cherry-Pick, выясняется, что 1C:EDT не может автоматически объединить изменения, операция перебазирования останавливается после применения конфликтующего изменения. Далее вы можете выбрать один из следующих вариантов решения проблемы:

Как отменить перебазирование

Например, у вас есть ветка 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. Указатель этой ветки во время перебазирования не менялся, он указывает на «четвертый коммит».

Чтобы дополнительно убедиться в том, что состояние веток вернулось к исходному, отключите в панели История показ дополнительных ссылок: (Показать меню) - Показать - Дополнительные ссылки.

Что такое интерактивное перебазирование

Интерактивное перебазирование позволяет вам быстро изменить последовательность коммитов. Для каждого из них заранее можно выбрать одно из доступных действий, и затем выполнить их все:

Предупреждение: Интерактивное перебазирование перезаписывает историю коммитов. Поэтому, не выполняйте интерактивное перебазирование, если вы уже опубликовали свою ветку в удаленном репозитории. Ваши коллеги, возможно, уже использовали опубликованные вами изменения в своей работе. Ваше интерактивное перебазирование заставит их также перезаписывать и изменять свою работу. Исключение могут составлять только те ветки, которые предназначены исключительно для экспериментов или для проверки написанного (review branches).

Выполнить интерактивное перебазирование

Выполнить интерактивное перебазирование можно в панели История:

  1. Извлеките ветку, которую вы хотите перебазировать;
  2. Выберите коммит, на который вы хотите перебазировать извлеченную ветку, обычно это родительский коммит;
  3. Нажмите Interactive Rebase в контекстном меню этого коммита. Для того, чтобы вы могли задать операции, применяемые к коммитам, 1C:EDT откроет панель Interactive Rebase;
  4. Выберите для коммитов желаемые действия;
  5. Переставьте коммиты выше или ниже, если это нужно;
  6. Нажмите Старт, чтобы выполнить интерактивное перебазирование.
Ловкий прием: Если результат интерактивного перебазирования вас не устраивает, вы можете вернуть все к исходному состоянию так же, как и в случае с обычным перебазированием. Как это сделать, рассказано в разделе Как отменить перебазирование.

Панель «Interactive Rebase»

Панель Interactive Rebase показывает план перебазирования: последовательность коммитов и действия, которые должны быть выполнены с каждым из них в процессе интерактивного перебазирования.

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

В верхней части панели находятся команды перебазирования (Старт, …, Прервать), команды установки действий (Выбрать, …, Редактировать сообщение) и команды перемещения коммитов (Выше, Ниже).

Далее находится таблица, содержащая коммиты, которые должны быть обработаны во время интерактивного перебазирования.

Заполняя эту таблицу, 1C:EDT устанавливает всем коммитам действие Выбрать. Коммиты с таким действием можно перемещать вверх и вниз с помощью одноименных кнопок командной панели.

Последовательность ваших действий при работе с этой панелью может выглядеть следующим образом:

  1. Перемещаете выбранные коммиты выше или ниже;
  2. Устанавливаете коммитам нужные действия;
  3. Чтобы начать интерактивное перебазирование, нажмите Старт;
  4. Если в процессе перебазирования требуются ваши интерактивные действия, процесс будет останавливаться и ждать ваших действий. Чтобы продолжить процесс, нажмите Продолжить.
Командная панель
  • Команды перебазирования:
    • Старт — начинает интерактивное перебазирование;
    • Продолжить — продолжает интерактивное перебазирование после того, как были выполнены необходимые интерактивные действия;
    • Пропустить — удалить текущий коммит и продолжить перебазирование;
    • Прервать — отменить начатую операцию интерактивного перебазирования и вернуть все в исходное состояние;
  • Команды установки действий:
    • Выбрать — это действие позволяет вам изменить порядок коммитов и переместить данный коммит вперед или назад:
      1. Вместо этого коммита создается новый;
      2. Вместо коммитов, следующих за этим, создаются новые коммиты;
      3. Также новые коммиты создаются для тех коммитов, которые затрагивает изменение порядка;
    • Пропустить — удалить коммит:
      1. Этот коммит исключается из истории;
      2. Вместо коммитов, следующих за этим, создаются новые коммиты;
    • Редактировать — исправить коммит, добавить в него изменения:
      1. Вместо этого коммита создается новый;
      2. Вместо коммитов, следующих за этим, создаются новые коммиты;
    • Squash — изменения, содержащиеся в этом коммите, и его сообщение добавить в предыдущий коммит:
      1. Вместо предыдущего коммита создается новый;
      2. Этот коммит исключается из истории;
      3. Вместо коммитов, следующих за этим, создаются новые коммиты;
    • Вставить без сообщения — в предыдущий коммит добавить только изменения, содержащиеся в этом коммите, сообщение этого коммита отбросить:
      1. Вместо предыдущего коммита создается новый;
      2. Этот коммит исключается из истории;
      3. Вместо коммитов, следующих за этим, создаются новые коммиты;
    • Редактировать сообщение — изменить сообщение этого коммита:
      1. Вместо этого коммита создается новый;
      2. Вместо коммитов, следующих за этим, создаются новые коммиты;
  • Команды перемещения:
    • Выше — перемещает выделенный коммит на строку выше;
    • Ниже — перемещает выделенный коммит на строку ниже.
Контекстное меню
  • Выбрать — это действие позволяет вам изменить порядок коммитов и переместить данный коммит вперед или назад:
    1. Вместо этого коммита создается новый;
    2. Вместо коммитов, следующих за этим, создаются новые коммиты;
    3. Также новые коммиты создаются для тех коммитов, которые затрагивает изменение порядка;
  • Пропустить — удалить коммит:
    1. Этот коммит исключается из истории;
    2. Вместо коммитов, следующих за этим, создаются новые коммиты;
  • Редактировать — исправить коммит, добавить в него изменения:
    1. Вместо этого коммита создается новый;
    2. Вместо коммитов, следующих за этим, создаются новые коммиты;
  • Squash — изменения, содержащиеся в этом коммите, и его сообщение добавить в предыдущий коммит:
    1. Вместо предыдущего коммита создается новый;
    2. Этот коммит исключается из истории;
    3. Вместо коммитов, следующих за этим, создаются новые коммиты;
  • Вставить без сообщения — в предыдущий коммит добавить только изменения, содержащиеся в этом коммите, сообщение этого коммита отбросить:
    1. Вместо предыдущего коммита создается новый;
    2. Этот коммит исключается из истории;
    3. Вместо коммитов, следующих за этим, создаются новые коммиты;
  • Редактировать сообщение — изменить сообщение этого коммита:
    1. Вместо этого коммита создается новый;
    2. Вместо коммитов, следующих за этим, создаются новые коммиты;
  • Открыть коммитоткрывает коммит в панели просмотра;