среда, 28 ноября 2012 г.

Работа с GitHub

Если вы работаете над проектом в GitHub, то вы можете просто ответвить  проект (fork) в ваш GitHub-репозиторий или создать новый репозиторий под вашим именем. После того, как вы внесете изменения в вашем GitHub-репозитории, вы можете послать запрос на добавление (pull) изменений в GitHub-репозитории других пользователей, уведомив их о внесенных вами изменениях, после чего они смогут добавить (pull) ваши изменения в свои репозитории.

Для примера форкнем проект ClickToFlash. Перейдите в проект по адресу http://github.com/rentzsch/clicktoflash и кликните на кнопку "Fork". После этого копия данного проекта появится в вашем GitHub-репозиторий (например http://github.com/lapcat/clicktoflash). Теперь вам необходимо клонировать код из вашего репозитория на ваш локальный компьютер. Убедитесь в том, что вы клонируете SSH-версию. Если вы клонируете read-only версию, тогда вы не сможете добавлять (pull) изменения в ваш GitHub-репозиторий.

$ git clone git@github.com:lapcat/clicktoflash.git


Ваша частная локальная копия автоматически будет иметь master branch ветку, которая соответствует master branch ветке в ваше публичном репозитории на GitHub.

$ cd clicktoflash
$ git branch
* master
$ git status
# On branch master nothing to commit (working directory clean)

Ваш удаленный клонированный репозиторий дал особое имя origin вашему локальному клону репозитория.

$ git remote
origin

Локальная ветка master branch всегда отслеживает удаленный репозиторий на GitHub, поэтому команды git fetch, git pull и git push автоматически добавляются  в origin, когда запускается checked out в master ветке.

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:lapcat/clicktoflash.git
  Push  URL: git@github.com:lapcat/clicktoflash.git
  HEAD branch: master
  Remote branches:
    cutting-edge tracked
    master       tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Несмотря на тот факт, что локальный репозиторий является клоном origin, а origin - это форк (fork) из репозитория пользователя rentzsch, локальный репозиторий ничего не знает о rentzsch. Поэтому, если вы хотите добавить (pull) ваши изменения и репозитория rentzsch, то вы должны добавить (add) удаленный репозиторий. В этом случае вы можете использовать read-only URL, из-за того, что вы не можете передать изменения в репозиторий rentzsch напрямую.

$ git remote add rentzsch git://github.com/rentzsch/clicktoflash.git
$ git remote
origin
rentzsch

Некоторые люди предпочитают давать имя удаленному репозиторию upstream, но я нахожу это несколько запутывающим. Имя rentzsch говорит точно откуда приходят изменения. В отличии от имени upstream оно не абстрактно и его не спутаешь с origin.

Обратите внимание, что пока вы не используете опцию -f, удаленный репозиторий rentzsch автоматически не фетчится. Поэтому вам нужно фетчить (получать из него данные) вручную.

$ git branch rentzsch-master rentzsch/master
fatal: Not a valid object name: 'rentzsch/master'.
$ git branch -r
  origin/HEAD -> origin/master
  origin/cutting-edge
  origin/master
$ git fetch rentzsch
$ git branch -r
  origin/HEAD -> origin/master
  origin/cutting-edge
  origin/master
  rentzsch/1.4.2-64bit
  rentzsch/cutting-edge
  rentzsch/gh-pages
  rentzsch/master
$ git branch rentzsch-master rentzsch/master
Branch rentzsch-master set up to track remote branch master from rentzsch.

Я рекомендую создать вам ответвление branch для отслеживания форкнутого репозитория, как мы это сделали в последнуй инструкции выше. После этого будет не важно какие изменения вы сделаете, вы всегда сможете посмотреть "официальную" версию проекта, делая check rentzsch-master branch. Если вы используете удаленный rentzsch-master branch как стартовую точку для локального ответвления rentzsch-master, то локальный branch автоматически будет отслеживать удаленный репозиторий rentzsch, как если бы локальный master автоматически отслеживал удаленный origin.

$ git remote show rentzsch
* remote rentzsch
  Fetch URL: git://github.com/rentzsch/clicktoflash.git
  Push  URL: git://github.com/rentzsch/clicktoflash.git
  HEAD branch: master
  Remote branches:
    1.4.2-64bit  tracked
    cutting-edge tracked
    gh-pages     tracked
    master       tracked
  Local branch configured for 'git pull':
    rentzsch-master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

Когда изменения происходят в master branch удаленного репозитория rentzsch, то мы используем процедуру merge для слияния их:

$ git checkout rentzsch-master
$ git fetch
$ git merge rentzsch/master
$ git checkout master
$ git merge rentzsch-master
$ git push

Вы можете использовать одну команду git pull вместо двух git fetch и git merge rentzsch/master. Однако я слышал, что git pull иногда вызывает проблемы.

В любом случае, вы сперва делаете слияние (merge) удаленного репозитория rentzsch с локальной веткой rentzsch-master branch. Затем делаете слияние (merge) ветки rentzsch-master branch с локальной master branch и, наконец, добавляете (pull) локальные изменения в удаленный репозиторий origin. Эта процедура необходима, потому что вы не можете напрямую добавить изменения из удаленного репозитория rentzsch в origin. Они должны пройти через локальный репозиторий.

Никогда не записывайте код в локальный master branch, иначе все сломается. Оставляйте master чистым.

Когда вы хотите сделать локальные изменения, то всегда создавайте и делайте check out в новый branch, а затем делайте слияние (merge) изменений branch, в который вы хотите добавить изменения.

$ git branch rentzsch-cutting-edge rentzsch/cutting-edge
Branch rentzsch-cutting-edge set up to track remote branch cutting-edge from rentzsch.
$ git branch cutting-edge rentzsch-cutting-edge
$ git checkout cutting-edge
Switched to branch 'cutting-edge'

Комментариев нет:

Отправить комментарий