Как организовать сотрудничество на GitHub
Если вы еще не в курсе, GitHub это очень эффективный способ организации совместной работы над проектами.
Данный сервис предоставляет каждому, у кого есть доступ в интернет, возможность делиться кодом со всеми остальными пользователями, совершенно бесплатно (не говоря уже о вспомогательных средствах для проверки исходного кода и просмотра истории внесенных изменений). GitHub был принят множеством проектов с открытым кодом, как платформа для их совместной разработки и улучшения.
Как можно присоединиться к разработке проекта? Думаю, вам известно, как использовать Git , чтобы вносить изменения в файлы и переносить их на сервер. Но есть преимущества принятия участия в разработке больших проектов с открытым кодом, и GitHub однозначно лучшее для этого место.
В этой статье мы обсудим некоторые правила работы над такими проектами, а также дадим необходимые знания и инструкции для начинающих.
Начните с малого
Начиная работать над проектом с открытым кодом, очень важно определить свою роль. На самом деле, люди нередко отказываются от участия в разработке только потому, что боятся показаться не слишком опытными и знающими программистами.
Не бойтесь начать с малого : вместо того, чтобы пытаться исправить большие ошибки ( баги ) или переписать целый модуль, попробуйте найти недостатки в документации или ошибки кроссплатформенности, или даже простые синтаксические и грамматические ошибки ( пример на GitHub от пользователя mzgol).
Выполнение таких задач это отличный способ сделать первые шаги в качестве того, кто приложил руку к развитию какого-либо проекта, и при этом не брать на себя непосильные задачи. Зарегистрируйтесь на ресурсе CodeTriage , чтобы автоматически получать GitHub Issues в свой почтовый ящик.
Если вы получили сообщение, в котором имеется посильная для вас задача, то можете взять ее в работу, а после окончания, послать автору так называемый pull request , или запрос на включение сделанных изменений (о том, как это сделать, мы поговорим чуть ниже).
Изучите экосистему проекта
При любой совместной работе, как правило, вводится набор соглашений. Среди них может быть методика внесения изменений, график работы или даже синтаксические стандарты и правила форматирования. Перед тем, как начинать реальную работу над проектом, прочитайте всю имеющуюся документацию.
Например, GitHub стандартизовал файл CONTRIBUTING.md (ознакомьтесь для примера с этим документом ). Подобные инструкции поддерживаются людьми, которые обслуживают базы кодов.
Другим способом понимания экосистемы проекта, является просмотр имеющейся базы кода и просмотр истории коммитов (изменений). Прочтение сообщений об изменениях и просмотр стиля кода может рассказать вам многое о проекте. Ознакомьтесь с документацией и словарями, чтобы внесенные вами изменения имели стиль, схожий с используемым в данном проекте.
Теперь, когда вы являетесь частью экосистемы проекта, как же вам все-таки внести изменения?
Использование Pull-Request для внесения изменений
Рабочая среда для внесения изменений в код, сначала может показаться сложной .
Первое, что следует уяснить, это важность следования стандартам и соглашениям, принятым в проекте, над которым вы работаете (что уже обсуждалось выше). Стандартная рабочая среда на GitHub достаточно проста и позволяет:
- Ответвлять выбранный репозиторий в ваш аккаунт;
- Копировать репозиторий на локальную машину;
- Выбирать ветку ( topic branch ) и вносить в неё изменения;
- Переносить изменения из других веток в свою;
- Использовать различные инструменты GitHub, чтобы создавать pull request’ы через обсуждения;
- Применять полученные изменения;
- Pull request сливается с проектом (как правило с основной веткой – master branch ), а topic branch удаляется из репозитария.
Внутри рабочей среды, вы можете увидеть множество отличий между разными проектами. Например, различия в соглашениях о названии тем. Некоторые проекты могут использовать соглашения типа bug_345 , где 345 это идентификатор (ID #) GitHub issue .
Некоторые проекты используют короткие сообщения с правками, другие же – более длинные. Далее приведена пошаговая инструкция, которая поможет разобраться с интерфейсом и функционалом.
6.2 GitHub – Внесение собственного вклада в проекты
Теперь наша учётная запись создана и настроена, давайте же пройдёмся по деталям, которые будут полезны при внесении вклада в уже существующие проекты.
Создание ответвлений (fork)
Если вы хотите вносить свой вклад в уже существующие проекты, в которых у нас нет прав на внесения изменений путём отправки (push) изменений, вы можете создать своё собственное ответвление (fork) проекта. Это означает, что GitHub создаст вашу собственную копию проекта, данная копия будет находиться в вашем пространстве имён, и вы сможете легко выполнять изменения путём отправки (push) изменений.
Примечание
Исторически так сложилось, что англоязычный термин «fork» (создание ветвления проекта) имел негативный контекстный смысл, данный термин означал, что кто-то повёл или ведёт проект с открытым исходным кодом в другом, отличном от оригинала, направлении, иногда данный термин также означал создание конкурирующего проекта с раздельными авторами. В контексте GitHub, «fork» (создание ветвления проекта) просто означает создание ветвления проекта в собственном пространстве имён, что позволяет вносить публичные изменения и вносить свой собственный вклад в более открытом виде.
Таким образом, проекты не обеспокоены тем, чтобы пользователи, которые хотели бы выступать в роли соавторов, имели право на внесение изменений путём их отправки (push). Люди просто могут создавать свои собственные ветвления (fork), вносить туда изменения, а затем отправлять свои внесённые изменения в оригинальный репозиторий проекта путём создания запроса на принятие изменений (Pull Request), сами же запросы на принятие изменений будут описаны далее. Запрос на принятие изменений (Pull Request) откроет новую ветвь с обсуждением отправляемого кода, и автор оригинального проекта, а также другие его участники, могут принимать участие в обсуждении предлагаемых изменений до тех пор, пока автор проекта не будет ими доволен, после чего автор проекта может добавить предлагаемые изменения в проект.
Чтобы создать ответвление проекта, зайдите на страницу проекта и нажмите кнопку «Создать ответвление» («Fork»), которая расположена в правом верхнем углу.
Рисунок 88 – Кнопка «Создать ответвление» («Fork»)
Через несколько секунд вы будете перенаправлены на страницу собственного нового проекта, содержащую вашу копию, в которой у вас есть права на запись.
Рабочий процесс с использованием GitHub
GitHub разработан с прицелом на определённый рабочий процесс с использованием запросов на слияния. Этот рабочий процесс хорошо подходит всем: и маленьким, сплочённым вокруг одного репозитория командам, и крупным распределённым компаниям, и группам незнакомцев, сотрудничающих над проектом с сотней копий. Рабочий процесс GitHub основан на тематических ветках, о которых мы говорили в главе «Ветвление в Git».
Как это обычно работает:
- Создайте форк проекта.
- Создайте тематическую ветку на основании ветки master .
- Создайте один или несколько коммитов с изменениями, улучшающими проект.
- Отправьте эту ветку в ваш проект на GitHub.
- Откройте запрос на слияние на GitHub.
- Обсудите его, внесите изменения, если нужно.
- Владелец проекта принимает решение о принятии изменений, либо об их отклонении.
- Получите обновлённую ветку master и отправьте её в свой форк.
Очень напоминает подход, описанный в разделе «Диспетчер интеграции» главы 5, но вместо использования электронной почты, команда сотрудничает через веб-интерфейс.
Давайте посмотрим, как можно предложить изменения в проект, размещённый на GitHub.
Подсказка
В большинстве случаев можно использовать официальный инструмент GitHub CLI вместо веб-интерфейса GitHub. Инструмент доступен в системах Windows, MacOS и Linux. Посетите страницу GitHub CLI homepage для получения инструкций по установке и использованию.
Создание запроса на слияние
Тони ищет, чего бы запустить на своём новеньком Arduino. Кажется, он нашёл классный пример на https://github.com/schacon/blink.
Рисунок 89 – Проект, над которым мы хотим поработать
Единственная проблема в том, что светодиод моргает слишком быстро; нам кажется, лучше установить задержку в три секунды, а не одну. Так давайте, исправим это и предложим изменения автору.
Для начала, нажмите кнопку «Fork», как было сказано выше, чтобы заполучить собственную копию проекта. Мы зарегистрированы на GitHub под именем « tonychacon », так что наша копия окажется по адресу https://github.com/tonychacon/blink, где мы сможем редактировать её. Мы клонируем его, создадим тематическую ветку, внесём необходимые изменения и, наконец, отправим их на GitHub.
- Клонируем нашу копию
- Создаём тематическую ветку
- Вносим свои изменения
- Проверяем изменения
- Фиксируем изменения в тематической ветку
- Отправляем новую ветку в нашу копию на GitHub
Теперь, если мы зайдём на страничку нашей копии на GitHub, мы увидим, что GitHub заметил наши изменения и предлагает открыть запрос на слияние с помощью большой зелёной кнопки.
Также можно зайти на страницу «Branches», по адресу https://github.com/<user>/<project>/branches , найти интересующую ветку и открыть запрос оттуда.
Рисунок 90 – Кнопка открытия запроса на слияние
Если нажать на эту кнопку, появится экран ввода заголовка и описания изменений, предлагаемых на рассмотрение владельцу проекта. Рекомендуется серьёзно подойти к составлению описания и сделать его максимально информативным, чтобы владелец проекта понимал, зачем эти изменения, и какую пользу они принесут.
Также мы видим список коммитов в нашей тематической ветке, «опередивших» ветку master (в данном случае всего один коммит) и предпросмотр всех изменений, вносимых этими коммитами.
Рисунок 91 – Страница создания запроса на слияние
После создания запроса на слияние (путём нажатия кнопки «Create pull request» на этой странице) владелец форкнутого проекта получит уведомление о предложенных изменениях со ссылкой на страницу с информацией о запросе.
Примечание
Запросы на слияние широко используются для публичных проектов типа, описанного выше, когда участник уже подготовил все изменения для слияния с основным репозиторием. Тем не менее, часто можно встретить использование запросов на слияние во внутренних проектах в самом начале цикла разработки. Обьяснение простое: вы можете обновлять тематическую ветку после открытия запроса на слияние, поэтому сам запрос открывается как можно раньше, чтобы отслеживать прогресс разработки.
Обработка запроса на слияние
На этом этапе, владелец проекта может просмотреть предложенные изменения, принять, отклонить или прокомментировать их. Предположим, ему импонирует идея, но он предпочёл бы большую задержку перед включением или выключением света.
В то время как в главе «Распределенный Git» обсуждение изменений может производится через электронную почту, на GitHub всё происходит онлайн. Владелец проекта может просмотреть суммарные изменения, вносимые запросом, и прокомментировать любую отдельно взятую строку.
Рисунок 92 – Комментирование определённой строки в запросе на слияние
Как только владелец прокомментирует изменения, автор запроса на слияние (а также все подписавшиеся на этот репозиторий) получат уведомления. Далее мы рассмотрим, как настроить уведомления, но сейчас, если Тони включил уведомления через электронную почту, он получит следующее письмо:
Рисунок 93 – Комментарии, отправленные по электронной почте
Кто угодно может оставлять комментарии к запросу на слияние. На рисунке 94 (ниже) можно увидеть пример, где владелец проекта оставил комментарии как к строке кода, так и в основной секции обсуждения. Как вы могли заметить, комментарии к коду так же приведены в виде обсуждения.
Рисунок 94 – Страница обсуждения запроса на слияние
Теперь участник может видеть, что ему необходимо сделать для того, чтобы его изменения были приняты. К счастью, это тоже легко сделать. Используя почту, вам потребуется заново отправить свои изменения в список рассылки, а при использовании GitHub вы просто делаете коммит в тематическую ветку и повторяете push , что автоматически обновляет запрос на слияние. На рисунке 95 (ниже) также видно, что в обновленном запросе на слияние старый комментарий к коду был свёрнут, так как он относится к строке, которая с тех пор изменилась.
Когда участник сделает это, владелец проекта снова получит уведомление, а на странице запроса будет отмечено, что проблема решена. Фактически, как только строка кода имеющая комментарий будет изменена, GitHub заметит это и удалит устаревшее отличие.
Рисунок 95 – Финальная стадия запроса на слияние
Примечательно, что если вы перейдёте на вкладку «Files Changed» в этом запросе на слияние, то увидите «унифицированную» разницу – это суммарные изменения, которые будут включены в основную ветку при слиянии тематической ветки. В терминологии git diff это эквивалентно команде git diff master. <branch> для ветки, на которой основан этот запрос на слияние. В «Определение применяемых изменений» данный тип отличий описан детальнее.
GitHub также проверяет, может ли запрос на слияние быть применён без конфликтов, и предоставляет кнопку для осуществления слияния на сервере. Эта кнопка отображается, только если у вас есть права на запись в репозиторий, и возможно простейшее слияние. По нажатию на неё GitHub произведёт «non-fast-forward» слияние, что значит, даже если слияние может быть осуществлено перемоткой вперед, всё равно будет создан коммит слияния.
При желании, можно стянуть ветку и произвести слияние локально. Если эта ветка будет слита в master ветку и отправлена на сервер, то GitHub автоматически закроет запрос на слияние.
Это основной рабочий процесс, который используется большинством проектов на GitHub. Создаются тематические ветки, открываются запросы на слияние, производится обсуждение, при необходимости производятся доработки в ветке, и, наконец, запрос либо закрывается, либо сливается.
Примечание
Не только ответвления
Важно отметить, что можно открывать запросы на слияние между двумя ветками в одном репозитории. Если вы работаете над функционалом с кем-то ещё, и у вас обоих есть права записи, то вы можете отправить свою тематическую ветку в репозиторий и открыть запрос на слияние в ветку master в рамках одного проекта, что позволит инициировать процедуру проверки кода и его обсуждения. Создание ответвлений проекта не является обязательным.
Продвинутые запросы на слияние
На текущий момент мы рассмотрели основы участия в проекте на GitHub, давайте рассмотрим некоторые интересные секреты и трюки касательно запросов слияния, чтобы вы могли более эффективно их использовать.
Запросы слияния как патчи
Важно понимать, что многие проекты не воспринимают запросы слияния как очередь идеальных патчей, которые должны применяться аккуратно и по порядку, как и большинство проектов, участие в которых основывается на отправке набора патчей через списки почтовых рассылок. Большинство проектов на GitHub понимают ветки запросов на слияние как беседу относительно предлагаемого изменения, завершающуюся слиянием унифицированных изменений.
Это важное различие, так как изменение предлагается до того, как код станет считаться идеальным, что гораздо реже происходит с распространяемыми наборами патчей через списки рассылок. Обсуждение происходит на более раннем этапе, и выработка правильного решения происходит за счёт усилий сообщества. Когда код предлагается через запрос на слияние, и сопровождающий проекта или сообщество предлагает изменения, то набор патчей не применяется, а отправляются результирующие изменения как новый коммит в ветку, двигая обсуждение вперёд и сохраняя уже проделанную работу нетронутой.
Например, если вы вернётесь и посмотрите на рисунок 95, то увидите, что участник не делал перебазирование своего коммита и не отправлял новый запрос на слияние. Вместо этого были сделаны новые коммиты и отправлены в существующую ветку. Таким образом, если вы в будущем вернётесь к этому запросу слияния, то легко найдёте весь контекст принятого решения. По нажатию кнопки «Merge» целенаправленно создаётся коммит слияния, который указывает на запрос слияния, оставляя возможность возврата к цепочке обсуждения.
Следование за исходным репозиторием
Если ваш запрос на слияние устарел или не может быть слит без конфликтов, то вам нужно изменить его, чтобы сопровождающий мог просто его слить. GitHub проверит это за вас и под каждым из запросов на слияние отобразит уведомление, можно ли его слить без конфликтов или нет.
Рисунок 96 – Запрос имеет конфликты слияния
Если вы видите что-то вроде текста на рисунке 96, то вам следует изменить свою ветку так, чтобы исключить конфликты и сопровождающий не делал лишнюю работу.
Существует два основных варианта это сделать. Вы можете либо перебазировать свою ветку относительно целевой ветки (обычно, относительно ветки master исходного репозитория), либо слить целевую ветку в свою.
Большинство разработчиков на GitHub выбирают последний вариант по тем же причинам, что и мы в предыдущем разделе. Важна история и окончательное слияние, а перебазирование не принесёт вам ничего, кроме немного более чистой истории, при этом оно гораздо сложнее и может стать источником ошибок.
Если вы хотите сделать запрос на слияние применяемым, то следует добавить исходный репозиторий как новый удалённый, слить изменения из его основной ветки в вашу тематическую, если имеются, исправить все проблемы, и, наконец, отправить все изменения в ту ветку, на основании которой был открыт запрос на слияние.
Предположим, что в примере « tonychacon », который мы использовали ранее, основной автор сделал изменения, которые конфликтуют с запросом на слияние. Рассмотрим это пошагово.
- Добавляем исходный репозиторий как удалённый с именем upstream .
- Получаем последние изменения из него.
- Сливаем основную ветку в нашу тематическую.
- Исправляем указанный конфликт.
- Отправляем изменения в ту же тематическую ветку.
Как только это будет сделано, запрос на слияние будет автоматически обновлён и перепроверен на возможность слияния.
Рисунок 97 – Запрос слияния без конфликтов
Одна из замечательных особенностей Git — это то, что вы можете делать это постоянно. Если у вас очень длительный проект, вы можете легко сливать изменения из целевой ветки снова и снова и иметь дело только с конфликтами, возникшими с момента вашего последнего слияния, что делает процесс очень управляемым.
Если вы очень хотите перебазировать ветку, чтобы её почистить, то, конечно, вы можете это сделать, но настоятельно не рекомендуется переписывать ветку, к которой уже открыт запрос на слияние. Если другие люди уже стянули её и проделали много работы, то вы столкнётесь со всеми проблемами, описанными в разделе «Опасности перемещения» главы 3. Вместо этого, отправьте перебазированную ветку в новую на GiHub и откройте новый запрос на слияние, который указывает на предыдущий, затем закройте исходный.
Ссылки
Возможно, ваш следующий вопрос будет: «Как мне сослаться на предыдущий запрос слияния?» Оказывается, существует много способов ссылаться на другие вещи практически везде, где у вас есть права записи на GitHub.
Давайте начнём с перекрёстных ссылок для запросов слияния или проблем. Всем запросам слияния и проблемам присваиваются уникальные номера в пределах проекта. Например, у вас не может быть запроса на слияние с номером #3 и проблемы с номером #3. Если вы хотите сослаться на любой запрос слияния или проблему из другого места, просто добавьте #<num> в комментарий или описание. Также можно указать более конкретно, если проблема или запрос слияния находятся где-то ещё; пишите username#<num> , если ссылаетесь на проблему или запрос слияния, находящиеся в ответвлённом репозитории, или username/repo#<num> , если ссылаетесь на другой репозиторий.
Рассмотрим это на примере. Предположим, что мы перебазировали ветку в предыдущем примере, создали новый запрос слияния для неё и сейчас хотим сослаться на предыдущий запрос слияния из нового. Также мы хотим сослаться на проблему, находящуюся в ответвлённом репозитории, и на проблему из совершенно другого проекта. Мы можем составить описание как показано ниже на рисунке 98.
Рисунок 98 – Перекрёстные ссылки в запросе слияния
Когда мы отправим запрос на слияние, то увидим что-то вроде рисунка 99.
Рисунок 99 – Отображение перекрёстных ссылок в запросе слияния
Заметьте, что указанная полная ссылка на GitHub была сокращена до необходимого минимума.
Если Тони сейчас вернётся назад и закроет оригинальный запрос слияния, то мы это увидим, так как он упомянут в новом, а GtHub автоматически создаст отслеживающее событие в хронике запроса слияния. Это значит, что все, кто просматривает закрытый запрос слияния, могут легко перейти к запросу слияния, который его заменил. Ссылка будет выглядеть, как показано на рисунке 100.
Рисунок 100 – Отображение перекрёстных ссылок в закрытом запросе слияния
Кроме идентификационных номеров, можно ссылаться на конкретный коммит, используя SHA-1. Следует указывать полный 40 символьный хеш SHA-1; если GitHub увидит его в комментарии, то автоматически подставит ссылку на коммит. Как было сказано выше, вы можете ссылаться на коммиты как в других, так и в ответвлённых репозиториях точно так же, как делали это с проблемами.
GitHub-версия разметки Markdown
Ссылки на другие проблемы – это лишь часть интереснейших вещей, которые вы можете делать в текстовых полях на GitHub. Для «проблемы» или «запроса слияния» в полях описания, комментария, комментария кода и других вы можете использовать так называемую «GitHub-версию разметки Markdown». Разметка похожа на обычный текст, который основательно преобразуется.
Посмотрите рисунок 101 для примера, как использовать разметку при написании комментариев и текста.
Рисунок 101 – Пример написания и отображения текста с разметкой
GitHub расширил возможности обычной разметки. Эти возможности могут быть очень полезными при создании запросов слияния или комментариев и описаний к проблемам.
Списки задач
Список задач – это первая действительно важная возможность специфической разметки GitHub, особенно для запросов слияния. Список задач представляет собой список флажков для задач, которые вы хотите выполнить. Размещение его в описании проблемы или запроса на слияние обычно указывает на то, что должно быть сделано до того, как проблема будет считаться решённой.
Список задач можно добавить следующим образом:
Если добавить этот список в описание запроса на слияние или проблемы, то он будет отображён следующим образом:
Рисунок 102 – Отображение списка задач в комментарии
Он часто используется в запросах на слияние для отображения списка того, что вы хотите сделать до того, как запрос будет готов к слиянию. Вы можете просто кликнуть по флажку, чтобы обновить комментарий – не нужно редактировать комментарий вручную, чтобы пометить задачу как выполненную.
Также GitHub ищет списки задач в запросах на слияние и проблемах и отображает их как метаданные на страницах, где они упоминаются. Например, если в вашем запросе на слияние есть задачи, и вы просматриваете список всех запросов, то можно увидеть, насколько готов каждый из них. Это позволяет разбивать запрос на слияние на несколько подзадач и помогает другим людям отслеживать прогресс ветки. Пример приведён на рисунке 103.
Рисунок 103 – Статистика задач в списке запросов слияния
Такая возможность невероятно полезна, когда вы открываете запрос на слияние на раннем этапе реализации и с помощью него отслеживаете прогресс.
Фрагменты кода
В комментарии также можно вставлять фрагменты кода. Это особенно полезно, когда вы хотите показать что-то, что вы собираетесь попробовать сделать, до того, как включить это в вашу ветку. Также часто они применяются для добавления примеров кода, который не работает или мог быть добавлен в запрос на слияние.
Для добавления фрагмента кода следует обрамить его обратными кавычками.
Если вы укажете название языка, как показано в примере, GitHub попробует применить к нему подсветку синтаксиса. Для приведённого примера код будет выглядеть как на рисунке 104.
Рисунок 104 – Отображение обрамленного кода
Цитирование
Если вы отвечаете только на часть большого комментария, то можно цитировать только выбранную часть, предваряя её символом > . Это настолько часто используется, что для этого даже существует комбинация клавиш. Если в комментарии выделить текст, на который вы собираетесь ответить, и нажать клавишу r , то выделенный текст будет включён как цитата в ваш комментарий.
Цитаты выглядят примерно так:
После обработки комментарий будет выглядеть как рисунке 105.
Рисунок 105 – Пример отображения цитаты
Смайлики
Наконец, вы можете использовать смайлики. На GitHub вы можете часто встретить их в комментариях или запросах на слияние. Для них есть даже помощник. Например, если при наборе комментария ввести символ двоеточия : , то будут предложены варианты автодополнения.
Рисунок 106 – Автодополнение для смайлов в действии
Смайлы имеют вид :<name>: и могут располагаться в любом месте комментария. Например, вы можете написать что-нибудь вроде этого:
Такой комментарий будет выглядеть как на рисунке 107.
Рисунок 107 – Перегруженный смайликами комментарий
Не то чтобы это невероятно полезно, но добавляет немного веселья и эмоций там, где трудно выразить какие-то эмоции.
Примечание
На текущий момент существует много интернет сервисов, где используются смайлики. Отличную шпаргалку по поиску смайликов, которые выражают нужную вам эмоцию, можно найти здесь:
Картинки
Технически, картинки не относятся к разметке GitHub, но их использование очень полезно. В дополнение к ссылкам на картинки в комментариях, GitHub позволяет встраивать картинки в комментарии.
Рисунок 108 – Перетаскивание картинки для загрузки и встраивания
Если вернуться немного назад к рисунку 98, то над областью редактирования вы увидите небольшую подсказку «Parsed as Markdown». Нажав не неё, вы получите полную подсказку по использованию GitHub разметки.
Поддержание GitHub репозитория в актуальном состоянии
После создания форка, ваш репозиторий будет существовать независимо от оригинального репозитория. В частности, при появлении в оригинальном репозитории новых коммитов GitHub информирует вас следующим сообщением:
При этом GitHub никогда не обновляет ваш репозиторий – это вы должны делать сами. К счастью, сделать это очень просто.
Первый способ не требует конфигурации. Например, если вы сделали форк репозитория https://github.com/progit/progit2.git, то актуализировать ветку master можно следующим образом:
- Если вы находитесь на другой ветке – перейти на ветку master .
- Получить изменения из репозитория https://github.com/progit/progit2.git и слить их с веткой master .
- Отправить локальную ветку master в ваш форк origin .
Каждый раз писать URL репозитория для получения изменений достаточно утомительно. Этот процесс можно автоматизировать слегка изменив настройки:
- Добавить исходный репозиторий как удалённый и назвать его progit .
- Получить ветки репозитория progit , в частности ветку master .
- Настроить локальную ветку master на получение изменений из репозитория progit .
- Установить origin как репозиторий по умолчанию для отправки.
После этого, процесс обновления становится гораздо проще:
- Если вы находитесь на другой ветке – перейти на ветку master.
- Получить изменения из репозитория progit и слить их с веткой master .
- Отправить локальную ветку master в ваш форк origin .
Данный подход не лишён недостатков. Git будет молча выполнять указанные действия и не предупредит вас в случае, когда вы добавили коммит в master , получили изменения из progit и отправили всё вместе в origin – все эти операции абсолютно корректны. Поэтому вам стоит исключить прямое добавление коммитов в ветку master , поскольку эта ветка фактически принадлежит другому репозиторию.
Open a GitHub Pull Request From Your Terminal

You finally did it! You finished writing your new feature and it’s fully tested. You write up a snazzy commit message and hit enter. Your command line is telling you that you have a clean branch and you want to share it with the world RIGHT NOW!
Unfortunately, you have a few mind-numbing steps to take before everyone can bask in the glory of your code. First, you have to push the branch to your remote repository. Next, you have to open up the GitHub repo and click on the «New pull request» button. Then you have to manually select the branch you just published. Finally, you can start writing your PR and share it.
Wouldn’t it be nice if you could skip all these steps with one command? Jose can help!
My colleague Logan Henson mentioned this in «Tip 3» of his incredibly helpful post, Building a Great Pull Request. I have made some minor improvements since then. I highly recommend reading his blog post.
The process to automate this is a bit more complicated than can be achieved using a bash alias, so we’re going to use bash functions. I recommend using Oh My Zsh, since you’re able to easily add functions to the
I’ll post my functions here and we can go over what they’re doing.
Bash Functions to Open a GitHub Pull Request
The openpr() function does all of the heavy lifting. Using commands like git , awk , sed , and cut , it generates the GitHub Pull Request URL using the remote configured in your local repository. Let’s dissect what it does.
Generate the GitHub Repo URL ( github_url )
git remote -v lists all of your configured remote repositories. This script assumes that you only have one GitHub remote URL. If your repo has more than one, you will need to add some logic to account for that.

awk ‘/fetch/’ takes the result of the git remote call and grabs the line that contains the text «fetch».
At this point, the resulting text looks something like:
origin git@github.com:tightenco/symposium.git (fetch)
If you think about exploding each section of that line by spaces, then you end up with this array-like structure:
[‘origin’, ‘git@github.com:tightenco/symposium.git’, ‘(fetch)’]
The next command,
Now, we use the sed command to modify the text to make it a GitHub URL.
The final awk command filters out any non-GitHub URLs. This is usually only applicable if you have multiple remotes configured in your repo and one of them is not a GitHub remote.
We have now generated the GitHub URL for the remote repository regardless of whether the repository was cloned using SSH or HTTPS.
Grab the Local Branch Name ( branch_name )
We need to get the local branch name so we know which branch we’re going to compare in the pull request.
By running git symbolic-ref HEAD we get the full reference for the current branch we’re on. The result looks something like:
We need to explode that string by using / as a delimiter, which would give us an array-like structure of [‘refs’, ‘heads’, ‘main’] and grab the 3rd item.
We can do this by using the cut command. -d»/» sets the delimiter and -f 3 grabs the 3rd item.
However, sometimes I namespace my branches with my initials like jas/some-feature . So in order for this command to work with that naming structure, I need to use -f 3,4 which grabs everything between the 3rd and 4th item. Feel free to adjust that according to your workflow.
Generate Pull Request Compare URL ( pr_url )
Next, we need to generate the URL that will allow us to create the Pull Request. I have it hard-coded to merge into the remote main branch, but you can modify that if you like.
This command constructs the full URL for the pull request using the GitHub base URL and branch name we generated in the previous commands. It sets that value to the variable pr_url .
The open command automatically opens that URL in your browser. Visiting this URL will open the «Comparing changes» page and all you have to do is click «Create pull request» to write your notes. No need to select specific branches.

But we’re not done yet. We still need to publish our branch before it can even be compared. That’s where the gpr() function comes in.
Publish Branch to Remote First
gpr() is a simple function that will publish your local branch to the remote by using git push origin HEAD .
If that command succeeds, then openpr() is called, otherwise, it displays an error that the branch could not be published.
And that’s it. Now you can use the gpr command straight from your command line to automatically open a page to compare two remote branches and start the Pull Request process automatically!