Введение

Что такое 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? Ответ:

  1. Остальное и так понятно, можно не изучать.
  2. git используется повсюду.

Плюсы git:

  • высокая производительность,
  • возможность работы без централизованного сервера (изменения в ядре Linux пересылают буквально по электронной почте),
  • стабильность.

Минусы git:

  • для тех, кто не знает его внутреннего устройства: очень путающий интерфейс (шутка на тему: xkcd.com/1597),
  • нечитаемая документация (шутка на тему: jenda.hrach.eu/f2/git-for-dummies.html),
  • большое количество похожих команд; часто непонятно, как сделать что-то простое: stackoverflow.com/questions?sort=votes.

полный git глоссарий

Термины

  • Репозиторий (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.