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? Ответ:

  1. Остальное и так понятно, можно не изучать.
  2. 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.