4. Что такое Git?
• Git это связанный, ориентированный
граф без циклов
• Вершины графа могут иметь метки
4
пятница, 18 октября 13 г.
5. Комиты = Вершины
Каждая вершина - один комит.
Каждый комит имеет ссылку на родителя.
Родителей может быть несколько
Каждый комит хранит полное состояние
всего репозитория (а не дельту как в
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 г.
6. Комиты = Вершины
Каждый комит идентифицируется хэшфункцией 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 г.
7. Бранчи = Метки
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
Бранч это всего лишь «метка»,
указывающая на один конкретный комит
7
пятница, 18 октября 13 г.
8. Бранчи = Метки
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
Бранч в Git - не отдельное поддерево
репозитория, как в SVN.
8
пятница, 18 октября 13 г.
9. Бранчи = Метки
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
С каждым комитом «метка» перемещается
на новое место.
9
пятница, 18 октября 13 г.
10. Бранчи = Метки
[ feature ]
o--o--o
/
--о--о--o--o--o----------------о
[ master ]
С каждым комитом «метка» перемещается
на новое место.
10
пятница, 18 октября 13 г.
11. Бранчи = Метки
[ feature ]
o--o--o
/
--о--о--o--o--o----------------о
[ master ]
С каждым комитом «метка» перемещается
на новое место.
11
пятница, 18 октября 13 г.
12. Извлечение кода
$ git checkout COMMIT_SHA
Аналог SVN Checkout
Извлекается всегда какой-то комит.
$ git checkout 762df55d
$ git checkout master
$ git checkout topic~4
12
пятница, 18 октября 13 г.
14. Комит изменений
--------------------------------Repository (git database)
-------------------------------Staging area («index»)
/
-------------------------------- || $
Working copy
---------------------------14
пятница, 18 октября 13 г.
git add file.ext
15. Комит изменений
--------------------------------Repository (git database)
/
-------------------------------- || $
git commit -m «done!»
Staging area («index»)
/
-------------------------------- || $
Working copy
---------------------------15
пятница, 18 октября 13 г.
git add file.ext
17. Комит изменений
--------------------------------Repository (git database)
/
-------------------------------- ||
||
Staging area («index») || $
||
-------------------------------- ||
Working copy
---------------------------17
пятница, 18 октября 13 г.
git commit -am «done!»
18. Комит изменений
Комит в Git - не то же самое что в SVN
Комит в Git НЕ меняет состояние удаленного
репозиторий.
Комит в Git - локальное действие которое можно
откатить, изменить, сделать с ним все что
угодно... пока оно не попало на сервер*
*Потом тоже можно, но ваши коллеги вас за это будут нелюбить...
18
пятница, 18 октября 13 г.
19. Комит изменений
$ git commit --amend
В Git можно легко переписать последний комит.
Например исправить опечатку в коде или
поправить комментарий. Это позволяет избежать
вот такого лога:
66dbaf53 01.10.13 13:00:00 Исправил ошибку
6dacfa23 01.10.13 13:00:10 Исправил ошибку 2
19
пятница, 18 октября 13 г.
20. Ветки
Создание ветки и переключение на нее
--o--o--o
[ master ]
$ git checkout -b new-branch
20
пятница, 18 октября 13 г.
21. Ветки
Создание ветки и переключение на нее
--o--o--o
[ master, new-branch ]
$ git checkout -b new-branch
21
пятница, 18 октября 13 г.
22. Ветки
Создание ветки и переключение на нее
--o-------o-------o
[ master ]
$ git checkout -b new-branch master~1
22
пятница, 18 октября 13 г.
23. Ветки
Создание ветки и переключение на нее
[new-branch]
--o-------o-------o
[ master ]
$ git checkout -b new-branch master~1
23
пятница, 18 октября 13 г.
24. Слияние (Merge)
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
При слиянии образуется новый комит с
несколькими родителями.
24
пятница, 18 октября 13 г.
31. Слияние (Merge)
Fast-forward
[ feature ]
o--o--o
/
--о--о--o--o--o
[ master ]
Но можно отказаться
$ git checkout master
$ git merge feature --no-ff
31
пятница, 18 октября 13 г.
32. Слияние (Merge)
Fast-forward
[ feature ]
o--o--o
/
--о--о--o--o--o---------o
[ master ]
Но можно отказаться...
$ git checkout master
$ git merge feature --no-ff
32
пятница, 18 октября 13 г.
33. Rebase
Позволяет перенести кусок истории из
одного места в другое
--о--о--o--o--o [ master ]
о--о [ server ]
33
пятница, 18 октября 13 г.
34. Rebase
Позволяет перенести кусок истории из
одного места в другое
--о--о--o--o--o [ master ]
о--о [ server ]
$ git checkout server
$ git rebase master
34
пятница, 18 октября 13 г.
35. Rebase
Позволяет перенести кусок истории из
одного места в другое
--о--о--o--o--o [ master ]
о--о [ server ]
$ git checkout server
$ git rebase master
35
пятница, 18 октября 13 г.
36. Удаленный
репозиторий
$ 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 г.
49. Откат изменений
Если нужно сбросить состояние рабочей
копии на какое-то состояние?
49
пятница, 18 октября 13 г.
50. Откат изменений
Если нужно сбросить состояние рабочей
копии на какое-то состояние?
Если что-то в процессе....
$ git merge --abort
$ git rebase --abort
$ git revert --abort
50
пятница, 18 октября 13 г.
51. Откат изменений
Если нужно сбросить состояние рабочей
копии на какое-то состояние?
Если нужно просто откатить локальные
изменения (которые не закомичены)
$ git reset --hard HEAD
51
пятница, 18 октября 13 г.
52. Откат изменений
Если нужно сбросить состояние рабочей
копии на какое-то состояние?
Если нужно откатить свою локальную
ветку на какое-то предыдущее состояние
$ git reset --hard COMMIT_SHA
52
пятница, 18 октября 13 г.
53. Откат изменений
$ git reset --hard 12345
--о--о--о--о
[ master, origin/master ]
53
пятница, 18 октября 13 г.
54. Откат изменений
$ git reset --hard 12345
[ master ]
--о--о--о--о
[ origin/master ]
54
пятница, 18 октября 13 г.
55. Откат изменений
$ git reset --hard 12345
$ git commit, git commit, git push
о--о [ master ]
/
--о--о--о--о
[ origin/master ]
55
пятница, 18 октября 13 г.
57. Centralized workflow
Наиболее простой вариант при переходе
с SVN.
Все комитят в одну ветку.
При этом преимущества Git практически
не используются
57
пятница, 18 октября 13 г.
58. Feature branch
Каждая фича делается в отдельной ветке.
Все ветки скидываются в master.
о--о--о [ alice-feature ]
/
--о--о--о--о--о [ master]
о--о--о--о--о [ bob-feature ]
58
пятница, 18 октября 13 г.
59. Feature branch
Каждая фича делается в отдельной ветке.
Все ветки скидываются в master.
о--о--о
/
--о--о--о--о--о--о [ master]
о--о--о--о--о [ bobs-feature ]
59
пятница, 18 октября 13 г.
60. Feature branch
Каждая фича делается в отдельной ветке.
Все ветки скидываются в master.
о--о--о
/
--о--о--о--о--о--о---------о [ master]
/
о--о--о--о--о
60
пятница, 18 октября 13 г.
61. Gitflow
Есть ветки для разработки
.--о--о--о [ master ]
|
| о--о [ hotfix ]
|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о [ development ]
о--о--о [ feature ]
61
пятница, 18 октября 13 г.
62. Gitflow
Есть ветки для разработки, для фичей
.--о--о--о [ master ]
|
| о--о [ hotfix ]
|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о [ development ]
о--о--о [ feature ]
62
пятница, 18 октября 13 г.
63. Gitflow
Есть ветки для разработки, для фичей
для release-candidate
.--о--о--о [ master ]
|
| о--о [ hotfix ]
|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о [ development ]
о--о--о [ feature ]
63
пятница, 18 октября 13 г.
64. Gitflow
Есть ветки для разработки, для фичей,
для release-candidate, для релизов
.--о--о--о [ master ]
|
| о--о [ hotfix ]
|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о [ development ]
о--о--о [ feature ]
64
пятница, 18 октября 13 г.
65. Gitflow
Есть ветки для разработки, для фичей
для release-candidate, для релизов и
хотфиксов
.--о--о--о [ master ]
|
| о--о [ hotfix ]
|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о [ development ]
о--о--о [ feature ]
65
пятница, 18 октября 13 г.
66. Gitflow
Есть ветки для разработки, для фичей
для release-candidate, для релизов и
хотфиксов
.--о--о--о [ master ]
|
| о--о [ hotfix ]
|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о--о [ development ]
/
о--о--о------66
пятница, 18 октября 13 г.
67. Gitflow
Есть ветки для разработки, для фичей
для release-candidate, для релизов и
хотфиксов
.--о--о--о--о [ master ]
|
/
| о--о--|
о--о--о [ release-2.1 ]
|
/
--о--о--о--о--о--о [ development ]
/
о--о--о------67
пятница, 18 октября 13 г.
68. Gitflow
Есть ветки для разработки, для фичей
для release-candidate, для релизов и
хотфиксов
<2.1>
.--о--о--о--о---о [ master ]
|
/ /
| о--о--- /
|
о--о--о----|
/
--о--о--о--о--о--о--о [ development ]
/
о--о--о------68
пятница, 18 октября 13 г.
70. Быстрый и умный
• Быстрые ветки - удобнее работать
правильно. Для мержа ветки в родителя
не обязательно сливать родителя к себе.
• Умнее разрешение конфликтов (даже
порой решает tree-conflict в случае
перемещения/переименования)
70
пятница, 18 октября 13 г.
71. Все в ветках
• Никто ни с кем не пересекается во время
разработки фичи
• Видно, какой код попал в релиз, а какой нет
71
пятница, 18 октября 13 г.
72. Распределенность
• Локально вся история.
• Можно без интернет-подключения
переключиться на любую ветку, на
любую ревизию, вообще в любое
состояние репозитория
• У каждого полная резервная копия
репозитория
72
пятница, 18 октября 13 г.