Переход на распределённую
систему контроля версий из



                      mvasilyev@intersog.com
Развитие систем контроля
версий
 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
  При слиянии веток не используется история версий
        1       3       5       7
trunk


            2       4       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 "you@example.com"
 git config --global user.name "Your Name"
Начало работы с Git

 Инициализация нового репозитория
~/project$ git init
Initialized 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-src
Initialized 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 “вторая версия”
                                           V1
Метка с подписью
  git tag -s v3 -m “третья версия”



Метки можно использовать в “git push”
  git push origin v2

Отправка меток на сервер
  git push origin --tags                   V2
Ветвление

SVN - медленно                            Git - мгновенно




 В Subversion создание, слияние веток   В Git вся работа с ветками
 и переключение между ветками           происходит локально
 происходит через сеть
Ветвление

После нескольких коммитов ветка master (по умолчанию) указывает на
последний
                                   HEAD


                                    master



  Коммит 1        Коммит 2        Коммит 3



 состояние 1     cостояние 2     состояние 3



HEAD – указатель на ветку, в которой мы находимся
Ветвление

Создание новой ветки
 git branch testing
                                  HEAD


                                  master



  Коммит 1            Коммит 2   Коммит 3



                                  testing
Ветвление

Переключение в новую ветку
 git checkout testing



                               master



  Коммит 1         Коммит 2   Коммит 3



                               testing



                               HEAD
Ветвление

Изменения в новой ветке
 git commit



                              master



  Коммит 1        Коммит 2   Коммит 3



                                        Коммит 4


                                         testing


                                         HEAD
Ветвление

Переключение в ветку master
 git checkout master
                               HEAD



                               master



  Коммит 1         Коммит 2   Коммит 3



                                         Коммит 4


                                          testing
Ветвление

Изменения в ветке master
 git commit
                                         HEAD



                                         master


                                        Коммит 5
  Коммит 1        Коммит 2   Коммит 3



                                        Коммит 4


                                         testing
Ветвление

 Изменения в ветке master
  git commit
                                                   HEAD



                                                   master


                                       Коммит 5   Коммит 6
Коммит 1       Коммит 2     Коммит 3



                                       Коммит 4


                                        testing
Ветвление

 Слияние веток
  git merge testing
                                               HEAD



                                               master


                                   Коммит 5   Коммит 6
Коммит 1     Коммит 2   Коммит 3



                                   Коммит 4


                                    testing
Ветвление

 Слияние веток
  git merge testing
                                                          HEAD



                                                          master


                                   Коммит 5   Коммит 6   Коммит 7
Коммит 1     Коммит 2   Коммит 3



                                   Коммит 4


                                    testing
Ветвление

Конфликты при слиянии веток
 git merge testing
 Auto-merging readme.txt
 CONFLICT (content): Merge conflict in readme.txt
 Automatic merge failed; fix conflicts and then commit the result.


Типы веток

 Долгоживущие
     master

 Тематические
    ticket1234

 Удалённые (remote)
     origin/master
     origin2/testing
 Удалённые ветки бывают отслеживаемыми
Перемещение (rebase)
                                                      HEAD

                                                    experiment

                                        Коммит 4     Коммит 6
Коммит 1     Коммит 2     Коммит 3

                                        Коммит 5

                                         master                     HEAD
git rebase master
                                                                  experiment

Коммит 1     Коммит 2     Коммит 3      Коммит 5     Коммит 4'    Коммит 6'

                                         master

При перемещении изменяется история, создаются новые коммиты

Нельзя перемещать коммиты, которые уже существуют в общем репозитории
Взаимодействие
Git ↔ Subversion
Git-svn -двусторонний мост, позволяет использовать Git и Subversion совместно
git svn clone http://svn.webkit.org/repository/webkit -T trunk -b branches -t tags
  .
  .
  .
git commit
git svn rebase
git svn dcommit

Создание веток в Subversion
git svn branch testing


Полный переход на Git
git svn clone http://svn.webkit.org/repository/webkit --no-metadata


Флаг --no-metadata обрывает связь с SVN репозиторием
Работа с удалёнными
репозиториями

Поддерживаемые
протоколы:
 ssh, git, http, https, ftp, ftps и rsync




https://github.com/github/git
http://github.com/jcnetdev/yubnub.git
git://github.com/sitaramc/gitolite.git
user@server:/path.git 
/home/user/project
file:///home/user/project
Работа с удалёнными
репозиториями

Команда “git remote” управляет списком удалённых репозиториев.
Каждый репозиторий равноценно используется для получения и
отправки данных


                        pull




                                                pu
                               pull
         pu




                                                  sh
           sh                           sh
                                      pu


                                         push
Распределённая работа с Git

       Модель организации с центральным репозиторием



                         Центральный
                         репозиторий




    Вася                     Петя                      Паша
Распределённая работа с Git

             Модель организации с менеджером по интеграции

                        Открытый           Открытый           Открытый
   Священный
                       репозиторий        репозиторий        репозиторий
   репозиторий
                          Васи               Пети               Паши




                         Личный             Личный             Личный
  Менеджер по
                       репозиторий        репозиторий        репозиторий
   интеграции
                          Васи               Пети               Паши
Распределённая работа с Git

                           Диктатор и лейтенанты


                                                   Священный
              Диктатор                             репозиторий




      Лейтенант            Лейтенант




разработчик      разработчик    разработчик    разработчик       разработчик
Распределённая работа с Git

       Циклическая модель



                            Разработчик 2

  Разработчик 1


                                                  Разработчик 3




       Разработчик 5

                                       Разработчик 4
Установка Git на сервер
Протокол Git
   git clone git://server:project.git
Преимущества:
   Самый быстрый протокол
Недостатки:
   Отсутствие авторизации пользователей


Протокол HTTP(S)
   git clone http://example.com/gitproject.git

Преимущества:
   Простой в установке, используется любой web-сервер
Недостатки:
   Не очень эффективен с клиентской стороны
Установка Git на сервер

Gitosis, Gitolite
Устанавливается на сервер, организует доступ к
репозиторию через SSH протокол используя один логин.

Доступ предоставляется с помощью открытых ключей
пользователей.

Предоставляет удобное управление открытыми ключами
пользователей.
Устройство репозитория Git
~/project$ git init
Initialized 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 -al
total 52
drwxr-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 HEAD
drwxr-xr-x 2 user user 4096 hooks/
-rw-r--r-- 1 user user 112 index
drwxr-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_EDITMSG
Центральная          config
   часть             description
репозитория          HEAD
                     hooks/           Скрипты для
                     index            автоматизации
                     info/
                     logs/
                     objects/
                     refs/             Список файлов
                                       для исключения
                                       (то же что и
                                       .gitignore)

Переход на Git из Subversion

  • 1.
    Переход на распределённую системуконтроля версий из mvasilyev@intersog.com
  • 2.
    Развитие систем контроля версий 1. Ручное копирование файлов 2012-02-01 2012-02-02 2012-02-03 2. Локальные системы контроля версий Для каждого файла хранится исходное состояние и RCS список изменений SCCS
  • 3.
    Системы контроля версий клиент-сервер Централизованыесистемы контроля версий ●CVS ●Subversion ●IBM Rational ClearCase ●MKS Integrity ●Perforce ●PVCS ●Microsoft Visual SourceSafe ●Microsoft Visual Studio Application Lifecycle Management
  • 4.
    Работа с централизоваными системамиконтроля версий ●Обмен файлами через центральный сервер ●История хранится на центральном сервере ●Клиентские компьютеры содержат только последнюю версию
  • 5.
    Работа с централизоваными системамиконтроля версий Контроль одновременного доступа к файлам Блокирование файлов на запись исключает конфликты, но уменьшает возможности одновременного редактирования
  • 6.
    Работа с централизоваными системамиконтроля версий Одновременное редактирование файла ? Приводит к конфликтам и необходимости их разрешения вручную
  • 7.
    Работа с веткамив Subversion При слиянии веток не используется история версий 1 3 5 7 trunk 2 4 6 bug1234 Центральный сервер – слабое место
  • 8.
    Распределённые системы контроля версий ●Git ●Mercurial ●Bazaar ●Darcs ●SVK ●Bit Keeper Каждый компьютер содержит копию репозитория
  • 9.
    Почему я выбрал Git? 1. Кроссплатформенность Linux Windows Mac OS X 2. Наличие удобных инструментов
  • 10.
    Почему я выбрал Git? 3. Скорость работы - Большая часть операций выполняется локально; - Скорость операций высокая; - Данные хранятся компактно (последняя версия + разница в сжатом виде; - Эффективно работает даже с бинарными файлами. 4. Распространённость
  • 11.
    Git Контекстно-адресуемая файловая система с интерфейсом для системы контроля версий Хранилище ключ-значение Подготовка к работе с Git git config --global user.email "you@example.com" git config --global user.name "Your Name"
  • 12.
    Начало работы сGit Инициализация нового репозитория ~/project$ git init Initialized 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-src Initialized 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.
  • 13.
    Жизненный цикл файловв Git 3 состояния файлов: 1. Сохранённый 2. Модифицированый 3. Индексированый
  • 14.
    Метки Метка – этоуказатель на коммит Создание легковесной метки git tag v1 Метка-аннотация (комментарий вводить обязательно) git tag -a v2 -m “вторая версия” V1 Метка с подписью git tag -s v3 -m “третья версия” Метки можно использовать в “git push” git push origin v2 Отправка меток на сервер git push origin --tags V2
  • 15.
    Ветвление SVN - медленно Git - мгновенно В Subversion создание, слияние веток В Git вся работа с ветками и переключение между ветками происходит локально происходит через сеть
  • 16.
    Ветвление После нескольких коммитовветка master (по умолчанию) указывает на последний HEAD master Коммит 1 Коммит 2 Коммит 3 состояние 1 cостояние 2 состояние 3 HEAD – указатель на ветку, в которой мы находимся
  • 17.
    Ветвление Создание новой ветки git branch testing HEAD master Коммит 1 Коммит 2 Коммит 3 testing
  • 18.
    Ветвление Переключение в новуюветку git checkout testing master Коммит 1 Коммит 2 Коммит 3 testing HEAD
  • 19.
    Ветвление Изменения в новойветке git commit master Коммит 1 Коммит 2 Коммит 3 Коммит 4 testing HEAD
  • 20.
    Ветвление Переключение в веткуmaster git checkout master HEAD master Коммит 1 Коммит 2 Коммит 3 Коммит 4 testing
  • 21.
    Ветвление Изменения в веткеmaster git commit HEAD master Коммит 5 Коммит 1 Коммит 2 Коммит 3 Коммит 4 testing
  • 22.
    Ветвление Изменения вветке master git commit HEAD master Коммит 5 Коммит 6 Коммит 1 Коммит 2 Коммит 3 Коммит 4 testing
  • 23.
    Ветвление Слияние веток git merge testing HEAD master Коммит 5 Коммит 6 Коммит 1 Коммит 2 Коммит 3 Коммит 4 testing
  • 24.
    Ветвление Слияние веток git merge testing HEAD master Коммит 5 Коммит 6 Коммит 7 Коммит 1 Коммит 2 Коммит 3 Коммит 4 testing
  • 25.
    Ветвление Конфликты при слиянииветок git merge testing Auto-merging readme.txt CONFLICT (content): Merge conflict in readme.txt Automatic merge failed; fix conflicts and then commit the result. Типы веток Долгоживущие master Тематические ticket1234 Удалённые (remote) origin/master origin2/testing Удалённые ветки бывают отслеживаемыми
  • 26.
    Перемещение (rebase) HEAD experiment Коммит 4 Коммит 6 Коммит 1 Коммит 2 Коммит 3 Коммит 5 master HEAD git rebase master experiment Коммит 1 Коммит 2 Коммит 3 Коммит 5 Коммит 4' Коммит 6' master При перемещении изменяется история, создаются новые коммиты Нельзя перемещать коммиты, которые уже существуют в общем репозитории
  • 27.
    Взаимодействие Git ↔ Subversion Git-svn-двусторонний мост, позволяет использовать Git и Subversion совместно git svn clone http://svn.webkit.org/repository/webkit -T trunk -b branches -t tags . . . git commit git svn rebase git svn dcommit Создание веток в Subversion git svn branch testing Полный переход на Git git svn clone http://svn.webkit.org/repository/webkit --no-metadata Флаг --no-metadata обрывает связь с SVN репозиторием
  • 28.
    Работа с удалёнными репозиториями Поддерживаемые протоколы: ssh, git, http, https, ftp, ftps и rsync https://github.com/github/git http://github.com/jcnetdev/yubnub.git git://github.com/sitaramc/gitolite.git user@server:/path.git  /home/user/project file:///home/user/project
  • 29.
    Работа с удалёнными репозиториями Команда“git remote” управляет списком удалённых репозиториев. Каждый репозиторий равноценно используется для получения и отправки данных pull pu pull pu sh sh sh pu push
  • 30.
    Распределённая работа сGit Модель организации с центральным репозиторием Центральный репозиторий Вася Петя Паша
  • 31.
    Распределённая работа сGit Модель организации с менеджером по интеграции Открытый Открытый Открытый Священный репозиторий репозиторий репозиторий репозиторий Васи Пети Паши Личный Личный Личный Менеджер по репозиторий репозиторий репозиторий интеграции Васи Пети Паши
  • 32.
    Распределённая работа сGit Диктатор и лейтенанты Священный Диктатор репозиторий Лейтенант Лейтенант разработчик разработчик разработчик разработчик разработчик
  • 33.
    Распределённая работа сGit Циклическая модель Разработчик 2 Разработчик 1 Разработчик 3 Разработчик 5 Разработчик 4
  • 34.
    Установка Git насервер Протокол Git git clone git://server:project.git Преимущества: Самый быстрый протокол Недостатки: Отсутствие авторизации пользователей Протокол HTTP(S) git clone http://example.com/gitproject.git Преимущества: Простой в установке, используется любой web-сервер Недостатки: Не очень эффективен с клиентской стороны
  • 35.
    Установка Git насервер Gitosis, Gitolite Устанавливается на сервер, организует доступ к репозиторию через SSH протокол используя один логин. Доступ предоставляется с помощью открытых ключей пользователей. Предоставляет удобное управление открытыми ключами пользователей.
  • 36.
    Устройство репозитория Git ~/project$git init Initialized 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 -al total 52 drwxr-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 HEAD drwxr-xr-x 2 user user 4096 hooks/ -rw-r--r-- 1 user user 112 index drwxr-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/
  • 37.
    Устройство репозитория Git Весь репозиторий в папке .git/ branches/ Конфигурация COMMIT_EDITMSG Центральная config часть description репозитория HEAD hooks/ Скрипты для index автоматизации info/ logs/ objects/ refs/ Список файлов для исключения (то же что и .gitignore)