Обновление форка
================

В процессе прохождения курса в основной репозиторий будут добавляться
изменения (новые лабораторные работы, изменения в тестах, исправления
ошибок и т.д.) — эти изменения **не будут автоматически появляться** в
сделанных форках.

Чтобы добавить изменения в Ваш форк из основного репозитория, выполните
следующие шаги:

1. Откройте сайт репозитория, который Вам прислал преподаватель.

2. Нажмите кнопку ``Code``, выберите ``HTTPS`` и нажмите кнопку
   копирования:

   .. image:: _static/fork_update/copy_original_repo_url.png

3. Откройте терминал в среде разработки PyCharm:

   .. image:: _static/fork_update/pycharm_open_terminal.png

4. В терминале выполните команду
   ``git remote add upstream <ссылка-на-основной-репозиторий>``:

   .. image:: _static/fork_update/add_upstream.png

5. В терминале выполните команду ``git fetch upstream``:

   .. image:: _static/fork_update/fetch_upstream.png

.. important:: Обратите внимание, что ссылка на скриншоте выше указывает
               на родительский репозиторий.

6. В терминале выполните команду ``git merge upstream/main --no-edit``:

   .. image:: _static/fork_update/merge_upstream.png

.. note:: В зависимости от количества изменений вывод команды может
          отличаться от того, что на скриншоте выше.

В результате выполнения этих команд в Вашем *локальном* форке появятся
последние изменения из основного репозитория.

Больше информации о командах, описанных выше, можно найти в `официальной
документации по Git <https://git-scm.com/docs>`__.

Обновление форка с помощью комментария в Pull Request
-----------------------------------------------------

Форк может находится в нескольких состояниях по отношению к upstream
репозиторию:

1. Форк и upstream выровнены по состояниям.
2. В upstream появились новые изменения, которых ещё нет в форке:

    1. Например, при добавлении исправлений для уже существующих файлов.

3. В upstream появились новые изменения, которых ещё нет в форке + были изменения в
   форке, которые конфликтуют с изменениями из upstream:

    1. Например, когда в upstream была добавлена одна из лабораторных работ как образцовая.

Для **случаев 2** и **3** предусмотрены механизмы автоматического обновления
через комментарий в Pull Request.

Для **случая 2**:

1. Обновление происходит с помощью комментария, содержащего подстроку ``/update:get_new``

    1. В форке появятся изменения из upstream репозитория.

**Случай 3** подразделяется на два сценария исходя из необходимости
сохранения лабораторной работы студента в форке:

1. Если необходимо оставить версию лабораторной работы из форка,
   то обновление происходит с помощью комментария,
   содержащего подстроку ``/update:keep_fork``:

    1. В форке появятся изменения из upstream, не касающиеся ``main.py``
       и ``start.py`` файлов для лабораторных работ:

        1. Файлы ``main.py`` и ``start.py`` сохранятся так, как они есть в форке.
        2. Все остальные конфликты будут разрешены в пользу upstream изменений.

2. Если необходимо залить в форк версию лабораторной работы из upstream,
   то обновление происходит с помощью комментария, содержащего
   подстроку ``/update:keep_upstream``

    1. Форк будет выровнен по состоянию с upstream.
    2. Все конфликты будут разрешены в пользу upstream изменений.