Как импортировать необъединённые 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, а затем создать локальную ветку из полученного контента для последующего слияния в ваш форк.
Содержание
- Понимание задачи
- Метод 1: Прямой fetch pull‑requests
- Метод 2: Работа с ветками PR из форков
- Метод 3: Использование веб‑интерфейса GitHub
- Полный пошаговый рабочий процесс
- Устранение типичных проблем
- Лучшие практики
Понимание задачи
При работе с неактивным репозиторием, содержащим ценные незавершённые pull‑requests, вы сталкиваетесь с несколькими техническими трудностями. Во-первых, оригинальный репозиторий может больше не иметь активных maintainers, которые бы рассмотрели и слили эти изменения. Во-вторых, pull‑requests обычно существуют как ветки в форках участников, а не в самом оригинальном репозитории.
Как отмечено в обсуждениях на Stack Overflow, Git не поддерживает «pull‑requests» как нативный концепт – это особенности GitHub. Однако вы можете получить доступ к базовым веткам и коммитам, которые составляют PR.
Ключевой вывод: каждый pull‑request GitHub соответствует ветке в оригинальном репозитории или в форке, и вы можете напрямую fetch‑ить эти ветки с помощью Git‑команд.
Метод 1: Прямой fetch pull‑requests
Самый прямой способ – fetch‑ить ветку PR напрямую из оригинального репозитория. Это работает, если PR был создан из ветки самого оригинального репозитория.
# Добавьте оригинальный репозиторий как 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.
# Сначала определите, какой форк создал 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:
# Сначала установите GitHub CLI, если нужно
# Затем перечислите PR из оригинального репозитория
gh pr list --repo OWNER/REPOSITORY
# Посмотрите детали PR, чтобы узнать имя исходной ветки
gh pr view <PR_NUMBER> --repo OWNER/REPOSITORY --json headRefName
Метод 3: Использование веб‑интерфейса GitHub
Иногда самый простой способ – использовать веб‑интерфейс GitHub для доступа к содержимому PR:
- Перейдите на страницу pull‑requests оригинального репозитория
- Найдите незавершённый PR, который хотите импортировать
- Кликните на PR, чтобы открыть его детали
- Перейдите на вкладку «Files changed», чтобы увидеть реальные изменения кода
- Используйте кнопку «View file», чтобы открыть отдельные файлы
- Используйте кнопку «Edit file», чтобы создать копию файла с вашими изменениями
Как отмечено в обсуждениях Stack Overflow, GitHub автоматически создаёт патч‑ветки, когда вы редактируете файлы через веб‑UI, что упрощает применение изменений.
Полный пошаговый рабочий процесс
Ниже приведён полный рабочий процесс для импорта незавершённых pull‑requests в ваш форк:
Шаг 1: Настройте локальный репозиторий
# Клонируйте ваш форк
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
# Получите конкретный 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: Проверьте и интегрируйте изменения
# Просмотрите полученные изменения
git log --oneline -5
git diff HEAD~1
# Создайте ветку для интеграции
git checkout -b integrate-pr-123
git merge pr-123
# Разрешите любые конфликты, если они возникнут
Шаг 4: Отправьте в ваш форк
# Отправьте интегрированные изменения в ваш форк
git push origin integrate-pr-123
# Создайте pull‑request в вашем форке или слейте напрямую
# в зависимости от вашего рабочего процесса
Как отмечено в стандартном рабочем процессе fork‑и‑pull‑request GitHub, лучше всего «fetch‑ить все ветки PR» и затем создавать локальные ветки на основе номеров PR для лучшей организации.
Устранение типичных проблем
Ошибки «Permission denied»
Если вы сталкиваетесь с ошибками доступа при попытке fetch‑ить из оригинального репозитория, скорее всего репозиторий приватный или ограничен. В этом случае вам нужно работать с форками:
# Вместо 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:
# После возникновения конфликтов
git status # Посмотрите конфликтующие файлы
# Отредактируйте файлы, чтобы разрешить конфликты
git add resolved-file.txt
git commit -m "Resolve conflicts for PR integration"
Лучшие практики
-
Поддерживайте чёткие имена веток: используйте описательные имена, например
pr-123-featureилиintegrate-user-fix, чтобы отслеживать, какие PR вы интегрировали. -
Тщательно тестируйте: перед слиянием интегрированных PR в основную ветку протестируйте изменения, чтобы убедиться, что они работают корректно в вашем контексте.
-
Дайте кредит: при создании pull‑request с интегрированным кодом упомяните оригинальных авторов и ссылку на их PR.
-
Поддерживайте ваш форк в актуальном состоянии: регулярно синхронизируйте его с оригинальным репозиторием, если он получает обновления:
git fetch upstream git merge upstream/main
Как рекомендует Graphite, важно «поддерживать ваш форк в актуальном состоянии: регулярно синхронизируйте ваш форк с оригинальным репозиторием, чтобы избежать конфликтов».
- Документируйте ваши изменения: ведите заметки о том, какие PR вы интегрировали и почему, особенно при поддержке неактивного репозитория.
Источники
- Stack Overflow – How can I fetch an unmerged pull request for a branch I don’t own?
- Stack Overflow – How to apply unmerged upstream pull requests from other forks into my fork
- GitHub Gist – Standard Fork & Pull Request Workflow
- Reflectoring.io – Github’s Fork & Pull Workflow for Git Beginners
- Graphite.com – Understanding the git fork and pull request workflow
- Stack Overflow – How to apply unmerged pull request from original repo into my fork via GitHub web
Заключение
Импорт незавершённых pull‑requests из неактивного репозитория в ваш форк полностью возможен с помощью мощных возможностей Git по fetch‑у и управлению ветками. Ключ в том, чтобы понять, откуда был создан PR – из ветки оригинального репозитория или из форка – и использовать соответствующую команду fetch. Всегда тщательно тестируйте интегрированные изменения и ведите чёткую документацию, чтобы сохранить ценные вклады, которые иначе могли бы быть потеряны из-за отказа оригинальных maintainers.