Рассмотрим как нам присылать код в чужой репозиторий и как мы можем помогать другим в сервисе контроля версий 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 из основного репозитория. И теперь сможем работать и вносить изменения на локальной машине.