GIT If you are using Subversion, stop it. Just stop. Subversion = Leeches. Mercurial and Git = Antibiotics. We have better technology now. © Joel Spolsky . © Pavel Alexeev, Grigel Constantin, Igor Redkin. 2016
GITIf you are using Subversion, stop it. Just stop.
Subversion = Leeches. Mercurial and Git = Antibiotics. We have better technology now.
© Joel Spolsky.
© Pavel Alexeev, Grigel Constantin, Igor Redkin. 2016
2
Удобство для разработки и
сопровождения
Коротко о главном• Локальные коммиты, распределённость• Куча настроек: цвета, предпочтения, хранение,
лимиты ресурсов, алиасы• Из коробки: подсветка diff, конверт line endings, visual
merge.• Отдельные commit и push/pull - работа над
“future”, staging, stash, merge, rebase, cherry-pick, --amend.
• Удобная передача коммитов, в том числе по почте без прямой доступности git patch/git am/git format-patch
• Xdelta алгоритм хранения - быстро, компактно• Open source! 3
Краткая история GitОсновные требования
1.Скорость2.Простота дизайна3.Поддержка нелинейной разработки (тысячи параллельных
веток)4.Полная распределённость5.Возможность эффективной работы с такими большими
проектами, как ядро Linux (как по скорости, так и по размеру данных)
6.Поддержка различных workflow 4
Централизованные VCS
5
Распределённые СКВ
6
Отличия/Требования к Git
1. Почти все операции — локальные
2. Git следит за целостностью данных
3. Чаще всего данные в Git только добавляются
4. Три состояния
каталог Git’а (Git directory),
рабочий каталог (working directory),
область подготовленных файлов (staging area).
7
Small and fastBenchmarks
8
Small and fast
9
Множество опциональных настроек
1. git config
2. Виды конфигурации
Общие для всех пользователей системы (git config --system)
Настройки для конкретного пользователя (git config --global)
Конфигурационный файл в каталоге Git’а (git config)
3. Данные пользователя:
git config --global user.name "John Doe"
git config --global user.email [email protected]
10
Множество подкомманд
11
Any Workflow
12
Subversion-Style Workflow● very common● especially for transition
Integration Manager Workflow● Integration manager, lead● Many may clone and contribute● Pull/merge requests
Dictator and Lieutenants Workflow● For massive projects (kernel.org)● Delegate part of responsibility
Удобный инструмент. Staging
14
svn commit != git commit
● svn tag != git tag. True read only.● branch не создаёт директорий - указатель на коммит● tag:
○ Annotated○ Lightweight Tags
Удобный инструмент.Бранчи и теги (метки, tag)
15
Удобный инструмент. Бранч на фичу
16
Удобный инструмент. --amend
17
Удобный инструмент. Merge fast forward
18
Удобный инструмент. Rebase
19
Интерактивный rebase
20
Зачем?# p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell
Продолжаем знакомиться. Stash
21
Продолжаем знакомиться. Revert
22
● На стадии stage: git checkout (git reset --hard отмена всего)● Если локально коммит был: git rebase -i● Push уже состоялся: git revert HEAD
○ Любая ревизия, относительно/абсолютно○ Можно диаппозон○ Можно указать сообщение или открыть редактор
$ git revert HEAD --no-edit[master 45fa96b] Revert "Oops, we didn't want this commit" 1 files changed, 1 insertions(+), 1 deletions(-)
$ git hist* 45fa96b 2011-03-09 | Revert "Oops, we didn't want this commit" (HEAD, master) [Pavel]
А всё ли смерджили из бранчей?
23
● git branch --merged master lists branches merged into master
● git branch --merged lists branches merged into HEAD (i.e. tip of current branch)
● git branch --no-merged lists branches that have not been merged
● git merge-base command to find the latest common commit between the two branches
● Отслеживание изменений во внешних директориях
● Зависимость на уровне кода, а не артефактов
● Возможность изменять несколько, “сбор дерева”
● Отслеживается добавления подмодуля. Файл .gitmodules. Отслеживается также бранч и версия
● Контент отдельно
● Можно использовать обновление (merge/fetch/pull/push) отдельно или для проекта целиком: git clone --recursive
Подмодули (подпроекты)
24
$ git submodule add https://github.com/chaconinc/DbConnectorCloning into 'DbConnector'...remote: Counting objects: 11, done.remote: Compressing objects: 100% (10/10), done.remote: Total 11 (delta 0), reused 11 (delta 0)Unpacking objects: 100% (11/11), done.Checking connectivity... done.
$ git statusOn branch masterYour branch is up-to-date with 'origin/master'.Changes to be committed:
new file: .gitmodulesnew file: DbConnector
$ git commit -am 'added DbConnector module'[master fb9093c] added DbConnector module 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 DbConnector
$ git clone https://github.com/chaconinc/MainProject$ cd MainProject$ cd DbConnector/$ ls$
$ git submodule init$ git submodule updateCloning into 'DbConnector'...…
Submodule path 'DbConnector': checked out 'c3f01dc8862123d317dd46284b05b6892c7b29bc'
$ git clone --recursive https://github.com/chaconinc/MainProjectCloning into 'MainProject'...…
Submodule 'DbConnector' (https://github.com/chaconinc/DbConnector) registered for path DbConnector'Cloning into 'DbConnector'......
Submodule 'DbConnector': checked out 'c3f01dc8862123d317dd46284b05b6892c7b29bc'
Удобный инструмент. Репозитории
25
Достаточно email для передачи изменений
26
GUI под различные OS
27
Windows,
Linux, Mac
Free examplesMac
Windows, Mac
И много ещё полезного...
28
● Настраиваемая подсветка (diff/merge)● Настройка просмотра истории● git show - показ коммита и его изменений● Показ статистики изменений● git bisect - поиск внесённой ошибки● git cherry-pick - точечный перенос коммитов● Хуки на сервере● git mergetool - использование
любого инструмента слияния(Xcode, Idea, kDiff, meld)
● Настройка алиасов команд
Система менеджмента кода и ревью
Популярность инструмента растёт
Сервисы вроде https://github.com/, https://bitbucket.org
Интеграция со множеством систем (Jira)
Системы ревью кода. Использование бранчей. Gerrit, Phabricator, Gitosis, Gitlab, Review Board...
29
Об этом подробнее в следующей части
презентации
Использованные материалы
1. http://zzet.org/learn-git/lection-1.html?full#21
2. http://git-scm.com/about/
3. http://www.slideshare.net/MikhailVasilyev/git-subversion-12256851
4. http://www.slideshare.net/demiazz/git-14357600
5. http://www.slideshare.net/oelifantiev/git-27341307
6. http://www.slideshare.net/opedge/git-33590567
7. http://www.slideshare.net/Unomano/ss-32855881
8. http://www.slideshare.net/phpdevby/git-11216260
9. https://www.atlassian.com/git/articles/10-years-of-git/
10. https://git-scm.com/download/gui/linux
11. https://githowto.com/ru/undoing_committed_changes?ref=driverlayer.com%2Fweb
12. https://git-scm.com/book/ru/v1/%D0%92%D0%B5%D1%82%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-Git-%D0%A7%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-%D0%B2%D0%B5%D1%82%D0%BA%D0%B0%3F
13. http://stackoverflow.com/questions/226976/how-can-i-know-in-git-if-a-branch-has-been-already-merged-into-master
14. https://git-scm.com/book/en/v2/Git-Tools-Submodules
30
31
Бенефит для компании
Workflow.Существует 2 основных ветки: master и dev.
master — стабильная ветка, готовая к выкатыванию на production сервер в любой момент.dev — ветка, над которой в данный момент работает команда.В начале разработки master и dev ветки идентичны.
Workflow. Step 1Когда программист начинает работу над новым дефектом / функционалом, он должен переключиться на ветку dev и получить ее последнюю версию.
git checkout dev
git pull origin devК примеру, разработчик хочет начать исправлять дефект страницы аутентификации. Номер ошибки на Github — 1234. Разработчик должен создать новую ветку из dev
git checkout -b 1234-bug-login1234-bug-login это только пример. Первым словом должен быть номер дефекта, вторым — bug / feature, а дальше — описание проблемы.
Workflow. Step 2Далее разработчик продолжает работу локально: делает изменения, коммиты и т.д. Commit-cообщения должны содержать номер ошибки и техническое описание
git add ...list of files...
git commit -m "#1234"Итак, разработка окончена, и теперь необходимо отправить изменения на Github
git push origin 1234-bug-loginВсе изменения теперь в репозитории. После этого разработчику необходимо обновить свою ветку из dev, чтобы иметь возможность слить ее без конфликтов.
Workflow. Step 3Сперва необходимо получить последнюю версию dev ветки
git checkout dev
git pull origin dev
И затем влить все изменения, которые произошли в dev ветке, в свою ветку (1234-bug-login)
git checkout 1234-bug-login
git rebase dev
git push -f origin 1234-bug-login
Workflow. Step 4
DEV branchto
Master branch
with team lead firewall
Workflow. Step 5. Testing & ReleaseКак только 1234-bug-login попадает в dev, Jenkins (система непрерывной интеграции) автоматически обновляет dev сервер из dev ветки. QA могут начинать тестировать и как итог подтвердить или переоткрыть задачу.
Если регрессионное тестирование успешно закончено, можно обновлять production сервер, при этом берется последний пакет (тот, на котором проходило тестирование), и именно он устанавливается на production сервер.
Code Review
Code Review
Integration with Git
41
Git as a service
Git as a serviceName GIT SVN HG Code
ReviewIssueTracker
Bitbucket
Codebase
GitHub
GitLab
Git as a local development process
GitLab and all the rest
45
Name Language Activity License
Gitlab Ruby Yes Open Source
Stash Java Yes Comercial
Gerrit Java Yes Apache License 2.0
Gitblit Java Yes Apache License 2.0
Git user management
Git backup process● Each copy is full
backup● Distributed storage● File-system copy● Git bundle● Gcrypt remote● Mirror remote● Live mirror● Backup As A Service
Git integration with Atlassian products
Git Integration with everything
Git with zero downtime
Git-SVN mirror of existing Subversion repository.
Push to Git or commit to Subversion at your convenience
Convert your existing Subversion project to Git
Import processes huge repositories, preserves all
the data and history
ADD TO BITBUCKET SERVER
SVN Mirror for Atlassian Bitbucket Server
(formerly known as Atlassian Stash) will pull
your existing Subversion project right into
Bitbucket Server, as a one-time import or full-
featured bi-directional mirror.
Price and Cloud VS Independence
54
Open Questions
55