В чем разница между fork и pull в Git?

«В чем разница между fork и pull в Git?» — вопрос из категории Git, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это принципиально разные концепции, работающие на разных уровнях.

Fork (ответвление) — это действие на уровне платформы хостинга репозиториев (GitHub, GitLab, Bitbucket). Оно создает полную, независимую копию чужого репозитория под вашей учетной записью. Это социальная функция для open-source разработки: вы можете свободно экспериментировать в своем форке, а затем предложить изменения обратно в исходный (upstream) репозиторий через Pull/Merge Request.

Pull (стягивание) — это локальная команда Git (git pull). Она объединяет изменения из удаленного репозитория (remote) в вашу текущую локальную ветку. По сути, это сокращение для двух команд: git fetch (загрузка изменений с удаленного репозитория) и git merge (слияние этих изменений в вашу ветку).

Сравнительная таблица:

Аспект Fork Pull (git pull)
Уровень Операция платформы (GitHub UI/API). Команда локального Git-клиента.
Что создает? Новый, отдельный репозиторий на сервере под вашим аккаунтом. Ничего не создает, обновляет существующую локальную ветку.
Цель Ветвление проекта для независимой разработки и последующего слияния через PR. Синхронизация локальной копии ветки с ее удаленной версией.
Аналогия Сделать свою собственную копию книги, чтобы писать заметки на полях, не трогая оригинал. Скачать последние исправления от издателя в свою копию книги.

Типичный рабочий процесс с использованием обоих:

  1. Fork: На GitHub нажимаю кнопку "Fork" на репозитории upstream/project. На моем аккаунте создается myusername/project.
  2. Клонирование своего форка: Работаю с своей копией.
    git clone https://github.com/myusername/project.git
    cd project
  3. Добавление upstream remote: Чтобы отслеживать изменения в оригинальном репозитории.
    git remote add upstream https://github.com/upstream/project.git
  4. Pull из upstream: Периодически синхронизирую свою локальную main с оригиналом.
    git checkout main
    git pull upstream main  # Стягиваю изменения из upstream репозитория
  5. Push в свой fork: Отправляю свои изменения в свой репозиторий на GitHub.
    git push origin my-feature-branch
  6. Создание Pull Request: Через интерфейс GitHub создаю PR из myusername/project:my-feature-branch в upstream/project:main.

Таким образом, fork — это стратегия управления доступом и сотрудничества, а pull — это ежедневная техническая операция по синхронизации кода.