Основная идея: Распределенная система контроля версий
Git, и, следовательно, GitHub, использует распределенную систему контроля версий. Это отличается от более старых, централизованных систем. Вот в чем разница:
-
Централизованная (как в старых системах): Существует одна единственная главная копия кода на центральном сервере. Все “получают” (check out) код с этого сервера, вносят изменения, а затем “фиксируют” (commit или check in) свои изменения обратно на центральный сервер.
-
Распределенная (как в Git): У каждого есть полная копия всей истории проекта на своем собственном компьютере (их локальный репозиторий). Часто есть центральный сервер (как на GitHub), но это просто еще одна копия, а не единственная.
Push и Pull в распределенном мире
Поскольку у каждого есть своя собственная копия, действия выполняются относительно вашего репозитория и удаленного репозитория (часто на GitHub):
-
Push: Вы отправляете (push) изменения из вашего локального репозитория в удаленный репозиторий. Вы отправляете свои изменения вверх на сервер. Вы были правы в общей идее отправки (pushing).
-
Pull: Вы получаете (pull) изменения из удаленного репозитория в ваш локальный репозиторий. Вы загружаете изменения вниз на свой компьютер.
Почему тогда “Pull Request”?
“Pull request” (запрос на включение) - это не о том, что вы получаете (pull) что-то в свой локальный репозиторий. Речь идет о том, чтобы попросить кого-то другого (лидера проекта) включить (pull) ваши изменения в их репозиторий (который обычно является основной, официальной версией проекта).
Вот рабочий процесс:
-
Fork (если необходимо): Если у вас нет прав на запись в основной репозиторий, вы сначала делаете его форк (fork). Это создает вашу собственную копию репозитория на GitHub (еще один удаленный репозиторий).
-
Clone: Вы клонируете (clone) либо основной репозиторий, либо свой форк на свой локальный компьютер. Это создает вашу локальную копию.
-
Create a Branch: Вы создаете ветку (branch) в своем локальном репозитории. Это похоже на отдельное рабочее пространство для ваших изменений, чтобы вы не испортили основную кодовую базу.
-
Make Changes: Вы вносите свои изменения (добавляете функции, исправляете ошибки и т. д.) в своей ветке.
-
Commit: Вы фиксируете (commit) свои изменения в своей локальной ветке. Это сохраняет “снимок” (snapshot) вашей работы.
-
Push: Вы отправляете (push) свою ветку из своего локального репозитория в свой удаленный репозиторий (либо в свой форк, либо, если у вас есть права на запись, в основной репозиторий).
-
Create Pull Request: Вы создаете запрос на включение (pull request) на GitHub. Это запрос к сопровождающим основного репозитория. Вы, по сути, говорите: “Эй, я внес эти изменения в свою ветку. Пожалуйста, включите (pull) их в вашу основную ветку”.
-
Review: Владелец проекта просматривает ваш код, могут предложить изменения и обсудить с вами запрос на включение.
-
Merge: Если ваши изменения одобрены, они сливают (merge) ваш запрос на включение. Это интегрирует ваш код из вашей ветки в основную ветку основного репозитория.