Код в чужой репозиторий или помогаем другу

Рассмотрим как нам присылать код в чужой репозиторий и как мы можем помогать другим в сервисе контроля версий Git.

Мы не можем просто так клонировать чужой проект, внести изменения и запушить их в чужой репозиторий, т.к. изменения могут попасть в проект только с согласия автора.

Для начала нам нужно «форкнуть» (от слова «форк» — fork) проект к себе в Гитхаб. И тогда, в свою копию, можно будет пушить изменения.

Форк — это копия репозитория, которым вы управляете. Форки позволяют вносить изменения в проект, не затрагивая исходный репозиторий. Вы можете получать обновления из исходного репозитория или отправлять изменения в него с помощью pull requests (пулл реквесты или, дословно, — запросы на вытягивание).

Открываем в GitHub нужный нам проект, репозиторий. И находим кнопку Fork.

Теперь у нас в Гитхабе есть полная копия данного проекта со всеми коммитами и ветками. Также теперь можно клонировать любой репозиторий, но пуш можно делать будет только в свой проект, а не в проект с которого сделан форк.

Сначала мы клонируем репозиторий командой:

$ git clone git@github.com:sergeiermilov/markdown-doc.git

После чего проверяем, так называемые ремоуты:

$ git remote -v

Получаем примерно такой ответ:

Теперь мы можем спокойно работать над проектом. После того как мы закончим работу и внесем нужные изменение мы сможем сформировать запрос на вливание или pull request.

Сначала мы делаем пуш (пример):

$ git push -u origin share-icons

Флаг -u обозначает upstream, устанавливает связь между локальной веткой и удаленной.

Дальше мы переходим в GutHub и видим, что гитхаб видит наш пуш и предлагает сделать pull request. Мы жмем зеленую кнопку Compare & Pull Request.

Дальше мы должны заполнить форму — что было сделано и зачем — заголовок и описание. Ниже в этом же окне мы можем посмотреть разницу между ветками, так называемый diff или дифф (от слова — difference — разница).

Жмем кнопку Create Pull Request:

Теперь можно сказать, что пулл риквест открыт. Автор изначального репозитория, с которого мы делали форк, сможет посмотреть изменения и принять их или отклонить.

Открытые pull request всегда показывают актуальную разницу между ветками.

Важно понимать, что форк на Github не синхронизирован с оригиналом автоматически. Но что если в оригинальном репозитории производились какие-либо изменения?

Нужно к себе добавить ремоуты (от англ. — remote). Мы должны зайти в оригинальный репозиторий и скопировать SSH-адрес.

Теперь мы можем ввести локально такую команду:

$ git remote add <rep_name> <ssh_address>

Где <rep_name> — имя репозитория (вы назначаете сами), а <ssh_address> — скопированный SSH-адрес.

Далее переключаемся в master:

$ git checkout master

И забираем изменения:

$ git pull <rep_name> master

Теперь можно это всё отправить в свой Гитхаб:

$ git push origin master

Бывают ситуации, когда появляется конфликт между изменениями pull request и изменениями в оригинальном репозитории. Это происходит если автор оригинального репозитория внес какие-то изменения в ветку master. Сообщение о конфликте мы увидим на странице пулл риквеста.

Этот кофликт очень похож на конфликт, который мы разбирали в уроке про конфликты при слиянии веток или мёрдже.

Конфликт можно решить у себя. Для этого мы должны влить изменения мастера автора к себе и внести изменения у себя локально. После этого, если мы сделаем push, то конфликт должен исчезнуть и можно будет сделать pull request.

Коротко весь процесс выглядит так: Fork -> Внесение изменений -> Pull Request. При этом на Гитхабе можно форкнуть любой публичный репозиторий.

Итак, если есть репозиторий с которым нужно будет работать в компании, то сперва мы должны его скопировать, т.е. сделать форк. Таким образом у нас будет полная копия репозитория и она будет полностью принадлежать нам.

С этим своим репозиторием мы можем теперь спокойно работать и вносить в него изменения.

Далее нам нужно его (форк) клонировать на свою локальную машину.

Схематично во время обучения в HTMLAcademy процесс выглядел так:

Или так немного нагляднее:

Т.е. мы сделали форк и дальше клонируем репозиторий на локальный компьютер:

Далее мы создаем отдельную ветку:

В этой ветке мы вносим нужные нам изменения, далее индексируем изменения и делаем коммит.

Дальше, мы делаем пуш, т.е. отправляем изменения на Гитхаб:

После чего GitHub предложит сделать pull request.

Что делаем дальше, если дается новое задание? Возвращаемся в Git и переключаемся на ветку master.

Дальше нужно установить связь (ремоут) не только с личным репозиторием, но и с репозиторием от которого делали форк.

Как видим на скриншоте — у нас есть ремоут только с личным репозиторием.

Добавим основной репозиторий:

Эту команду мы уже использовали выше:

$ git remote add <rep_name> <ssh_address>

Как видим, у нас теперь есть дополнительные ремоуты:

Теперь обновляемся и делаем pull изменений:

Делаем pull из основного репозитория. И теперь сможем работать и вносить изменения на локальной машине.