Git: Быстрый старт
Что такое git?
git — VCS (version control system, система контроля версий). VCS — это способ избежать директорий с таким содержимым:
- main.cpp
- Копия Копия main.cpp
- Копия main (архив).cpp
- main (главная версия).cpp
- main июль 2016.cpp
- старый main.cpp
- main с комментами серёги.cpp
VCS позволяет смотреть в историю изменений, отменять изменения, делиться изменениями друг с другом и так далее.
Почти все программные проекты используют VCS, а тем, которые не используют, очень не повезло.
Почему git?
Существует много других VCS: Concurrent Versions System (CVS), Subversion (SVN), Mercurial (hg), Darcs, Pijul… Почему изучаем git? Ответ:
- Остальное и так понятно, можно не изучать.
- git используется повсюду.
Плюсы git:
- высокая производительность,
- возможность работы без централизованного сервера (изменения в ядре Linux пересылают буквально по электронной почте),
- стабильность.
Минусы git:
- для тех, кто не знает его внутреннего устройства: очень путающий интерфейс (шутка на тему: xkcd.com/1597),
- нечитаемая документация (шутка на тему: jenda.hrach.eu/f2/git-for-dummies.html),
- большое количество похожих команд; часто непонятно, как сделать что-то простое: stackoverflow.com/questions?sort=votes.
Термины
- Репозиторий (repository): Хранилище кода со всеми его версиями.
Пример: github.com/torvalds/linux — копия git-репозитория с ядром Linux на сервисе github. - Коммит (commit): Конкретное состояние кода. Если коммит не первый, то знает, какой был до него (какой у него “родитель”).
Пример: github.com/torvalds/linux/commit/0c52ec9513b309b250046fdb2c4c6c3726fa5cfb — коммит в Linux, который отличается от родительского исправленной опечаткой. - Сообщение коммита (commit message): Словесное описание коммита, которым автор поясняет, чем этот коммит отличается от родителя.
По стилю пишется в повелительном наклонении.
Пример: “Fix bug 2203”. - Граф коммитов (commit graph): У одного родительского коммита бывает несколько дочерних; у дочернего коммита бывает несколько родительских. Из-за этого история изменений — не цепочка коммитов, а сложная структура.
Как начать пользоваться?
- git init: создаёт репозиторий в текущей директории; git можно использовать вообще без сервера, никакого Github или Gitlab.
- git add файл1 файл2 файл3: говорит git, что в следующий коммит нужно включить изменения, внесённые в файлы файл1, файл2, файл3.
- git commit: говорит git, что надо создать новый коммит, включающий заданные изменения. Откроется текстовый редактор, куда надо написать commit message.
- git log: Печатает описание “нынешнего” коммита, его родителей, родителей родителей, родителей родителей родителей…
Без дополнительных флагов если коммит не является предком “нынешнего”, то не будет напечатан.
Ветки в git
Иногда хочется параллельно поддерживать несколько разных историй развития кода.
Пример: есть большой репозиторий. Над ним работает много людей параллельно: технические писатели пишут документацию, стажёры чинят маленькие баги, архитекторы переписывают половину системы. Все они хотят делать свои изменения параллельно, не мешая друг другу. Для этого в git есть ветки.
Пример: github.com/protocolbuffers/protobuf/commit/2c45deb8774a4ae876322020cbed6e2414824ec5 — коммит в ветке 3.0.x репозитория с Protocol Buffers. Эта ветка поддерживает старую версию Protocol Buffers, в то время как в master-ветке уже идёт разработка новой версии.
Как начать пользоваться? (ветки)
git branch
: манипулирует ветками: создаёт, удаляет, переименовывает, перечисляет ветки.git checkout BRANCH
: устанавливает ГОЛОВУ на BRANCH и обновляет файлы в index и в рабочем дереве.
Термины (коллаборация)
- Remote: Другая копия репозитория. Пример: у вас на компьютере есть копия репозитория с ядром Linux, а на сервере Github — другая копия того же репозитория.
- Автор коммита: Человек, создавший коммит. Пример: Linus Torvalds.
- Upstream: Основное место расположения кода. Пример: если вы стажёр в Google, то ваш upstream — это сервера Google, а не ваш личный компьютер.
Как начать пользоваться? (remote)
- git clone адрес_репозитория: выкачивает репозиторий себе на компьютер, чтобы можно было с ним экспериментировать.
- git remote add имя адрес_репозитория: сообщает git, что есть другая копия репозитория, и дальше можно будет обращаться к ней по имени.
- git push —set-upstream U B: говорит git, что ветка B в вашем репозитории должна отправляться на сервер U.
- git push: отправляет изменения в upstream.
- git pull: добавляет изменения из upstream.