Переход на git из subversion
TRANSCRIPT
Переход на распределённую систему контроля версий из
Развитие систем контроля версий
1. Ручное копирование файлов
2012-02-01
2012-02-02
2012-02-03
2. Локальные системы контроля версий
RCS
SCCS
Для каждого файла хранится исходное состояние и список изменений
Системы контроля версий клиент-сервер
Централизованые системы контроля версий
●CVS●Subversion●IBM Rational ClearCase●MKS Integrity●Perforce●PVCS●Microsoft Visual SourceSafe●Microsoft Visual Studio Application Lifecycle Management
Работа с централизоваными системами контроля версий
●Обмен файлами через центральный сервер●История хранится на центральном сервере●Клиентские компьютеры содержат только последнюю версию
Работа с централизоваными системами контроля версий
Контроль одновременного доступа к файлам
Блокирование файлов на запись исключает конфликты, но уменьшает возможности одновременного редактирования
Работа с централизоваными системами контроля версий
Одновременное редактирование файла
?
Приводит к конфликтам и необходимости их разрешения вручную
Работа с ветками в Subversion
trunk
1
2
3 5
4
7
6
bug1234
При слиянии веток не используется история версий
Центральный сервер – слабое место
Распределённые системы контроля версий
●Git●Mercurial●Bazaar●Darcs●SVK●Bit Keeper
Каждый компьютер содержит копию репозитория
Почему я выбрал Git ?
1. Кроссплатформенность
Linux Windows Mac OS X
2. Наличие удобных инструментов
Почему я выбрал Git ?
3. Скорость работы
4. Распространённость
- Большая часть операций выполняется локально;- Скорость операций высокая;- Данные хранятся компактно (последняя версия + разница в сжатом виде;- Эффективно работает даже с бинарными файлами.
Git
Контекстно-адресуемая файловая система с интерфейсом для системы контроля версий
Хранилище ключ-значение
Подготовка к работе с Git
git config --global user.email "[email protected]"git config --global user.name "Your Name"
Начало работы с Git
~/project$ git initInitialized empty Git repository in ~/project/.git/~/project$ git add *.java~/project$ git add *.txt~/project$ git commit -m "initial version"[master (root-commit) e39cac5] initial version 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 main.java create mode 100644 readme.txt
/tmp$ git clone https://github.com/github/git git-srcInitialized empty Git repository in /tmp/git-src/.git/remote: Counting objects: 112488, done.remote: Compressing objects: 100% (36088/36088), done.remote: Total 112488 (delta 82161), reused 104459 (delta 74813)Receiving objects: 100% (112488/112488), 23.52 MiB | 747 KiB/s, done.Resolving deltas: 100% (82161/82161), done.
Инициализация нового репозитория
Клонирование существующего репозитория
Жизненный цикл файлов в Git
3 состояния файлов:1. Сохранённый2. Модифицированый3. Индексированый
Метки
Метка – это указатель на коммит
Создание легковесной меткиgit tag v1
Метка-аннотация (комментарий вводить обязательно)
git tag -a v2 -m “вторая версия”
Метка с подписьюgit tag -s v3 -m “третья версия”
Метки можно использовать в “git push”git push origin v2
Отправка меток на серверgit push origin --tags
V1
V2
Ветвление
SVN - медленно Git - мгновенно
В Subversion создание, слияние веток и переключение между ветками происходит через сеть
В Git вся работа с ветками происходит локально
Ветвление
Коммит 1 Коммит 2 Коммит 3
состояние 1 cостояние 2 состояние 3
После нескольких коммитов ветка master (по умолчанию) указывает на последний
master
HEAD
HEAD – указатель на ветку, в которой мы находимся
Ветвление
Коммит 1 Коммит 2 Коммит 3
Создание новой ветки
master
HEADgit branch testing
testing
Ветвление
Коммит 1 Коммит 2 Коммит 3
Переключение в новую ветку
master
HEAD
git checkout testing
testing
Ветвление
Коммит 1 Коммит 2 Коммит 3
Изменения в новой ветке
master
HEAD
git commit
testing
Коммит 4
Ветвление
Коммит 1 Коммит 2 Коммит 3
Переключение в ветку master
master
HEADgit checkout master
testing
Коммит 4
Ветвление
Коммит 1 Коммит 2 Коммит 3
Изменения в ветке master
master
HEADgit commit
testing
Коммит 4
Коммит 5
Ветвление
Коммит 1 Коммит 2 Коммит 3
Изменения в ветке master
master
HEADgit commit
testing
Коммит 4
Коммит 5 Коммит 6
Ветвление
Коммит 1 Коммит 2 Коммит 3
Слияние веток
master
HEADgit merge testing
testing
Коммит 4
Коммит 5 Коммит 6
Ветвление
Коммит 1 Коммит 2 Коммит 3
Слияние веток
master
HEADgit merge testing
testing
Коммит 4
Коммит 5 Коммит 6 Коммит 7
Ветвление
Конфликты при слиянии веток
git merge testingAuto-merging readme.txtCONFLICT (content): Merge conflict in readme.txtAutomatic merge failed; fix conflicts and then commit the result.
Типы веток
Долгоживущиеmaster
Тематическиеticket1234
Удалённые (remote)origin/masterorigin2/testing
Удалённые ветки бывают отслеживаемыми
Перемещение (rebase)
Коммит 1 Коммит 2 Коммит 3Коммит 4
HEAD
Коммит 5
master
experiment
Коммит 1 Коммит 2 Коммит 3 Коммит 5 Коммит 6'
git rebase masterexperiment
master
HEAD
При перемещении изменяется история, создаются новые коммиты
Нельзя перемещать коммиты, которые уже существуют в общем репозитории
Коммит 6
Коммит 4'
Взаимодействие Git ↔ Subversion
Git-svn -двусторонний мост, позволяет использовать Git и Subversion совместно
git svn clone http://svn.webkit.org/repository/webkit -T trunk -b branches -t tags
.
.
.
git commitgit svn rebasegit svn dcommit
Создание веток в Subversion
git svn branch testing
Полный переход на Git
git svn clone http://svn.webkit.org/repository/webkit --no-metadata
Флаг --no-metadata обрывает связь с SVN репозиторием
Работа с удалёнными репозиториями
Поддерживаемые протоколы:
https://github.com/github/githttp://github.com/jcnetdev/yubnub.gitgit://github.com/sitaramc/gitolite.gituser@server:/path.git /home/user/projectfile:///home/user/project
ssh, git, http, https, ftp, ftps и rsync
Работа с удалёнными репозиториями
Команда “git remote” управляет списком удалённых репозиториев.Каждый репозиторий равноценно используется для получения и отправки данных
push push
pull
push
push
pull
Распределённая работа с Git
Модель организации с центральным репозиторием
Центральныйрепозиторий
Вася Петя Паша
Распределённая работа с Git
Модель организации с менеджером по интеграции
Священныйрепозиторий
Менеджер поинтеграции
Открытыйрепозиторий
Васи
Открытыйрепозиторий
Пети
Открытыйрепозиторий
Паши
Личныйрепозиторий
Васи
Личныйрепозиторий
Пети
Личныйрепозиторий
Паши
Распределённая работа с Git
Диктатор и лейтенанты
СвященныйрепозиторийДиктатор
Лейтенант Лейтенант
разработчик разработчик разработчик разработчик разработчик
Распределённая работа с Git
Циклическая модель
Разработчик 1
Разработчик 2
Разработчик 3
Разработчик 4
Разработчик 5
Установка Git на сервер
Протокол Gitgit clone git://server:project.git
Преимущества:Самый быстрый протокол
Недостатки:
Отсутствие авторизации пользователей
Протокол HTTP(S)git clone http://example.com/gitproject.git
Преимущества:Простой в установке, используется любой web-сервер
Недостатки:
Не очень эффективен с клиентской стороны
Установка Git на сервер
Gitosis, Gitolite
Устанавливается на сервер, организует доступ к репозиторию через SSH протокол используя один логин.
Доступ предоставляется с помощью открытых ключей пользователей.
Предоставляет удобное управление открытыми ключами пользователей.
Устройство репозитория Git
~/project$ git initInitialized empty Git repository in ~/project/.git/git add readme.txt~/project$ git commit -am "initial rev"[master (root-commit) 9585139] initial rev 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 readme.txt~/project$ cd .git~/project/.git$ ls -altotal 52drwxr-xr-x 8 user user 4096 ./drwxr-xr-x 3 user user 4096 ../drwxr-xr-x 2 user user 4096 branches/-rw-r--r-- 1 user user 12 COMMIT_EDITMSG-rw-r--r-- 1 user user 92 config-rw-r--r-- 1 user user 73 description-rw-r--r-- 1 user user 23 HEADdrwxr-xr-x 2 user user 4096 hooks/-rw-r--r-- 1 user user 112 indexdrwxr-xr-x 2 user user 4096 info/drwxr-xr-x 3 user user 4096 logs/drwxr-xr-x 7 user user 4096 objects/drwxr-xr-x 4 user user 4096 refs/
Устройство репозитория Git
Весь репозиторий в папке .git/
branches/COMMIT_EDITMSGconfigdescriptionHEADhooks/indexinfo/logs/objects/refs/
Центральная часть
репозитория
Конфигурация
Скрипты для автоматизации
Список файлов для исключения (то же что и .gitignore)