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