Основная идея: Распределенная система контроля версий

Git, и, следовательно, GitHub, использует распределенную систему контроля версий. Это отличается от более старых, централизованных систем. Вот в чем разница:

  • Централизованная (как в старых системах): Существует одна единственная главная копия кода на центральном сервере. Все “получают” (check out) код с этого сервера, вносят изменения, а затем “фиксируют” (commit или check in) свои изменения обратно на центральный сервер.

  • Распределенная (как в Git): У каждого есть полная копия всей истории проекта на своем собственном компьютере (их локальный репозиторий). Часто есть центральный сервер (как на GitHub), но это просто еще одна копия, а не единственная.

Push и Pull в распределенном мире

Поскольку у каждого есть своя собственная копия, действия выполняются относительно вашего репозитория и удаленного репозитория (часто на GitHub):

  • Push: Вы отправляете (push) изменения из вашего локального репозитория в удаленный репозиторий. Вы отправляете свои изменения вверх на сервер. Вы были правы в общей идее отправки (pushing).

  • Pull: Вы получаете (pull) изменения из удаленного репозитория в ваш локальный репозиторий. Вы загружаете изменения вниз на свой компьютер.

Почему тогда “Pull Request”?

“Pull request” (запрос на включение) - это не о том, что вы получаете (pull) что-то в свой локальный репозиторий. Речь идет о том, чтобы попросить кого-то другого (лидера проекта) включить (pull) ваши изменения в их репозиторий (который обычно является основной, официальной версией проекта).

Вот рабочий процесс:

  1. Fork (если необходимо): Если у вас нет прав на запись в основной репозиторий, вы сначала делаете его форк (fork). Это создает вашу собственную копию репозитория на GitHub (еще один удаленный репозиторий).

  2. Clone: Вы клонируете (clone) либо основной репозиторий, либо свой форк на свой локальный компьютер. Это создает вашу локальную копию.

  3. Create a Branch: Вы создаете ветку (branch) в своем локальном репозитории. Это похоже на отдельное рабочее пространство для ваших изменений, чтобы вы не испортили основную кодовую базу.

  4. Make Changes: Вы вносите свои изменения (добавляете функции, исправляете ошибки и т. д.) в своей ветке.

  5. Commit: Вы фиксируете (commit) свои изменения в своей локальной ветке. Это сохраняет “снимок” (snapshot) вашей работы.

  6. Push: Вы отправляете (push) свою ветку из своего локального репозитория в свой удаленный репозиторий (либо в свой форк, либо, если у вас есть права на запись, в основной репозиторий).

  7. Create Pull Request: Вы создаете запрос на включение (pull request) на GitHub. Это запрос к сопровождающим основного репозитория. Вы, по сути, говорите: “Эй, я внес эти изменения в свою ветку. Пожалуйста, включите (pull) их в вашу основную ветку”.

  8. Review: Владелец проекта просматривает ваш код, могут предложить изменения и обсудить с вами запрос на включение.

  9. Merge: Если ваши изменения одобрены, они сливают (merge) ваш запрос на включение. Это интегрирует ваш код из вашей ветки в основную ветку основного репозитория.