diff --git a/book/06-github/sections/2-contributing.asc b/book/06-github/sections/2-contributing.asc index 6e696a54..ce43d42e 100644 --- a/book/06-github/sections/2-contributing.asc +++ b/book/06-github/sections/2-contributing.asc @@ -36,12 +36,14 @@ GitHub разработан с прицелом на определённый р Вот как это обычно работает: -1. Создайте тематическую ветку от ветки `master`. -2. Зафиксируйте несколько изменений, улучшающих проект. -3. Отправьте эту ветку на GitHub. -4. Откройте запрос на слияние на GitHub. -5. Обсуждайте его, вносите изменения, если нужно. -6. Владелец проекта принимает решение о принятии изменений, либо об их отклонении. +1. Создайте форк проекта. +2. Создайте тематическую ветку на основании ветки `master`. +3. Создайте один или несколько коммитов с изменениями, улучшающих проект. +4. Отправьте эту ветку в ваш проект на GitHub. +5. Откройте запрос на слияние на GitHub. +6. Обсуждайте его, вносите изменения, если нужно. +7. Владелец проекта принимает решение о принятии изменений, либо об их отклонении. +8. Получите обновлённую ветку `master` и отправьте её в свой форк. Очень напоминает подход, описанный в главе <>, но вместо использования электронной почты, команда сотрудничает через веб-интерфейс. @@ -477,3 +479,63 @@ image::images/markdown-08-drag-drop.png[Перетаскивание карти Если вернуться немного назад к <>, то над областью редактирования вы увидите небольшую подсказку ``Parsed as Markdown''. Нажав не неё, вы получите полную подсказку по использованию GitHub разметки. + +[[r_fetch_and_push_on_different_repositories]] +==== Поддержание GitHub репозитория в актуальном состоянии + +После создания форка, ваш репозиторий будет существаовать независимо от оригинального репозитория. +В частности, при появлении в оригинальном репозитории новых коммитов GitHub информирует вас при помощи сообщения: + +[source,text] +---- +This branch is 5 commits behind progit:master. +---- + +При этом GitHub никогда не обновляет ваш репозиторий -- это вы должны делать сами. +К счастью, это очень просто сделать. + +Первый способ не требует конфигурации. +Например, если вы сделали форк репозитория `https://github.com/progit/progit2.git`, то обновить ветку `master` можно следующим образом: + +[source,console] +---- +$ git checkout master <1> +$ git pull https://github.com/progit/progit2.git <2> +$ git push origin master <3> +---- + +<1> Если вы находитесь на другой ветке -- перейти на `master`. +<2> Получить изменения из репозитория `https://github.com/progit/progit2.git` и слить их с веткой `master`. +<3> Отправить локальную ветку `master` в ваш форк `origin`. + +Каждый раз писать URL репозитория для получения изменений достаточно утомительно. +Этот процесс можно автоматизировать за счёт указания следующей конфигурации: + +[source,console] +---- +$ git remote add progit https://github.com/progit/progit2.git <1> +$ git branch --set-upstream-to=progit/master master <2> +$ git config --local remote.pushDefault origin <3> +---- + +<1> Добавить исходный репозиторий как удалённый с другим именем. + Здесь выбрано имя `progit`. +<2> Настроить локальную ветку `master` на получение изменений из удалённого репозитория `progit`. +<3> Установить `origin` как репозиторий по умолчанию для отправки. + +После этого, процесс обновления становится гораздо проще: + +[source,console] +---- +$ git checkout master <1> +$ git pull <2> +$ git push <3> +---- + +<1> Если вы находитесь на другой ветке -- перейти на `master`. +<2> Получить изменения из `progit` и слить их с веткой `master`. +<3> Отправить локальную ветку `master` в ваш форк `origin`. + +Данный подход не лишён недостатков. +Git будет молча выполнять указанные действия и не предупредит вас в случае, когда вы добавили коммит в `master`, получили изменения из `progit` и отправили всё вместе в `origin` -- все эти операции абсолютно корректны. +Поэтому вам стоит исключить прямое добавление коммитов в ветку `master`, поскольку эта ветка фактически принадлежит другому репозиторию.