Для начала разберем что такое репозиторий, Git и GitHub.
Сначала немного теории:
Git — это такой способ хранения файлов и их версий. Git позволяет смотреть историю изменений файлов, кто какие дополнения и когда вносил, как развивался проект, кто что в него добавлял и почему.
Главная особенность Git — он помнит всё, что вы в него внесли, и может показать, какие именно строчки кода вы правили несколько лет назад, когда что-либо исправляли или добавляли.
На базе Git есть сервис GitHub. Работает так:
- все рабочие файлы проекта синхронизируются между облаком и вашим компьютером;
- такая синхронизация происходит у каждого участника проекта;
- можно настроить автоматическую синхронизацию, а можно отправлять изменения вручную;
- можно отправить на сервер изменения, которые сделали вы на своём компьютере, а можно наоборот — скачать себе те, которые внесли в проект другие программисты.
Это полезно, например, когда несколько человек параллельно разрабатывают совместный проект. Каждый работает над своим файлом или даже своим куском одного файла. Всю работу авторы синхронизируют между собой: чтобы не было ситуации, что два человека редактируют один и тот же файл, а потом затирают результаты работы друг друга, сами того не зная.
Что такое репозиторий (git repository)
Гит-репозиторий — это облачное хранение вашего проекта на сервере (например, на сервере GitHub, но можно и на другом).
У каждого программиста может быть сколько угодно репозиториев, по одному на каждый проект. А можно вести все проекты в одном репозитории, но тогда это превратится в кашу.
В репозитории могут храниться:
- файлы с исходным кодом проекта;
- базы данных;
- картинки и графики;
- текстовые файлы;
- и всё остальное, что нужно проекту для работы.
Что такое бранч (git branch)
Бранч — это ветка или копия проекта, в которую можно вносить любые изменения и они не повлияют на основной проект.
В гит-репозитории всегда есть как минимум один бранч, который называется master. Если не создавать других веток, то все изменения будут сразу идти в главную ветку проекта. Для очень маленьких или учебных проектов это терпимо, но в любом коммерческом коде поступают иначе: создают ветки.
Дело в том, что ветка master используется для выпуска новых версий проекта, которые будут доступны всем. То, что добавляется в мастер-бранч, сразу становится доступно пользователям.
Давайте представим такую ситуацию: мы создали сайт и заказчик хочет срочно добавить какой-то раздел. Тут два пути решения. Первый - править рабочие файлы проекта «по живому», чтобы сразу видеть результат. А второй - можно сделать из мастера отдельную ветку news и работать уже в ней. В этом случае мы получим полную копию проекта, в которую можно вносить любые правки и они никак не повлияют на запущенный сайт. Мы в этой ветке делаем все, что нужно клиенту, показываем ему результат на секретном сайте, а потом объединяем ее с мастером. Это называется «смержить бранчи».
Что такое клонирование (git clone)
Клонирование — это когда вы копируете репозиторий себе на жесткий диск. Это нужно, чтобы начать в нем что-то менять.
Но в чем разница с простым копированием? При клонировании вместе с файлами проекта также “скачивается” вся история версий, все ветки, вся историю работы. И если кто-то дальше будет вносить изменения в проект, благодаря этим данным вы сможете тоже их получить. А при копировании нужных файлов с чужого компьютера никаких историй и никаких связей не сохранится. Синхронизации не будет. Просто какие-то файлы.
Что значит «смержить» (git merge)
Смержить (от англ. merge — объединять, совмещать) — это когда мы отправляем все, что сделали в одной ветке, в другую. Весь новый код, исправления ошибок, дополнительные функции — всё это отправится в новую ветку. Если же мы что-то удалим в коде, то при объединении этот фрагмент тоже удалится из основной ветки.
Получается, что схема работает так:
- Запускаем в мастере рабочий код с первой версией сайта, которая автоматически отправляется в продакшен (на сборку).
- Создаем новую ветку на основе мастера.
- В этой новой ветке пишем новый код, который добавит интерактивные функции на сайт.
- Тестируем эту ветку как отдельный проект.
- Если всё в порядке — смерживаем ее в мастер и получаем сразу готовую сборку сайта с новыми возможностями.
Что такое коммит (git commit)
Программировать только в облаке неудобно — проще скачать себе на компьютер весь проект и писать код на своей машине. Но чтобы правки увидели остальные, их нужно отправить обратно в репозиторий. Это и есть коммит.
Коммитить можно и один файл, и сразу несколько. Система сама найдет, что изменилось в каждом файле, и добавит эти изменения в проект. Но все эти правки внесутся в репозиторий за один раз, потому что при коммите обрабатываются сразу все добавленные в список файлы.
Единственное требование к коммитам — указывать, что именно вы поменяли в проекте, человеческим языком. Хорошим тоном и правильным подходом считается писать, что именно вы изменили: «Добавил цвет и стили основной кнопки», «Убрали метод вызова старого API», «Сделали рефакторинг функции SetOutOfDate ()». Это описание будут читать другие разработчики.
Коммитить можно хоть после правки каждой строчки — весь вопрос в том, насколько нужна такая детализация в проекте. Но иногда и изменения из одной строчки можно закоммитить, если оно действительно важное.
Что такое пуш- и пулл-реквесты (git push, git pull)
Чтобы отправить данные из своего проекта на сервер, используют пуш-реквесты. Для этого программист указывает имя ветки, в которую хочет отправить свой код, а сервер их принимает, проверяет и добавляет к себе.
Иногда бывает так, что сервер отказывает в пуш-реквестах, потому что у программиста на компьютере была неактуальная ветка. За то время, пока он писал свои правки, другие программисты сделали несколько изменений, закоммитили их у себя и отправили на сервер. Получилось, что у одних эта ветка осталась свежей и актуальной, а у других она устарела. Чтобы не принимать пуш-реквесты из устаревших веток, гитхаб просит сначала обновить данные у себя на комьютере с помощью пулл-реквеста.
Пулл-реквест работает просто: он скачивает с сервера актуальную версию ветки и добавляет код оттуда вам на компьютер. Иногда этот код вступает в противоречие с тем, что уже успел сделать программист, и тогда возникает конфликт — нужно принять решение, какая версия одинакового кода останется в проекте, а что нужно будет убрать.
Чем коммит отличается от пуш-реквеста
Коммит — это когда вы фиксируете изменения в проекте, как бы подводите итог своей работе.
Пуш — это когда вы отправляете сделанную работу туда, где хранится копия вашего кода.
Получается, последовательность действий такая:
- Вы подключаетесь к репозиторию и клонируете его.
- Делаете себе новую ветку.
- Перед началом работы делаете пулл, чтобы забрать актуальную версию файлов.
- Пилите в своей ветке то, что вам нужно.
- Когда работа сделана, вы ее коммитите.
- Чтобы отправить ее другим ребятам, вы ее пушите.
- Когда работу одобряют и перепроверяют, вашу ветку мержат (сливают, склеивают) с мастер-веткой.
С теорией разобрались, переходим к практике: создадим свой собственный репозиторий.