Git: что это, как он работает и чем отличается от GitHub’a

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. Все свои собственные проекты я храню именно там, потому что это:

  1. Удобно
  2. Бесплатно

Если вы не хотите чтобы ваш код смотрели другие люди, Bitbucket — ваш выбор. В остальных случаях — GitHub.

Я не упомянул многих вещей.

  • Git не придумали с нуля, до него были другие системы (CVS, Subversion). Но сейчас все пользуются гитом, поэтому про другие даже знать не нужно, не засоряйте себе голову.
  • Конфликты при мерджинге. Если два разработчика создали себе ветки и работали над одним и тем же кодом, их версии могут конфликтовать. Допустим один из них стер строку, а второй изменил в этой же строке один символ. Тогда придется вручную разрешать конфликт. Для этого тоже существуют специальные инструменты.

Не буду рассказывать много информации за один раз — слишком сложно для восприятия. Продолжу в следующих постах. И да, если у вас есть ко мне какие-либо вопросы — пишите в личку, будем разбираться.

Report Page