Модуль 1 · Что такое контроль версий

Справочник по Git и GitHub · модуль 1 · что такое контроль версий

Глава 1.2

1.2

Git и GitHub:
кто что делает

Git — программа на вашем компьютере, GitHub — сайт, на котором хранят копию репозитория. В главе разобрано, что делает каждый из них, что работает без интернета и чем можно заменить GitHub.

Категория
История и основные понятия
Уровень
Начальный
Связанные темы
Откуда взялся Git, удалённые репозитории
Зачем это знать
Понимать, где выполняется каждое действие и что от чего зависит

§1Откуда берётся путаница

«Залил работу на гит», «скачай с гита», «у меня гит не открывается» — во всех трёх фразах речь про сайт GitHub, а названа программа Git. Знакомство обычно начинается с сайта: человек регистрируется на GitHub, создаёт репозиторий, получает ссылку и называет всё это словом «гит».

Разница видна в трёх случаях. Без интернета работать с Git можно, а с GitHub нельзя. Если удалить репозиторий на сайте, история на диске останется. Без входа в аккаунт коммиты всё равно создаются.

§2Git: программа на вашем компьютере

Git устанавливается как обычная программа и запускается локально. Он следит за одной папкой — той, в которой вы создали репозиторий, — и хранит её историю в скрытом каталоге .git внутри этой же папки.

Git делает у вас на диске:

  • записывает коммиты — сохранённые состояния проекта с автором, датой и пояснением;
  • показывает, какие строки изменились с прошлого коммита;
  • создаёт ветки и объединяет их, в том числе с разбором конфликтов;
  • возвращает файлы к любому сохранённому состоянию;
  • ищет, в каком коммите появилась конкретная строка.

Ассоциация: черновик и чистовик

В жизни

Вы правите текст в черновике, а в чистовик переносите только то, что считаете готовым. Перенесённое датируется и больше не меняется — если нужна правка, делается следующая запись.

В Git

Черновик — файлы в папке проекта, их можно править как угодно. Коммит — перенос в чистовик: состояние получает автора, дату и пояснение и остаётся в истории.

Где не совпадаетЧистовик один и растёт вперёд. В Git чистовиков может быть несколько параллельных — это ветки, и любую из них можно потом слить с остальными.

Для всего перечисленного не нужны ни интернет, ни аккаунт, ни регистрация. Для Git GitHub — это адрес, по которому лежит ещё одна копия репозитория.

На полях: где лежит история

Если включить показ скрытых файлов, в папке проекта виден каталог .git. В нём хранятся все коммиты. При копировании папки проекта вместе с .git переносится вся история. Если удалить .git, останутся только текущие файлы без прошлых версий.

§3GitHub: сайт с копией репозитория

GitHub — веб-сервис, принадлежащий Microsoft. Он хранит копию вашего репозитория на своих серверах и отдаёт её по запросу. Остальные возможности добавлены сервисом, в Git их нет.

Что добавляет сервис:

  • страницу проекта, где код виден в браузере, без установки программ;
  • задачи (Issues) с метками, исполнителями и обсуждением;
  • pull request — предложение внести изменения, с ревью и замечаниями к конкретным строкам;
  • права доступа: кто может читать, кто писать, кто менять настройки;
  • канбан-доски в Projects, автоматические проверки в Actions, публикацию сайта через Pages.

В Git этих возможностей нет. Pull request, метки и доски относятся к сервису и на работу Git не влияют.

§4Кто что делает: таблица

Где выполняется каждое действие:

ДействиеGitGitHub
Создать репозиторий в папке проекта
Сделать коммит
Посмотреть, что изменилось со вчерашнего дня
Создать ветку и слить её обратно
Вернуть файл к прошлому состоянию
Отправить коммиты в общую копию
Открыть код в браузере с телефона
Завести задачу и назначить исполнителя
Предложить правку через pull request
Обсудить конкретную строку кода
Дать доступ другому человеку
Опубликовать сайт на Pages

Строка «отправить коммиты» отмечена в обеих колонках: команду выполняет Git, а принимает и сохраняет её сервис. В этом действии участвуют оба.

§5Как они соединяются

Где всё это лежит

Проект существует в двух местах. Первое — папка проекта на диске. В ней лежат ваши файлы и скрытая папка .git: её создаёт команда git init, в ней хранится вся история.

Папка проекта на диске · показаны скрытые файлы

moy-proekt/папка, которую вы открыли в VS Code
  ├── README.mdваш файл
  ├── privet.txtваш файл
  └── .git/репозиторий: вся история проекта, 40 служебных файлов
      ├── objects/сохранённые состояния файлов и коммиты
      ├── refs/ветки: в каждом файле имя одного коммита
      ├── HEADна какой ветке вы сейчас
      └── configнастройки этого репозитория, в том числе адрес origin

Точка в начале имени означает, что папка скрытая: в проводнике и в Finder её не видно, пока не включён показ скрытых файлов. Содержимое .git разобрано в третьем модуле.

Это проверяется командой в терминале: она показывает содержимое папки вместе со скрытым:

Терминалчто лежит в папке проекта
ls -a
Выводрядом с файлами — папка .git
.        ..        .git        README.md        privet.txt

Второе место — тот же проект на GitHub. Файлы те же, папки .git в списке нет — сервис хранит историю у себя и показывает её вкладками сверху.

Страница репозитория на GitHub: список файлов без папки .git
Страница репозитория этой книги. В списке — index.html, styles.css, папка temy. Папки .git здесь нет: её содержимое сервис разобрал и показывает как историю, ветки и вкладку Commits.

В настройках репозитория Git хранит список удалённых репозиториев — адреса копий, с которыми вы обмениваетесь коммитами. У первого такого адреса принято имя origin; это короткое имя, которое заменяет ссылку.

ВАШ КОМПЬЮТЕР папка проекта .git — вся история коммиты, ветки, откаты работают без сети GITHUB · origin копия репозитория задачи, PR, доски доступ для других людей нужен интернет push pull
Коммиты создаются слева, на компьютере, и хранятся там. Команда push отправляет накопленные коммиты в копию на сервисе, pull забирает оттуда чужие. В VS Code обе операции выполняет кнопка Sync Changes в панели Source Control.

Ассоциация: общий доклад и своя папка

В жизни

Вы пишете свою часть доклада у себя на компьютере и правите её сколько угодно — группа этого не видит. Когда часть готова, вы кладёте её в общую папку. Там же появляются части других людей, и вы забираете их себе, чтобы собрать доклад целиком.

Пока файл не положен в общую папку, остальные его не видят.

В Git

Правки и коммиты — работа у себя. push кладёт накопленные коммиты в общую копию на GitHub, pull забирает оттуда чужие. В VS Code обе операции выполняет кнопка Sync Changes.

Пока не выполнен push, остальные ваших коммитов не видят.

Где не совпадаетВ общей папке новый файл затирает старый. Git ничего не затирает: он добавляет ваши коммиты к чужим и, если двое правили одну строку, останавливается и спрашивает, какой вариант оставить.

Пока не нажата кнопка Sync, новых коммитов на GitHub нет. Они лежат только на вашем диске, и при отказе диска восстановить их неоткуда.

Зачем различать это в работе

  • Понимать, где искать поломку. «Не отправляется» и «не коммитится» — разные неисправности: первая про сеть, доступ и аккаунт, вторая про Git на компьютере. От этого зависит, что проверять: сеть или настройки Git.
  • Не терять работу. Коммит хранит состояние на диске, отправка — переносит его на сервер. Пока не нажата кнопка Sync, резервной копии нет: при отказе диска теряется всё, что сделано после последней отправки.
  • Менять место хранения без переделок. Компания переезжает с GitHub на GitLab или на свой сервер — код и история переносятся как есть. Переделывать придётся только то, что принадлежит сервису: задачи, доски, права доступа.
  • Работать там, где нет сети. В поезде, на площадке заказчика, без интернета работа продолжается: коммиты копятся локально и уходят на сервер одной кнопкой, когда связь появится.

На собеседованиях вопрос «чем Git отличается от GitHub» задают, чтобы проверить понимание этого различия.

§6Что работает без интернета

Что работает без сети:

СитуацияРаботаетНет
Сделать коммит в поезде без связи
Посмотреть историю за прошлый месяц
Создать ветку и переключиться на неё
Вернуть файл к состоянию трёхдневной давности
Отправить коммиты на GitHub
Открыть задачу или pull request
Скачать чужой проект в первый раз

Отсюда порядок работы: коммиты делают по ходу работы, отправляют их, когда есть сеть.

§7Откуда взялся GitHub

Git появился в 2005 году, а сервис вокруг него — через три года. Он избавил от настройки собственного сервера для публикации репозитория.

2008запуск
GitHub открывается для всех

Крис Ванстрат, Том Престон-Вернер и Пи Джей Хайетт делают сайт, где репозиторий Git размещается без настройки сервера. Сервис ввёл pull request — способ предложить чужому проекту правку и обсудить её.

2008Pages
Сайт из репозитория

Появляется GitHub Pages: страницы проекта публикуются из той же ветки, где лежит код. Так опубликован этот справочник.

2018Microsoft
Покупка за 7,5 млрд долларов

Microsoft покупает GitHub. Руководителем становится Нат Фридман. Бесплатные приватные репозитории, которые раньше стоили денег, открывают для всех.

2019Actions
Автоматические проверки

GitHub Actions запускает сборку и тесты при каждом изменении. Отдельный сервер для этого больше не нужен; подробности — в седьмом модуле.

2023масштаб
Больше 100 миллионов пользователей

По данным самого сервиса, на нём зарегистрировано свыше ста миллионов разработчиков. GitHub — крупнейшая из таких площадок.

Крис Ванстрат, сооснователь GitHub
Сооснователь

Крис Ванстрат

Один из основателей GitHub и его руководитель до 2018 года. Сервис начинался как побочный проект нескольких программистов, которые не хотели настраивать серверы для репозиториев.

Фото: Dave Fayram, CC BY 2.0 · Wikimedia Commons
Том Престон-Вернер, сооснователь GitHub
Сооснователь

Том Престон-Вернер

Придумал название и участвовал в запуске сервиса в 2008 году. Он же автор генератора сайтов Jekyll, на котором долго работал GitHub Pages.

Фото: Tim Bray, CC BY-SA 3.0 · Wikimedia Commons

GitHub — коммерческий продукт конкретной компании. Компания может менять правила, тарифы и внешний вид сервиса. На Git и на репозиторий на вашем диске это не влияет.

§8Другие сервисы для репозиториев

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

GitHubGitHub · Microsoft
GitLabGitLab · можно свой сервер
BitbucketBitbucket · Atlassian
GiteaGitea · лёгкий, свой
CodebergCodeberg · некоммерческий

Логотипы: GitHub — MIT; GitLab — MIT; Bitbucket — Atlassian, общественное достояние; Gitea — MIT; Codeberg — CC0. Источник — Wikimedia Commons.

Сервис не обязателен. Общей копией может быть папка на сетевом диске, репозиторий на арендованном сервере или флешка — Git умеет обмениваться коммитами и так. Поэтому говорят «репозиторий размещён на GitHub».

На полях: почему в курсе используется GitHub

На нём лежит большинство открытых проектов, он бесплатен для небольших проектов, поддерживается Visual Studio Code без настройки и даёт всё, что нужно курсу: задачи, pull request, доски и публикацию сайта. На других сервисах команды Git те же.

§9Разбор привычных фраз

Что стоит за привычными фразами и как сказать точнее:

«Залил работу на гит»

Что произошлоКоммиты отправлены командой Git в копию репозитория на GitHub. Точнее: «отправил коммиты на GitHub» или «сделал push».

«Скачай проект с гита»

Что произошлоРечь про клонирование репозитория с GitHub. Точнее: «склонируй репозиторий с GitHub».

«У меня гит не открывается»

Что произошлоНе открывается сайт: пропал интернет или лежит сервис. Git на компьютере при этом работает, коммиты делать можно.

«Сохрани на гитхаб, чтобы не потерялось»

Что произошлоСначала нужен коммит — иначе отправлять нечего. Порядок такой: сохранить файлы, сделать коммит, нажать Sync.

§10Частые заблуждения

Обычно думаютБез аккаунта на GitHub пользоваться Git нельзя.
На самом делеGit ставится и работает без регистрации. Аккаунт нужен только для того, чтобы хранить копию на сервисе и работать вместе с другими.
Обычно думаютУдалил репозиторий на GitHub — потерял проект.
На самом делеПолная копия истории осталась на вашем диске, в папке .git. Проект можно разместить заново на GitHub или в другом месте.
Обычно думаютPull request — это возможность Git.
На самом делеPull request придуман сервисами. В Git есть ветки и слияние, а обсуждение правки с ревью и кнопкой «влить» добавляет GitHub.
Обычно думаютФайлы на сайте и файлы на компьютере — это одно и то же.
На самом делеЭто две копии. Они совпадают только после отправки и получения изменений; между этими действиями расходятся.

§11Проверьте себя

Интернет пропал на весь день. Что из работы с репозиторием останется доступным?

Всё, кроме обмена с сервисом: коммиты, просмотр истории, ветки, слияния, откаты к прошлым состояниям. Не сработают отправка коммитов, получение чужих изменений, клонирование нового проекта и любые действия на сайте — задачи, pull request, доски.

Что такое origin?

Имя удалённого репозитория — короткая замена его адресу. По традиции так называют первую удалённую копию, обычно ту, что на GitHub. Имя можно поменять, и удалённых копий может быть несколько.

Вы весь вечер делали коммиты, но не нажимали Sync. Что видно на GitHub?

Состояние на момент последней отправки. Коммиты вечера лежат только на вашем компьютере: пока не выполнен push, сервис о них не знает.

Чем pull request отличается от слияния веток в Git?

Слияние — операция Git: она объединяет две ветки на вашем компьютере. Pull request — страница на сервисе, где предложенное изменение обсуждают, просматривают построчно и одобряют, а слияние выполняется уже после этого. Без сервиса можно слить ветки, но нельзя обсудить правку в таком виде.

Верно ли, что перенос проекта с GitHub на GitLab требует всё переделывать?

Нет. Оба сервиса работают с одним и тем же Git: нужно добавить второй адрес удалённого репозитория и отправить туда коммиты. Переносить придётся не код, а то, что принадлежит сервису: задачи, доски, настройки доступа.

Объясните своими словами, почему фраза «программа написана на GitHub» неверна.

GitHub — место хранения репозитория и площадка для совместной работы. Программа написана на языке программирования в редакторе, а её история хранится в Git; GitHub держит копию этой истории и даёт к ней доступ другим людям.

§12Шпаргалка по главе

Git программа на компьютере коммиты, ветки, история работает без сети
GitHub сайт с копией репозитория задачи, PR, доски, Pages нужен интернет и аккаунт
Связь между ними origin — имя удалённой копии push — отправить коммиты pull — забрать чужие
Как говорить точно «отправил коммиты на GitHub» «склонировал репозиторий»

Итог главы

Git и GitHub — разные вещи с похожими названиями. Git хранит историю проекта на вашем диске и выполняет все операции с ней локально. GitHub хранит копию этой истории на своих серверах и добавляет то, чего в Git нет: задачи, pull request, права доступа, доски и публикацию сайта. Соединяет их список удалённых репозиториев: push отправляет коммиты в копию, pull забирает чужие. Сервис можно заменить другим, Git у всех таких площадок один. Следующая глава — установка Git и VS Code.

Откуда взяты факты
  1. История и возможности сервиса — статья «GitHub» в Википедии.
  2. Покупка компанией Microsoft за 7,5 млрд долларов, 2018 год — официальное сообщение Microsoft.
  3. Число пользователей сервиса — годовой отчёт GitHub Octoverse.
  4. Удалённые репозитории, push и pull — раздел «Работа с удалёнными репозиториями» книги Pro Git.
  5. Все изображения — Wikimedia Commons, лицензии указаны под каждым.
Глава 1.2 · Git и GitHub: кто что делает · Справочник по Git и GitHub Автор: Макаров Максим Николаевич