Распределённая система контроля версий Git обеспечивает простоту поддержки и разработки открытого программного обеспечения, в создании которого участвует команда специалистов. Сама система Git является ярким примером проекта с открытым исходным кодом. Множество проектов хранят файлы в репозиториях Git, а такие сайты как GitHub позволяют быстро внести свой вклад в развитие того или иного проекта.
Проекты с открытым исходным кодом, размещённые в публичных репозиториях, развиваются за счет вклада широкого сообщества разработчиков с помощью. Проект принимает внесённые в код изменения с помощью pull-запросов.
Данное руководство научит вас делать pull-запросы в репозитории Git с помощью командной строки.
Требования
- Предварительно установленная система контроля версий Git. Подробные инструкции по установке можно найти здесь.
- Аккаунт GitHub. Регистрация бесплатная. Чтобы зарегистрироваться, укажите имя пользователя и адрес электронной почты.
- Проект, в разработке которого вы хотите участвовать. Больше информации об открытых проектах можно найти здесь.
Создание копии репозитория
Репозиторий – это главная папка проекта. Репозиторий содержит все файлы проекта, включая документацию и хронологию изменений для каждого файла. Репозитории на GitHub могут иметь несколько соавторов, также они могут быть публичными и приватными.
Чтобы начать работу над открытым проектом, нужно сначала создать собственную копию репозитория. Чтобы получить локальную рабочую копию кода, создайте форк проекта (ветвление, fork) и клонируйте его.
Форк проекта
Чтобы создать форк репозитория GitHub, откройте сайт GitHub и найдите открытый проект, в разработке которого вы хотите участвовать. Ссылки GitHub содержат имя владельца проекта и название самого проекта.
https://github.com/username/repository
К примеру, репозиторий проекта node-chakracore принадлежит nodejs, значит, ссылка GitHub будет выглядеть так:
https://github.com/nodejs/node-chakracore
где nodejs – имя пользователя, node-chakracore – имя репозитория.
Выберите проект, в котором вы хотите принять участие, и откройте его репозиторий на GitHub.
На главной странице проекта вы увидите кнопку Fork под вашим значком пользователя.
Чтобы начать форк репозитория, нажмите кнопку Fork. В окне браузера появится следующее сообщение:
Forking nodejs/node-chakracore
It should only take a few seconds.
Когда процесс будет выполнен, в браузере вы увидите такой же репозиторий, как и раньше, но в ссылке уже будет указано ваше имя.
https://github.com/your-username/node-chakracore
Теперь можно клонировать репозиторий и получить локальную копию кода.
Клонирование репозитория
Чтобы создать локальную копию кода проекта, откройте терминальное окно. Используйте команду git clone и укажите ссылку на форк репозитория.
Эта ссылка почти такая же, как и предыдущая, и отличается только тем, что заканчивается расширением .git, например:
https://github.com/your-username/node-chakracore.git
Скопировать эту ссылку можно с помощью зелёной кнопки Clone or download на странице репозитория. Справа от ссылки появится кнопка, с помощью которой можно скопировать ссылку.
Теперь можно добавить скопированный URL в команду git clone:
git clone https://github.com/your-username/repository.git
Создание новой ветки
Работая над открытым проектом, разработчики предлагают внедрить в основной код различные новые функции и исправления. Некоторые идеи можно реализовать в короткие сроки, в то же время на реализацию других идей может уйти много времени и ресурсов. Поэтому разработчики создают ветку репозитория: это позволяет управлять рабочим процессом, изолировать изменения друг от друга и выбирать функции, которые нужно добавить в основную ветку репозитория проекта.
По умолчанию главная ветка репозитория называется master. Код, который находится в главной ветке, может развернуть любой пользователь.
Создавая новую ветку из ветки master, важно выбрать описательное имя: например, вместо my-branch лучше использовать frontend-hook-migration или fix-documentation-typos.
Чтобы создать ветку, откройте окно терминала и перейдите в репозиторий:
cd repository
Примечание: Замените repository названием своего репозитория.
Затем используйте команду git branch:
git branch new-branch
Примечание: Вместо new-branch укажите описательное имя ветки.
Чтобы перейти на новую ветку, используйте команду:
git checkout new-branch
Switched to branch 'new-branch'
С помощью флага -b можно объединить две предыдущие команды в одну, которая создаст новую ветку и переключится на неё:
git checkout -b new-branch
Чтобы вернуться на ветку master, используйте команду checkout и укажите имя ветки:
git checkout master
С помощью этой команды можно переключаться между различными ветками.
Теперь можно приступать к созданию новых и редактированию существующих файлов.
Локальные изменения кода
Внеся изменения в код, вы можете добавить их в локальный реопзиторий с помощью команды git add. Чтобы добавить все изменения в репозиторий, используйте флаг –A.
git add -A
Чтобы записать изменения, добавленные в репозиторий, используйте команду git commit.
Создание сообщения коммита – очень важный этап работы над открытым проектом. Это сообщение позволяет другим разработчикам понять, что именно вы изменили в коде и почему это изменение важно. Кроме того, сообщения коммитов предоставляют хронологическую запись изменений проекта в целом, помогая новым разработчикам понять, как развивался проект.
Короткое сообщение коммита можно отправить с помощью флага –m, например:
git commit -m "Fixed documentation typos"
Но если вы внесли существенные изменения в код проекта, вы должны написать более подробное сообщение. Для этого введите:
git commit
Команда откроет текстовый редактор. Если вы хотите выбрать текстовый редактор для создания коммита, добавьте название редактора в команду:
git config --global core.editor "nano"
или
git config --global core.editor "vim"
После запуска команды git commit на экране появится документ в текстовом редакторе, который выглядит примерно так:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch new-branch
# Your branch is up-to-date with 'origin/new-branch'.
#
# Changes to be committed:
# modified: new-feature.py
#
Под комментариями вы можете добавить сообщение коммита.
Чтобы сообщение коммита было полезным для других разработчиков, поместите в начале сообщения краткое описание изменений длиной около 50 символов. Далее добавьте несколько разделов:
- раскройте причину, по которой вы внесли это изменение в код;
- опишите, как работает код;
- предоставьте дополнительную информацию, которая может пригодиться другим разработчикам.
Постарайтесь предоставить в сообщении максимум полезной информации.
Сохраните и закройте текстовый файл с коммитом. После этого можно проверить его состояние:
git status
Команда должна вернуть примерно такой вывод:
On branch new-branch
Your branch is ahead of 'origin/new-branch' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
Теперь можно использовать команду git push, чтобы выгрузить изменения в текущую ветку форка репозитория:
git push --set-upstream origin new-branch
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 336 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/your-username /respository .git
a1f29a6..79c0e80 new-branch -> new-branch
Branch new-branch set up to track remote branch new-branch from origin.
Теперь можно открыть форк репозитория на странице GitHub, переключиться на ветку, в которую вы внесли изменения, и просмотреть её.
На данном этапе вы уже можете сделать pull-запрос к оригинальному репозиторию. Но сначала рекомендуется обновить локальный репозиторий.
Обновление локального репозитория
Работая над открытым проектом вместе с другими разработчиками, важно постоянно следить за обновлениями и своевременно обновлять свой локальный репозиторий. В противном случае при создании pull-запроса может возникнуть конфликт.
Настройте удалённый репозиторий и синхронизируйте его с оригинальным репозиторием.
Настройка удалённого репозитория
Удалённый репозиторий – это размещённая в интернете версия проекта, к которой у вас есть доступ. Каждый удаленный репозиторий должен предоставлять вам право на чтение (или чтение и запись).
Чтобы синхронизировать изменения, внесенные в форк, с оригинальным репозиторием, вам нужно настроить удалённый репозиторий, который будет ссылаться на оригинальный репозиторий.
Сначала проверьте, какие удалённые серверы у вас настроены. Команда git remote с флагом –v отобразит URL-адреса, которые Git хранит вместе с соответствующими краткими именами удалённых серверов. Сейчас у вас есть только один репозиторий, origin.
git remote -v
Поскольку вы клонировали репозиторий, вывод будет примерно таким:
origin https://github.com/your-username/forked-repository.git (fetch)
origin https://github.com/your-username/forked-repository.git (push)
Если же ранее вы создали более одного удалённого репозитория, команда git remote –v выведет на экран полный список этих репозиториев.
Теперь нужно создать репозиторий upstream, который указывает на оригинальный репозиторий.
git remote add upstream https://github.com/original-owner-username/original-repository.git
В данном примере upstream – это короткое имя удаленного хранилища, так как с точки зрения Git «upstream» ссылается на репозиторий, из которого вы клонировали свой репозиторий. Чтобы добавить удалённый репозторий со ссылкой на репозиторий соавтора, можно указать имя соавтора или его ник.
Чтобы убедиться, что удалённый репозиторий upstream был успешно добавлен, в каталоге репозитория запустите команду:
git remote -v
origin https://github.com/your-username/forked-repository.git (fetch)
origin https://github.com/your-username/forked-repository.git (push)
upstream https://github.com/original-owner-username/original-repository.git (fetch)
upstream https://github.com/original-owner-username/original-repository.git (push)
Теперь вы можете синхронизировать форк с исходным репозиторием.
Синхронизация форка
В терминале перейдите в каталог локального репозитория и используйте команду git fetch, чтобы извлечь все ветки и их коммиты из оригинального репозитория.
git fetch upstream
Вывод команды зависит от того, сколько изменений появилось в исходном репозитории. В конце вывода содержатся примерно такие строки (они варьируются в зависимости от того, сколько веток входит в проект):
From https://github.com/original-owner-username/original-repository
* [new branch] master -> upstream/master
Теперь коммиты ветки master будут храниться в локальной ветке upstream/master.
Перейдите на локальную ветку master:
git checkout master
Switched to branch 'master'
Теперь можно объединить все изменения, которые были сделаны в ветке master исходного репозитория, с локальной веткой.
git merge upstream/master
Вывод начинается с Updating, если в ветке появились новые данные. Если никаких изменений не произошло, команда вернёт Already up-to-date.
Ветка master вашего форка теперь синхронизирована с репозиторием upstream.
В зависимости от вашего рабочего процесса и количества времени, которое вы тратите на внесение изменений, вы можете синхронизировать ваш форк с кодом исходного репозитория столько раз, сколько вам нужно. Но вы обязательно должны синхронизировать форк, прежде чем сделать pull-запрос, чтобы ваш код не конфликтовал с остальным кодом проекта.
Создание pull-запроса
Теперь вы можете сделать pull-запрос к исходному репозиторию.
Перейдите в форк репозитория в браузере и нажмите кнопку New pull request слева.
На следующем экране вы можете отредактировать ветку и выбрать репозиторий в выпадающем меню.
После этого на экране появится форма, в которой вы можете добавить заголовок, оставить комментарий и т.п.
GitHub сообщит вам, если вы можете объединить две ветки. Добавьте заголовок, комментарий и нажмите Create pull request.
Пользователи, поддерживающие исходный репозиторий, рассмотрят ваш запрос. Возможно, они предложат вам внести в него некоторые изменения.
Заключение
Теперь вы умеете отправлять pull-запросы, работая над открытыми проектами.
Разработка проекта с открытым исходным кодом может стать полезным опытом.