Git: что это, как он работает и чем отличается от GitHub’a
Как я стал программистомРебят, привет. Сегодня решил рассказать немного о системе контроля версий.
В университетские годы (первые 2) я писал код и хранил его на жёстком диске. Иногда я архивировал папку с проектом и создавал копии, чтобы сохранить временный результат лабораторки или попробовать другой подход. Как максимум — заливал архив с курсачём на дропбокс, делал бекап так сказать :D Групповой работы над проектами во время учёбы не было — один преподаватель обещал, но дальше слов его обещания не зашли.
Что такое git и как нужно работать я узнал уже на первой работе.
Я специально упростил все понятия, потому что умные определения вы можете и на википедии прочитать.
Git
Git — это система управления версиями. What?
Git — это пошаговая история разработки любой программы.
Писать программу — долго, это не делается за один присест. Вы работаете над ней каждый день и каждый день добавляете новый кусочек кода к уже существующему. Чтобы не запутаться во всей этой куче, придумали Git. Я упомянул, что в универе создавал архивы одного проекта и давал им «потрясающие» имена:
- “ProgramirovanieLaba1.zip”
- “ProgramirovanieLaba1(1).zip”
- “ProgramirovanieLaba1(2).zip”
Ну вы поняли. Вот каждый такой архив в гите называется комит. Комит — это изменения всех файлов с предыдущего раза. Если представить эти архивы в виде цепочки то получится следующее:
Все комиты принято визуализировать с помощью дерева. Есть ствол, от него отходят ветки. И на рисунке даже можно узнать какая у нас ветка — master. Вообще в данном случае ветка является главной, т.е. стволом. [Слово ствол никто не употребляет, не вздумайте его произнести во время собеседования.]
История идет снизу вверх. Верхний комит — последняя версия нашей программы. У комита есть описание, дата, автор, уникальный айди(хеш). Также слева показан граф. Сейчас он простой и последовательный, потому что у нас одна ветка.
Ветки
Ветка — это список последовательных комитов.
На данном этапе у внимательного читателя должен возникнуть вопрос “Зачем нужны ветки, если все и так красиво выходит с одной главной веткой?”
Да, другие ветки не нужны, если:
- вы работаете один на проекте
- вы уверены что код в комите правильный, протестированный, без багов на 100%
- закомиченный код сразу становится актуальным и последним и пользователю вашей программы больше не нужны предыдущие версии
Всё же, большинство разработчиков пользуется более чем одной веткой. Сейчас покажу как выглядел бы наш код со второй веткой:
Стало немного сложнее, но я объясню. У нас всё те же 3 комита с идиотскими названиями. Первый комит находится в ветке мастер — это главная ветка. А два других в ветке new-algorithm. Предположим, что мы захотели переписать часть нашей программы по-другому. Мы не уверены, получится ли это сделать. И в случае если не получится, мы хотим чтобы основная версия программы у нас осталась нетронутой. Для этого мы и создали новую ветку. В тоже время мы обнаружили критический баг в коде и хотим его пофиксить (исправить). Но сделать это нужно для основной ветки — мастер. Так появился комит fix. Теперь у нас две параллельные ветки, а в new-algorithm фикса нет. После этого мы понимаем, что второстепенная ветка эффективней справляется с задачей, над которой мы трудимся и хотим объединить код, чтобы второстепенный код стал основным.
Для этого мы вливаем (делаем мердж, merge) ветку new-algorithm в master. Выглядит это так:
Теперь у нас весь код в мастере. И на графе видно, что комит fix в мастере был раньше комита ProgramirovanieLaba1(1).zip, хотя по времени fix был создан позже.
Именно с помощью веток над проектом могут работать двое и больше человек. Они создают себе ветку, комитят в неё изменения, и когда заканчивают работать над функционалом — вливают свою ветку в мастер.
И это всё! ...почти всё.
Репозиторий
Хранится весь код в репозитории. Это специальное место, сервер, с которым вы коннектитесь, а потом скачиваете/обновляете на нём код проекта. Если вы заметили, на картинках было постоянно два названия веток: master и origin/master. Так вот, master — это тот, который хранится локально у вас на компьютере. Origin/master это тот мастер, который хранится на репозитории с названием origin. Да, всё действительно так просто. Ну и чтобы синхронизировать эти ветки между вашим компьютером и репозиторием есть специальные команды:
- pull (англ. тянуть) — скачать из репозитория в компьютер
- push (англ. толкать)—загрузить в репозиторий с компьютера
Мердж-реквест
Мердж-реквест это запрос на мерджинг ветки. Обычно он производится когда на проекте 2 и больше людей. Один из них закончил работу над таской, закомитил код в свою ветку. И потом через веб-интерфейс создает мердж-реквест. Весь этот процесс является ничем иным, как код-ревью. Он нужен, чтобы другой человек свежим взглядом посмотрел на код на момент нарушения стилей, гайдлайнов, багов и прочего. Ревьювящий просматривает код и если код проходит проверку, мерджит его в основную ветку. Если не проходит —автор мердж-реквеста и ревьювер решают что нужно изменить в коде.
GitHub
Самый популярный сайт для хранения репозиториев открытого типа (Open Source). То есть весь код и все проекты в нём видны любому желающему. Вы спокойно можете посмотреть код ядра линукс, языка Swift от Apple или Angular.js — самого популярного JavaScript фреймворка. За 10 долларов в месяц ваш репозиторий можно сделать приватным.
GitHub — очень удобный сервис, в котором важна взаимосвязь и общение между участниками. Если проект пользуется популярностью у комьюнити — создается много вопросов и багов в разделе issues, и нужно на них всегда отвечать :)
Bitbucket
Один из самых популярных сайтов для репозиториев от компании Atlassian. Все свои собственные проекты я храню именно там, потому что это:
- Удобно
- Бесплатно
Если вы не хотите чтобы ваш код смотрели другие люди, Bitbucket — ваш выбор. В остальных случаях — GitHub.
Я не упомянул многих вещей.
- Git не придумали с нуля, до него были другие системы (CVS, Subversion). Но сейчас все пользуются гитом, поэтому про другие даже знать не нужно, не засоряйте себе голову.
- Конфликты при мерджинге. Если два разработчика создали себе ветки и работали над одним и тем же кодом, их версии могут конфликтовать. Допустим один из них стер строку, а второй изменил в этой же строке один символ. Тогда придется вручную разрешать конфликт. Для этого тоже существуют специальные инструменты.
Не буду рассказывать много информации за один раз — слишком сложно для восприятия. Продолжу в следующих постах. И да, если у вас есть ко мне какие-либо вопросы — пишите в личку, будем разбираться.