Тур по Git
Работа с удалёнными репозиториями / Урок 4.9

Модель Fork и Pull Request

Рабочий процесс с форками — это стандартная модель совместной работы для проектов с открытым исходным кодом. Вместо того чтобы отправлять изменения напрямую в оригинальный репозиторий, вы создаёте собственную копию (форк), вносите изменения там, а затем предлагаете эти изменения обратно через pull request.

Зачем делать форк?

В большинстве open source проектов у вас нет права на push в основной репозиторий. Форк решает эту проблему:

  • Вы получаете собственную копию репозитория, которой полностью управляете
  • Вы можете свободно экспериментировать, не затрагивая оригинальный проект
  • Вы предлагаете изменения через pull request, которые мейнтейнеры могут рассмотреть

Рабочий процесс с форками

1. Форк           2. Клон            3. Ветка
   (GitHub)          (ваш компьютер)    (ваш компьютер)

┌──────────┐    ┌──────────┐      ┌──────────┐
│ Оригинал │    │ Ваш      │      │ feature  │
│ Репо     │──→ │ Форк     │──→   │ ветка    │
│ (upstream)│    │ (origin) │      │          │
└──────────┘    └──────────┘      └──────────┘

4. Коммит         5. Push            6. Pull Request
   (ваш компьютер)   (в ваш форк)      (GitHub)

┌──────────┐    ┌──────────┐      ┌──────────┐
│ Локальные│    │ Ваш      │      │ Оригинал │
│ Коммиты  │──→ │ Форк     │──→   │ Репо     │
│          │    │ (origin) │  PR  │ (upstream)│
└──────────┘    └──────────┘      └──────────┘

Пошагово

1. Сделайте форк репозитория

На GitHub (или GitLab и т.д.) нажмите кнопку Fork. Это создаст копию репозитория под вашим аккаунтом.

2. Клонируйте ваш форк

git clone https://github.com/YOUR-USERNAME/project.git
cd project

Это настроит origin, указывающий на ваш форк.

3. Добавьте upstream-репозиторий

Подключитесь к оригинальному репозиторию, чтобы оставаться в курсе обновлений:

git remote add upstream https://github.com/ORIGINAL-OWNER/project.git

Теперь у вас два удалённых репозитория:

git remote -v
origin    https://github.com/YOUR-USERNAME/project.git (fetch)
origin    https://github.com/YOUR-USERNAME/project.git (push)
upstream  https://github.com/ORIGINAL-OWNER/project.git (fetch)
upstream  https://github.com/ORIGINAL-OWNER/project.git (push)

4. Создайте feature-ветку

Всегда работайте в ветке, никогда не напрямую в main:

git checkout -b fix-typo-in-readme

5. Внесите изменения и закоммитьте

# редактируйте файлы...
git add .
git commit -m "Fix typo in README introduction"

6. Отправьте в ваш форк

git push -u origin fix-typo-in-readme

7. Откройте Pull Request

На GitHub перейдите в ваш форк и нажмите "Compare & pull request". Напишите понятное описание ваших изменений и отправьте.

Синхронизация с оригиналом

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

git fetch upstream
git checkout main
git merge upstream/main
git push origin main

Это получает изменения из оригинального репозитория в ваш локальный main, а затем отправляет их в ваш форк.

Ключевые концепции

  • origin — Ваш форк (у вас есть право на push)
  • upstream — Оригинальный репозиторий (обычно вы только загружаете отсюда)
  • Feature-ветки — Всегда создавайте ветку от main для каждого изменения
  • Pull request — Механизм для предложения изменений обратно в upstream
  • Синхронизация — Регулярно загружайте из upstream, чтобы ваш форк оставался актуальным

Когда использовать рабочий процесс с форками

  • Участие в проектах с открытым исходным кодом
  • Когда у вас нет права на запись в оригинальный репозиторий
  • Когда требуется строгий code review перед слиянием
  • В больших командах, где прямой push-доступ должен быть ограничен