Так получилось, что git захватил лидерство среди подобных систем. В этом уроке мы рассмотрим основы работы с ней.

Устанавливается гит как и любая другая программа:

  • mac: brew install git
  • ubuntu: sudo apt install git
  • windows: choco install git (chocolatey.org либо gitforwindows если вы не знакомы с пакетными менеджерами)

Проверяем что гит установился:

$ git --version

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

$ git config --global user.name "Mona Lisa"
$ git config --global user.email "[email protected]"

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

Инициализация репозитория

Для инициализации нужно выполнить команду git init внутри той директории, которая станет репозиторием.

~$ mkdir example
~$ cd example/
# Команда инциализации
example$ git init
Initialized empty Git repository in .../example/.git/

Инициализация создает директорию .git.

example$ ls -la
total 0
drwxr-xr-x   3 mokevnin  wheel   96 Mar  4 08:51 .
drwxrwxrwt  11 root      wheel  352 Mar  4 08:50 ..
drwxr-xr-x   9 mokevnin  wheel  288 Mar  4 08:51 .git

Внутри нее содержится конфигурация репозитория (в файле .git/config) и все изменения, которые когда-либо делались с репозиторием. Ее удаление равносильно удалению репозитория. При этом, код, с которым мы непосредственно работаем (то, что лежит вне .git) находится в так называемой рабочей копии. Рабочая копия называется копией не случайно. Удалив все ее содержимое, мы ничего не теряем. Гит все помнит и позволяет восстановиться до исходного состояния.

Убедиться в том, что репозиторий инициализирован и находится в работоспособном состоянии можно командой git status:

example$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

Если выполнить команду git status вне директории содержащей .git, то git пожалуется на отсутствие репозитория:

tmp$ git status
fatal: Not a git repository (or any of the parent directories): .git

Коммит

# Создаем файл
example$ touch README.md
# Меняем содержимое
example$ echo '# Hi' > README.md
# Так гит увидит новый файл
example$ git add README.md
 # Коммит с сообщением 'init project'
example$ git commit -m 'init project'
[master (root-commit) 679e31d] init project
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

В коде выше две новых команды. Первая git add подготавливает измененный или добавленный файл к коммиту. Без её выполнения сделать коммит не получится. Подробнее на ней мы остановимся позже. А вот команда git commit непосредственно фиксирует изменения в репозитории. Ключ -m позволяет добавить короткое описание коммита. Если выполнить коммит без этого ключа, то откроется редактор с информацией о коммите. Git ожидает что вы оставите описание коммита и выйдете из редактора. Дальше git самостоятельно завершит свою работу.

Коммит в git невозможно выполнить не добавив к нему описание. Благодаря описанию мы можем просматривать историю коммитов и анализировать ее без необходимости изучать изменения произведенные коммитом. Поэтому хорошее описание коммита очень важно. На просторах сети можно найти множество статей посвященных тому как их именовать.

Рабочий процесс

Дальнейший рабочий процесс выглядит так:

  1. Добавляем или изменяем файлы и директории.
  2. Подготавливаем новое содержимое к коммиту командой git add. Эту команду нужно применять даже в том случае, если файл был просто изменен.
  3. Выполняем коммит
example$ echo 'my first change' >> README.md # Добавляем новую строку в файл
example$ git add README.md # Подготовка к коммиту
example$ git commit -m 'update readme'
[master 3a64fcc] update readme
 1 file changed, 1 insertion(+)

example$ cat README.md
# Hi
my first change

История: git log

Теперь можно посмотреть историю коммитов:

example$ git log

commit 3a64fccf14725593b7486ff09d6a6c325a5f8fcc
Author: Kirill Mokevnin <[email protected]>
Date:   Mon Jun 26 15:01:22 2017 +0300

    update readme

commit 679e31d62ac734e3074f092e417ba741be767a0d
Author: Kirill Mokevnin <[email protected]>
Date:   Mon Jun 26 14:35:47 2017 +0300

    init project

В выводе лога, каждый коммит описывается таким набором данных:

  • Идентификатор коммита, например, 679e31d62ac734e3074f092e417ba741be767a0d.
  • Информация об авторе. Имя и адрес электронной почты, которые вводились во время конфигурации git.
  • Дата коммита.
  • Описание коммита. Сообщение, которое вводилось при выполнении коммита.

Идентификатор коммита играет очень важную роль в жизненном цикле репозитория, и мы не раз к нему еще вернемся. Главное, что сейчас можно отметить: идентификатор представляет из себя хеш, а не последовательный номер (как в некоторых других системах).

Команда git log – очень мощный инструмент, у нее огромное количество опций, которые способны извлекать из истории все, что угодно в совершенно разных представлениях. Как правило, для нормальной повседневной работы, достаточно буквально нескольких разновидностей запросов к истории. Остальное легко гуглится по мере надобности. Очень полезен такой вариант:

example$ git log -p

commit 3a64fccf14725593b7486ff09d6a6c325a5f8fcc
Author: Kirill Mokevnin <[email protected]>
Date:   Mon Jun 26 15:01:22 2017 +0300

    update readme

diff --git a/README.md b/README.md
index 76f177f..13f5a93 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
 # Hi
+my first change

commit 679e31d62ac734e3074f092e417ba741be767a0d
Author: Kirill Mokevnin <[email protected]>
Date:   Mon Jun 26 14:35:47 2017 +0300

    init project

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..76f177f
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# Hi

Он выводит непрерывный diff (разницу) всех изменений по коммитам. Строчки в которых слева есть знак + были добавлены в этом коммите, строчки в которых есть - - удалены. Нажимая f и b в этом выводе, можно перемещаться по истории изменений если она не помещается на экран.

Просмотр изменений

Зная идентификатор коммита, можно посмотреть изменения в коде.

$ git show 3a64fccf14725593b7486ff09d6a6c325a5f8fcc

diff --git a/README.md b/README.md
index 76f177f..13f5a93 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
 # Hi
+my first change

Вывод выше можно было бы получить и так:

$ git show 3a64fcc

То есть достаточно указать только первые 7 символов идентификатора коммита. Это сделано исключительно для удобства, так как вероятность коллизий (пересечений) крайне низка.

С другой стороны, команда git diff, запущенная без аргументов, показывает различия между репозиторием и вашей рабочей копией. Ее полезно запускать тогда, когда вы хотите посмотреть изменения сделанные в рабочей копии, но не добавленные для коммита командой git add.

Сам вывод с непривычки кажется странным и единственный способ разобраться с ним – практика и только практика.

Самостоятельная работа

  • На этом этапе можно начинать проходить туториал от Github.
  • Установите git. Убедитесь что он работает git --version.
  • Сконфигурируйте git задав имя и почту.
  • Создайте репозиторий и добавьте в него файл README.md. Измените файл и зафиксируйте изменения. Посмотрите историю изменений.

Дополнительные материалы

  1. ProGit