Основы Git
1
пятница, 18 октября 13 г.
Что такое Git?

2
пятница, 18 октября 13 г.
Что такое Git?

3
пятница, 18 октября 13 г.
Что такое Git?
• Git это связанный, ориентированный
граф без циклов

• Вершины графа могут иметь метки

4
пятница, 18 октября 13 г.
Комиты = Вершины
Каждая вершина - один комит.
Каждый комит имеет ссылку на родителя.
Родителей может быть несколько
Каждый комит хранит полное состояние
всего репозитория (а не дельту как в
SVN)*
* http://git-scm.com/book/ru/Git-%D0%B8%D0%B7%D0%BD%D1%83%D1%82%D1%80%D0%B8-%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA
%D1%82%D1%8B-%D0%B2-Git

5
пятница, 18 октября 13 г.
Комиты = Вершины
Каждый комит идентифицируется хэшфункцией SHA1
$ git log -1
commit 8d7e037995616c3be2032287030e04b2ef11df25
Author: Oleg Elifantiev <oleg@elifantiev.ru>
Date:
Mon Oct 14 23:54:21 2013 +0400
Fixed method docblock

6
пятница, 18 октября 13 г.
Бранчи = Метки
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
Бранч это всего лишь «метка»,
указывающая на один конкретный комит

7
пятница, 18 октября 13 г.
Бранчи = Метки
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
Бранч в Git - не отдельное поддерево
репозитория, как в SVN.

8
пятница, 18 октября 13 г.
Бранчи = Метки
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
С каждым комитом «метка» перемещается
на новое место.

9
пятница, 18 октября 13 г.
Бранчи = Метки
[ feature ]
o--o--o
/
--о--о--o--o--o----------------о
[ master ]
С каждым комитом «метка» перемещается
на новое место.

10
пятница, 18 октября 13 г.
Бранчи = Метки
[ feature ]
o--o--o
/
--о--о--o--o--o----------------о
[ master ]
С каждым комитом «метка» перемещается
на новое место.

11
пятница, 18 октября 13 г.
Извлечение кода
$ git checkout COMMIT_SHA

Аналог SVN Checkout
Извлекается всегда какой-то комит.
$ git checkout 762df55d
$ git checkout master
$ git checkout topic~4

12
пятница, 18 октября 13 г.
Комит изменений
--------------------------------Repository (git database)
-------------------------------Staging area («index»)
-------------------------------Working copy

---------------------------13
пятница, 18 октября 13 г.
Комит изменений
--------------------------------Repository (git database)
-------------------------------Staging area («index»)

/
-------------------------------- || $
Working copy

---------------------------14
пятница, 18 октября 13 г.

git add file.ext
Комит изменений
--------------------------------Repository (git database)

/
-------------------------------- || $

git commit -m «done!»

Staging area («index»)

/
-------------------------------- || $
Working copy

---------------------------15
пятница, 18 октября 13 г.

git add file.ext
Комит изменений
--------------------------------Repository (git database)
-------------------------------Staging area («index»)
-------------------------------Working copy

---------------------------16
пятница, 18 октября 13 г.
Комит изменений
--------------------------------Repository (git database)

/
-------------------------------- ||
||
Staging area («index») || $
||
-------------------------------- ||
Working copy

---------------------------17
пятница, 18 октября 13 г.

git commit -am «done!»
Комит изменений
Комит в Git - не то же самое что в SVN
Комит в Git НЕ меняет состояние удаленного
репозиторий.
Комит в Git - локальное действие которое можно
откатить, изменить, сделать с ним все что
угодно... пока оно не попало на сервер*
*Потом тоже можно, но ваши коллеги вас за это будут нелюбить...

18
пятница, 18 октября 13 г.
Комит изменений
$ git commit --amend

В Git можно легко переписать последний комит.
Например исправить опечатку в коде или
поправить комментарий. Это позволяет избежать
вот такого лога:
66dbaf53 01.10.13 13:00:00 Исправил ошибку
6dacfa23 01.10.13 13:00:10 Исправил ошибку 2

19
пятница, 18 октября 13 г.
Ветки
Создание ветки и переключение на нее
--o--o--o
[ master ]
$ git checkout -b new-branch

20
пятница, 18 октября 13 г.
Ветки
Создание ветки и переключение на нее
--o--o--o
[ master, new-branch ]
$ git checkout -b new-branch

21
пятница, 18 октября 13 г.
Ветки
Создание ветки и переключение на нее

--o-------o-------o
[ master ]
$ git checkout -b new-branch master~1

22
пятница, 18 октября 13 г.
Ветки
Создание ветки и переключение на нее
[new-branch]
--o-------o-------o
[ master ]
$ git checkout -b new-branch master~1

23
пятница, 18 октября 13 г.
Слияние (Merge)
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
При слиянии образуется новый комит с
несколькими родителями.

24
пятница, 18 октября 13 г.
Слияние (Merge)
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
$ git checkout master
$ git merge feature

25
пятница, 18 октября 13 г.
Слияние (Merge)
[ feature ]
o--o--o----------------/

--о--о--o--o--o----------------o
[ master ]
$ git checkout master
$ git merge feature

26
пятница, 18 октября 13 г.
Слияние (Merge)
[ feature ]
o--o--o----------------/

--о--о--o--o--o----------------o
[ master ]
$ git checkout master
$ git merge feature

27
пятница, 18 октября 13 г.
Слияние (Merge)
Fast-forward
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
Если возможно, Git линеаризует историю

28
пятница, 18 октября 13 г.
Слияние (Merge)
Fast-forward
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
Если возможно, Git линеаризует историю
$ git checkout master
$ git merge feature

29
пятница, 18 октября 13 г.
Слияние (Merge)
Fast-forward
--о--о--o--o--o--о--о--о
[ master, feature ]
Если возможно, Git линеаризует историю
$ git checkout master
$ git merge feature

30
пятница, 18 октября 13 г.
Слияние (Merge)
Fast-forward
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
Но можно отказаться
$ git checkout master
$ git merge feature --no-ff

31
пятница, 18 октября 13 г.
Слияние (Merge)
Fast-forward
[ feature ]
o--o--o
/

--о--о--o--o--o---------o
[ master ]
Но можно отказаться...
$ git checkout master
$ git merge feature --no-ff

32
пятница, 18 октября 13 г.
Rebase
Позволяет перенести кусок истории из
одного места в другое
--о--о--o--o--o [ master ]

о--о [ server ]

33
пятница, 18 октября 13 г.
Rebase
Позволяет перенести кусок истории из
одного места в другое
--о--о--o--o--o [ master ]

о--о [ server ]
$ git checkout server
$ git rebase master

34
пятница, 18 октября 13 г.
Rebase
Позволяет перенести кусок истории из
одного места в другое
--о--о--o--o--o [ master ]

о--о [ server ]
$ git checkout server
$ git rebase master

35
пятница, 18 октября 13 г.
Удаленный
репозиторий
$ git clone https://git.sbis.ru/root/sbis3-ws.git
Cloning into sbis3-ws
...
$ git remote -v
origin https://git.sbis.ru/root/sbis3-ws.git

Клонирует весь репозиторий, все ветки,
всю историю

36
пятница, 18 октября 13 г.
Удаленный
репозиторий
SVN: Checkout/Commit/Update
Git: Clone/Commit+Push/Pull

37
пятница, 18 октября 13 г.
Удаленный
репозиторий
Обновление текущей ветки из удаленного
репозитория
$ git pull

Могут случиться конфликты (как и в SVN
при update)
38
пятница, 18 октября 13 г.
Удаленный
репозиторий
На самом деле pull это...

--о--о--o--o--o--o
[ master ]

39
пятница, 18 октября 13 г.
Удаленный
репозиторий
На самом деле pull это... fetch
[ origin/master ]
o--o--o
/
--о--о--o--o--o--o
[ master ]

40
пятница, 18 октября 13 г.
Удаленный
репозиторий
На самом деле pull это... fetch + merge
[ origin/master ]
o--o--o
/

--о--о--o--o--o--о-----o
[ master ]

41
пятница, 18 октября 13 г.
Удаленный
репозиторий
Отправка своих изменений - push
[ origin/master ]
o--o--o
/

--о--о--o--o--o--о-----o
[ master ]
$ git push origin master

42
пятница, 18 октября 13 г.
Удаленный
репозиторий
Отправка своих изменений - push
o--o--o
/

--о--о--o--o--o--о-----o
[ master, origin/master ]
$ git push origin master

43
пятница, 18 октября 13 г.
Откат изменений
SVN Revert - Git ???

44
пятница, 18 октября 13 г.
Откат изменений
SVN Revert:

•
•

отменяет изменения в локальной копии
НЕ делает новый комит

45
пятница, 18 октября 13 г.
Откат изменений
Git Revert:

•
•

Отменяет указанный комит
ДЕЛАЕТ новый комит в локальном
репозитории

46
пятница, 18 октября 13 г.
Откат изменений
Git Revert:
---о---о---о---о
[ master ]
$ git revert master~1

47
пятница, 18 октября 13 г.
Откат изменений
Git Revert:
---о---о---о---о---о
[ master ]
$ git revert master~1

48
пятница, 18 октября 13 г.
Откат изменений
Если нужно сбросить состояние рабочей
копии на какое-то состояние?

49
пятница, 18 октября 13 г.
Откат изменений
Если нужно сбросить состояние рабочей
копии на какое-то состояние?
Если что-то в процессе....
$ git merge --abort
$ git rebase --abort
$ git revert --abort

50
пятница, 18 октября 13 г.
Откат изменений
Если нужно сбросить состояние рабочей
копии на какое-то состояние?
Если нужно просто откатить локальные
изменения (которые не закомичены)
$ git reset --hard HEAD

51
пятница, 18 октября 13 г.
Откат изменений
Если нужно сбросить состояние рабочей
копии на какое-то состояние?
Если нужно откатить свою локальную
ветку на какое-то предыдущее состояние
$ git reset --hard COMMIT_SHA

52
пятница, 18 октября 13 г.
Откат изменений
$ git reset --hard 12345

--о--о--о--о
[ master, origin/master ]

53
пятница, 18 октября 13 г.
Откат изменений
$ git reset --hard 12345

[ master ]
--о--о--о--о
[ origin/master ]

54
пятница, 18 октября 13 г.
Откат изменений
$ git reset --hard 12345
$ git commit, git commit, git push

о--о [ master ]
/
--о--о--о--о
[ origin/master ]

55
пятница, 18 октября 13 г.
Методологии

56
пятница, 18 октября 13 г.
Centralized workflow
Наиболее простой вариант при переходе
с SVN.
Все комитят в одну ветку.
При этом преимущества Git практически
не используются

57
пятница, 18 октября 13 г.
Feature branch
Каждая фича делается в отдельной ветке.
Все ветки скидываются в master.
о--о--о [ alice-feature ]
/
--о--о--о--о--о [ master]

о--о--о--о--о [ bob-feature ]

58
пятница, 18 октября 13 г.
Feature branch
Каждая фича делается в отдельной ветке.
Все ветки скидываются в master.
о--о--о
/

--о--о--о--о--о--о [ master]

о--о--о--о--о [ bobs-feature ]

59
пятница, 18 октября 13 г.
Feature branch
Каждая фича делается в отдельной ветке.
Все ветки скидываются в master.
о--о--о
/

--о--о--о--о--о--о---------о [ master]

/
о--о--о--о--о

60
пятница, 18 октября 13 г.
Gitflow
Есть ветки для разработки
.--о--о--о [ master ]
| 
| о--о [ hotfix ]
|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о [ development ]

о--о--о [ feature ]
61
пятница, 18 октября 13 г.
Gitflow
Есть ветки для разработки, для фичей
.--о--о--о [ master ]
| 
| о--о [ hotfix ]
|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о [ development ]

о--о--о [ feature ]
62
пятница, 18 октября 13 г.
Gitflow
Есть ветки для разработки, для фичей
для release-candidate
.--о--о--о [ master ]
| 
| о--о [ hotfix ]
|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о [ development ]

о--о--о [ feature ]
63
пятница, 18 октября 13 г.
Gitflow
Есть ветки для разработки, для фичей,
для release-candidate, для релизов
.--о--о--о [ master ]
| 
| о--о [ hotfix ]
|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о [ development ]

о--о--о [ feature ]
64
пятница, 18 октября 13 г.
Gitflow
Есть ветки для разработки, для фичей
для release-candidate, для релизов и
хотфиксов
.--о--о--о [ master ]
| 
| о--о [ hotfix ]
|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о [ development ]

о--о--о [ feature ]
65
пятница, 18 октября 13 г.
Gitflow
Есть ветки для разработки, для фичей
для release-candidate, для релизов и
хотфиксов
.--о--о--о [ master ]
| 
| о--о [ hotfix ]
|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о--о [ development ]

/
о--о--о------66
пятница, 18 октября 13 г.
Gitflow
Есть ветки для разработки, для фичей
для release-candidate, для релизов и
хотфиксов
.--о--о--о--о [ master ]
| 
/
| о--о--|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о--о [ development ]

/
о--о--о------67
пятница, 18 октября 13 г.
Gitflow
Есть ветки для разработки, для фичей
для release-candidate, для релизов и
хотфиксов
<2.1>
.--о--о--о--о---о [ master ]
| 
/ /
| о--о--- /
|
о--о--о----|
/

--о--о--о--о--о--о--о [ development ]

/
о--о--о------68
пятница, 18 октября 13 г.
Профиты

69
пятница, 18 октября 13 г.
Быстрый и умный
• Быстрые ветки - удобнее работать

правильно. Для мержа ветки в родителя
не обязательно сливать родителя к себе.

• Умнее разрешение конфликтов (даже
порой решает tree-conflict в случае
перемещения/переименования)

70
пятница, 18 октября 13 г.
Все в ветках
• Никто ни с кем не пересекается во время
разработки фичи

• Видно, какой код попал в релиз, а какой нет

71
пятница, 18 октября 13 г.
Распределенность
• Локально вся история.
• Можно без интернет-подключения
переключиться на любую ветку, на
любую ревизию, вообще в любое
состояние репозитория

• У каждого полная резервная копия
репозитория

72
пятница, 18 октября 13 г.
Минусы

73
пятница, 18 октября 13 г.
Сложный
• Git сложный
$ git commit --help
git commit [-a | --interactive | --patch] [-s] [-v]
[-u<mode>] [--amend]
[--dry-run]
[(-c | -C | --fixup | --squash) <commit>]
[-F <file> | -m <msg>] [--reset-author]
[--allow-empty]
[--allow-empty-message] [--no-verify]
[-e] [--author=<author>]
[--date=<date>] [--cleanup=<mode>]
[--[no-]status]

74
пятница, 18 октября 13 г.
GUI-Клиенты...
$ git commit -m message

75
пятница, 18 октября 13 г.
GUI-Клиенты...
$ git clone https://...

76
пятница, 18 октября 13 г.
GUI-Клиенты...
$ git fetch

77
пятница, 18 октября 13 г.
GUI-Клиенты...
$ git push origin development

78
пятница, 18 октября 13 г.
GUI-клиенты
Я рекомендую SourceTree
http://www.sourcetreeapp.com/

79
пятница, 18 октября 13 г.
GUI-клиенты
Из GUI для Git просто необходим
визуализатор истории...

80
пятница, 18 октября 13 г.
Спасибо за внимание!
Есть вопросы?

пятница, 18 октября 13 г.

Основы Git