Git — наше всё
Вадим Дробинин
1
Вместо плана
• Немного истории
• Основы Git
• Не совсем основы Git
• Git-кунг-фу
2
Для чего нужны системы
контроля версий?
3
Угадайте проект
• Тысячи разработчиков
• Сотрудники по всему миру
• Установлен на миллионах компьютеров
• Лежит в основе 90% суперкомпьютеров в мире
• Работает на телефонах некоторых из вас
• 11 лет создавался без системы контроля версий
• У них классный логотип ^_^
4
Linux
5
Раньше
Главный чувак Вы
main.c
library.c
library.h
version-1.0.zip
v1/main.c
v1/library.c
v1/library.h
cp -Rf v1 patch
patch/main.c
patch/library.c
patch/library.h
6
Раньше
Главный чувак Вы
main.c
library.c
library.h
version-1.0.zip
v1/main.c
v1/library.c
v1/library.h
cp -Rf v1 patch
patch/main.c
patch/library.c
patch/library.h
7
Раньше
Главный чувак Вы
main.c
library.c
library.h
version-1.0.zip
v1/main.c
v1/library.c
v1/library.h
cp -Rf v1 patch
patch/main.c
patch/library.c*
patch/library.h
diff -u v1 patch
8
Раньше
Главный чувак Вы
main.c
library.c
library.h
version-1.0.zip
v1/main.c
v1/library.c
v1/library.h
cp -Rf v1 patch
patch/main.c
patch/library.c*
patch/library.h
diff -u v1 patch
E-mail
9
Раньше
Главный чувак Вы
main.c
library.c
library.h
version-1.0.zip
v1/main.c
v1/library.c
v1/library.h
cp -Rf v1 patch
patch/main.c
patch/library.c*
patch/library.h
diff -u v1 patch
E-mail
version-1.1.zip
10
Основы Git
11
Раньше
Хранилище
«снимков»
R1 R2 R3 R4
a.py
b.py
c.py
R5
A1
B
C1
A1
B
C2
A2
B1
C2
A2
B2
C3
12
Сейчас
Хранилище
изменений
R1 R2 R3 R4
a.py
b.py
c.py
Δ1 Δ3
Δ3
R5
Δ4
Δ4Δ1 Δ2
13
Структура .git
14
• Объекты
• Блобы (англ. blobs)
• Деревья
• Коммиты
• Ссылки
Git — это граф
15
1
2
3
7
8
9
6
5
4
HEAD
Рабочая копия
Индекс
HEAD
16
Рабочая директория
Индекс
HEAD
git add
17
Рабочая директория
Индекс
HEAD
git add
18
git commit
Главная идея
• git add
• git commit
• Что, если какие-то файлы не добавлены в
индекс?
• — Они не попадут в коммит.
• Добавлять и коммитить файлы можно
независимо.
19
Настроить систему
• Скачать (git-scm.com/downloads)
• $ git config --global user.name “Vad Drobinin”
• $ git config --global user.email “v@drobinin.com”
20
Клонировать репозиторий
$ git clone git@10.0.0.80:/opt/git/pesto.git
21
Создать репозиторий
$ touch test.py
$ git init
$ git add .
$ git commit -m
“Hey there :)”
22
Подытожим
• Редактировать файлы: vim / emacs / etc
• Индексировать изменения: git add (file)
• Просматривать изменения: git status / git diff
• Добавлять в хранилище: git commit
• Получать изменения: git pull
• Отправлять в удаленный репозиторий: git push
23
Этикет
• Commit often
• Не делайте коммит того, что еще не сделано
до конца
• Git — не система для бэкапов
• Тестируйте перед отправкой
24
Не совсем основы Git
25
Отменить изменения
26
1
2
3
7
8
9
6
5
4
HEAD
Рабочая копия
Индекс
HEAD
27
git stash
28
git log
29
30
git branch
31
A B C D E
F G
Git-кунг-фу
32
$ git rebase master
33
C D E
BA
master
feature
HEAD
34
C’ D’ E’
BA
master
feature
HEAD
git merge
35
A B C D
F G feature
master
$ git merge feature
36
A B C D
F G
(E)
feature
master
$ git merge feature -- squash
37
A B C D
F G
(Sq)
feature
master
Перемотка (ff-merge)
38
A B
F G feature
master
Перемотка (ff-merge)
39
A B F G
feature
master,
$ git merge feature --no-ff
40
A B
F G
(M)
feature
master
Стратегии слияния
• resolve
• recursive
• ours
• octopus
• subtree
41
git rerere
42
$ git config --global rerere.enabled true
Коммит слишком большой?
43
git commit -p
Удаленная ветка?
44
$ git config gc.pruneexpire “30 days”
$ git reflog
git bisect
45
$ git bisect start
$ git bisect bad
$ git bisect good v1.0
Bisecting: 6 revisions left to test after this
[ecb6e1bc347ccecc5f9350d878ce677feb13d3b2]
error handling on repo
GitHub
46
git-kata
47

Git для начинающих