Другое

Как импортировать необъединённые pull‑requests из GitHub

Узнайте, как импортировать необъединённые pull‑requests из неактивных репозиториев GitHub в ваш форк с помощью Git‑команд и GitHub‑workflow, сохраняя вклад.

Как импортировать незавершённые pull‑requests из неактивного репозитория GitHub в форк

Я нашёл перспективный репозиторий на GitHub, который не обновлялся несколько лет, но в нём есть ценные pull‑requests от других участников, которые оригинальные владельцы игнорировали. Я создал форк этого репозитория, но мне нужно включить коммиты из незавершённых pull‑requests в свой форк, не копируя и не редактируя код вручную. Какой правильный Git‑workflow или метод GitHub позволит перенести эти незавершённые pull‑requests в мой форк?

Когда вы работаете с неактивным репозиторием GitHub, в котором есть ценные незавершённые pull‑requests, их можно импортировать в свой форк, используя несколько Git‑команд, которые напрямую извлекают ветки PR из оригинального репозитория или из форков, которые их создали. Самый простой способ — использовать git fetch с ссылкой на PR, а затем создать локальную ветку из полученного контента для последующего слияния в ваш форк.

Содержание

Понимание задачи

При работе с неактивным репозиторием, содержащим ценные незавершённые pull‑requests, вы сталкиваетесь с несколькими техническими трудностями. Во-первых, оригинальный репозиторий может больше не иметь активных maintainers, которые бы рассмотрели и слили эти изменения. Во-вторых, pull‑requests обычно существуют как ветки в форках участников, а не в самом оригинальном репозитории.

Как отмечено в обсуждениях на Stack Overflow, Git не поддерживает «pull‑requests» как нативный концепт – это особенности GitHub. Однако вы можете получить доступ к базовым веткам и коммитам, которые составляют PR.

Ключевой вывод: каждый pull‑request GitHub соответствует ветке в оригинальном репозитории или в форке, и вы можете напрямую fetch‑ить эти ветки с помощью Git‑команд.

Метод 1: Прямой fetch pull‑requests

Самый прямой способ – fetch‑ить ветку PR напрямую из оригинального репозитория. Это работает, если PR был создан из ветки самого оригинального репозитория.

bash
# Добавьте оригинальный репозиторий как remote (если ещё не добавили)
git remote add upstream https://github.com/OWNER/REPOSITORY.git

# Получите конкретный pull‑request по номеру
git fetch upstream pull/<pull_number>/head:pr-<pull_number>

# Переключитесь на новую ветку
git checkout pr-<pull_number>

Как объясняется в Stack Overflow, можно использовать git fetch original pull/<pull_number>/head, где original – имя remote, указывающее на оригинальный репозиторий, а <pull_number> – номер PR, который вы хотите fetch‑ить.

Важно: этот метод работает только если PR был создан из ветки внутри самого оригинального репозитория, а не из форка.

Метод 2: Работа с ветками PR из форков

Большинство PR приходят из форков, а не из оригинального репозитория. В этом случае вам нужно fetch‑ить из конкретного форка, который создал PR.

bash
# Сначала определите, какой форк создал PR
# (Проверьте страницу PR на GitHub, чтобы увидеть исходный репозиторий)

# Добавьте форк как remote (замените на реальный URL форка)
git remote add pr-fork https://github.com/PR_AUTHOR/REPOSITORY.git

# Получите конкретную ветку из форка
git fetch pr-fork BRANCH_NAME

# Создайте локальную ветку из полученного контента
git checkout -b pr-branch FETCH_HEAD

Согласно руководству Stack Overflow, «вы можете просто напрямую pull‑ить ветку. В большинстве случаев с GitHub ветка просто называется master в форке пользователя, который создал PR».

Для более систематического подхода можно использовать инструмент GitHub CLI (gh), который предоставляет специальные команды для работы с PR:

bash
# Сначала установите GitHub CLI, если нужно
# Затем перечислите PR из оригинального репозитория
gh pr list --repo OWNER/REPOSITORY

# Посмотрите детали PR, чтобы узнать имя исходной ветки
gh pr view <PR_NUMBER> --repo OWNER/REPOSITORY --json headRefName

Метод 3: Использование веб‑интерфейса GitHub

Иногда самый простой способ – использовать веб‑интерфейс GitHub для доступа к содержимому PR:

  1. Перейдите на страницу pull‑requests оригинального репозитория
  2. Найдите незавершённый PR, который хотите импортировать
  3. Кликните на PR, чтобы открыть его детали
  4. Перейдите на вкладку «Files changed», чтобы увидеть реальные изменения кода
  5. Используйте кнопку «View file», чтобы открыть отдельные файлы
  6. Используйте кнопку «Edit file», чтобы создать копию файла с вашими изменениями

Как отмечено в обсуждениях Stack Overflow, GitHub автоматически создаёт патч‑ветки, когда вы редактируете файлы через веб‑UI, что упрощает применение изменений.

Полный пошаговый рабочий процесс

Ниже приведён полный рабочий процесс для импорта незавершённых pull‑requests в ваш форк:

Шаг 1: Настройте локальный репозиторий

bash
# Клонируйте ваш форк
git clone https://github.com/YOUR_USERNAME/REPOSITORY.git
cd REPOSITORY

# Добавьте оригинальный репозиторий как upstream
git remote add upstream https://github.com/ORIGINAL_OWNER/REPOSITORY.git

# Получите все remotes
git fetch upstream
git fetch origin

Шаг 2: Определите и fetch‑ите конкретные pull‑requests

bash
# Получите конкретный PR (метод 1)
git fetch upstream pull/123/head:pr-123

# Или fetch из форка (метод 2)
git remote add pr-fork https://github.com/PR_AUTHOR/REPOSITORY.git
git fetch pr-fork feature-branch

# Создайте локальные ветки
git checkout pr-123
# или
git checkout -b pr-branch FETCH_HEAD

Шаг 3: Проверьте и интегрируйте изменения

bash
# Просмотрите полученные изменения
git log --oneline -5
git diff HEAD~1

# Создайте ветку для интеграции
git checkout -b integrate-pr-123
git merge pr-123

# Разрешите любые конфликты, если они возникнут

Шаг 4: Отправьте в ваш форк

bash
# Отправьте интегрированные изменения в ваш форк
git push origin integrate-pr-123

# Создайте pull‑request в вашем форке или слейте напрямую
# в зависимости от вашего рабочего процесса

Как отмечено в стандартном рабочем процессе fork‑и‑pull‑request GitHub, лучше всего «fetch‑ить все ветки PR» и затем создавать локальные ветки на основе номеров PR для лучшей организации.

Устранение типичных проблем

Ошибки «Permission denied»

Если вы сталкиваетесь с ошибками доступа при попытке fetch‑ить из оригинального репозитория, скорее всего репозиторий приватный или ограничен. В этом случае вам нужно работать с форками:

bash
# Вместо fetch из upstream найдите реальный форк
# который создал PR и fetch‑ите оттуда
git remote add pr-source https://github.com/PR_AUTHOR/REPOSITORY.git
git fetch pr-source

Ошибки «Branch not found»

Если git fetch upstream pull/<number>/head выдаёт «branch not found», значит PR был создан из форка, а не из оригинального репозитория. В этом случае используйте Метод 2.

Конфликты при слиянии

При интеграции нескольких PR вы можете столкнуться с конфликтами. Разрешите их, используя стандартные методы разрешения конфликтов Git:

bash
# После возникновения конфликтов
git status  # Посмотрите конфликтующие файлы
# Отредактируйте файлы, чтобы разрешить конфликты
git add resolved-file.txt
git commit -m "Resolve conflicts for PR integration"

Лучшие практики

  1. Поддерживайте чёткие имена веток: используйте описательные имена, например pr-123-feature или integrate-user-fix, чтобы отслеживать, какие PR вы интегрировали.

  2. Тщательно тестируйте: перед слиянием интегрированных PR в основную ветку протестируйте изменения, чтобы убедиться, что они работают корректно в вашем контексте.

  3. Дайте кредит: при создании pull‑request с интегрированным кодом упомяните оригинальных авторов и ссылку на их PR.

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

bash
git fetch upstream
git merge upstream/main

Как рекомендует Graphite, важно «поддерживать ваш форк в актуальном состоянии: регулярно синхронизируйте ваш форк с оригинальным репозиторием, чтобы избежать конфликтов».

  1. Документируйте ваши изменения: ведите заметки о том, какие PR вы интегрировали и почему, особенно при поддержке неактивного репозитория.

Источники

  1. Stack Overflow – How can I fetch an unmerged pull request for a branch I don’t own?
  2. Stack Overflow – How to apply unmerged upstream pull requests from other forks into my fork
  3. GitHub Gist – Standard Fork & Pull Request Workflow
  4. Reflectoring.io – Github’s Fork & Pull Workflow for Git Beginners
  5. Graphite.com – Understanding the git fork and pull request workflow
  6. Stack Overflow – How to apply unmerged pull request from original repo into my fork via GitHub web

Заключение

Импорт незавершённых pull‑requests из неактивного репозитория в ваш форк полностью возможен с помощью мощных возможностей Git по fetch‑у и управлению ветками. Ключ в том, чтобы понять, откуда был создан PR – из ветки оригинального репозитория или из форка – и использовать соответствующую команду fetch. Всегда тщательно тестируйте интегрированные изменения и ведите чёткую документацию, чтобы сохранить ценные вклады, которые иначе могли бы быть потеряны из-за отказа оригинальных maintainers.

Авторы
Проверено модерацией
Модерация