Исправить ошибку в основной ветке удаленного репозитория

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

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

Для создания примера использованы 1C:EDT 2024.1.1 и «1С:Предприятие» 8.3.25.1394.

Выполните подготовительные действия

  1. Зарегистрируйтесь на сайте GitHub;
  2. Получите токен доступа;
  3. Создайте копию (fork) репозитория https://github.com/1C-Company/dt-demo-configuration;
  4. Запустите 1C:EDT Start;
  5. Создайте два новых проекта: ПроектАндрей и ПроектВасилий;
Для каждого из этих проектов:
  1. Запустите проект;
  2. Нажмите Начать работу;
  3. Импортируйте проект из своей копии (fork) (возможна ошибка). При импорте используйте токен вместо пароля, иначе вы не сможете отправлять свои изменения в репозиторий на GitHub;
Настройте параметры Git, чтобы видеть, кто из разработчиков внес изменения
  1. Нажмите Окно > Параметры... в главном меню;
  2. Перейдите на страницу Групповая разработка > Git > Конфигурация;
  3. Откройте вкладку Настройки репозитория;
  4. Добавьте две записи (Добавить запись):
    1. В проекте ПроектАндрей:
      user.name — Андрей
      user.email — Андрей@server.example.com
    2. В проекте ПроектВасилий:
      user.name — Василий
      user.email — Василий@server.example.com
  5. Нажмите Применить и закрыть;
Настройте рабочее пространство
  1. Откройте панель История. Для этого в панели Навигатор нажмите Групповая разработка > Показать Историю в контекстном меню проекта. Панель История всплывет в правом верхнем углу;
  2. Нажмите на значок Восстановить — панель История зафиксируется в нижней части экрана;
  3. В командной панели отожмите кнопку (Связать с редактором), чтобы панель показывала все коммиты, независимо от того, что выделено в панели Навигатор;
  4. Нажмите (Change the File Scope for the History) и выберите вариант фильтрации Все изменения в репозитории, чтобы панель показывала все коммиты;

Выполните пример

  1. Осмотритесь вокруг. Два разработчика, Андрей и Василий, разрабатывают прикладное решение. Оба они подключены к удаленному репозиторию, роль которого выполняет ваша копия (fork) на сайте GitHub. В ходе примера Андрей и Василий исправят по небольшой ошибке прямо в основной ветке разработки master. Поскольку они будут делать это на конкурентной основе, вы увидите, каким образом объединяются между собой изменения разных разработчиков.
  2. Василий более опытный, он первым исправляет ошибку. Ошибка заключалась в том, что в проекте не хватало констант:
    1. Перейдите в ПроектВасилий;
    2. Добавьте константу в проект DemoConfDT;
    3. Зафиксируйте изменения:
      1. В панели Индексирование Git напишите сообщение коммита: 2 коммит;
      2. Нажмите Фиксировать и отправить... чтобы зафиксировать изменения и сразу отправить их в удаленный репозиторий;
  3. 1C:EDT покажет вам результат отправки изменений. Из локальной ветки master в удаленную ветку master был успешно передан один коммит;
  4. В панели История вы видите, что в текущей локальной ветке master появился новый коммит Василия, который стал головой ветки, и этот же коммит есть на сервере и на него указывает удаленная ветка master (origin/master). Таким образом история локального репозитория совпадает с историей удаленного репозитория;
  5. Теперь в дело включается Андрей. Он тоже исправляет ошибку. Ошибка заключалась в том, что в проекте не хватало справочников:
    1. Перейдите в ПроектАндрей;
    2. Добавьте справочник в проект DemoConfDT;
    3. Зафиксируйте изменения. Напишите сообщение коммита: 3 коммит, нажмите Фиксировать и отправить...;
  6. 1C:EDT покажет вам результат отправки изменений. На этот раз результат будет отрицательный. Отправка изменений из локальной ветки master в удаленную ветку master отклонена;
  7. В панели История вы видите, что в текущей локальной ветке master появился новый коммит Андрея, который стал головой ветки. Однако этот коммит не был передан на сервер и удаленная ветка master осталась на том же коммите, на котором и была. Об этом говорит указатель origin/master. Таким образом история локального репозитория разошлась с историей удаленного репозитория. У вас есть один неотправленный коммит;
  8. Возникшая ситуация требует пояснения:

    Василий получил изменения с сервера (коммит 1), создал свои изменения (коммит 2) и успешно отправил их на сервер, потому что состояние серверной ветки за это время не изменилось.

    Андрей также получил изменения с сервера (коммит 1), создал свои изменения (коммит 3). Однако за это время в серверной ветке появились изменения Василия (коммит 2). Чтобы изменения Андрея (коммит3) появились на сервере, их нужно каким-то образом объединить с изменениями Василия (коммит 2). Git не выполняет такие операции на сервере, поэтому и отклоняет изменения Андрея. Даже несмотря на то, что Андрей и Василий изменяли разные части проекта.

    Объединение изменений (слияние веток) в Git вы должны выполнить в своем локальном репозитории. Поэтому Андрей сначала должен получить с сервера изменения Василия (коммит 2), объединить их со своими изменениями (коммит 3) и только после этого он сможет отправить свой результат на сервер. На схеме это будет выглядеть следующим образом:

  9. Получите изменения с сервера и слейте их со своей локальной веткой. Для этого в панели Навигатор нажмите Групповая разработка > Получить и слить в контекстном меню проекта;
  10. 1C:EDT покажет вам результат получения и слияния изменений. С сервера, из удаленной ветки origin/master, был получен 2 коммит Василия и он был успешно объединен с 3 коммитом Андрея. В результате был создан коммит слияния.
  11. В панели История вы видите, что 1C:EDT получила с сервера коммит Василия (2 коммит) и в ветке удаленного отслеживания отметила (origin/master) что именно на нем находится ветка master в удаленном репозитории. Затем 1C:EDT влила этот коммит в локальную ветку и создала новый коммит — коммит слияния, который стал головой локальной ветки master;
  12. Теперь локальную ветку master можно отправить на сервер. В панели Навигатор нажмите Групповая разработка > Push to origin в контекстном меню проекта;
  13. 1C:EDT покажет вам результат отправки изменений. Из локальной ветки master в удаленную ветку master были успешно переданы два коммита: 3 коммит Андрея и коммит слияния, который был создан в результате объединения с изменениями Василия;
  14. В панели История вы видите, что удаленная ветка master указывает на тот же коммит, что и локальная ветка. Значит все коммиты были переданы на сервер и сейчас история локального репозитория совпадает с историей удаленного репозитория;
  15. Еще раз взгляните на общую схему работы:

    Василий внес изменения в ветку master и отправил их на сервер. Андрей тоже изменил ветку master, но т.к. на сервере уже появились изменения Василия, Андрею нужно сначала получить их с сервера, объединить со своими изменениями (Групповая разработка > Получить и слить), а затем уже отправлять на сервер.