Системы контроля версий
Кирилл Корняков (Intel, ННГУ)
4 Октябрь 2019
Содержание
- Системы контроля версий
- Git
- Модели рабочего процесса (командная работа)
- Заключение
Тест Джоэла
Joel Spolsky, August 09, 2000
Системы контроля версий
Системы контроля версий — это программные системы, хранящие несколько версий одного документа, и позволяющие вернуться к более ранним версиям.
- История изменений
- Откат дефектных изменений
- Извлечение кода "из прошлого" (как оно раньше работало?)
- Поиск ошибок сравнением (кто виноват?)
- Централизованное хранение
- Актуальное и используемое всеми участниками (где последняя версия?!)
- Защищенное, с разграничением прав доступа
Машина времени и сетевое хранилище в одном флаконе!
А нужны ли специальные инструменты? Вспоминаем Sharepoint, tarballs.
StackOverflow Survey 2018
Патчи
Патч (англ. patch — заплатка) — информация, предназначенная для автоматизированного внесения определённых изменений в компьютерные файлы.
Unified diff format: @@ -l,s +l,s @@ optional section heading
Отображение в командной строке
Патчи
- Патч — это простой текстовый файл, его можно наложить при помощи инструментов (
patch
).
- Один патч может содержать изменения сразу нескольких файлов в разных директориях.
- Люди могут обмениваться изменениями, посылая друг другу патчи.
- Патч — это атомарное изменение проекта!
Патчи и СКВ
- СКВ — это своего рода БД патчей, ее называют репозиторием.
- Патчи, помещенные в СКВ называются commit.
- Последовательности commit называются changeset.
История изменений
ddc4a1d — Readme bug fixes.
- README.md
f9e76e6 — Remove dummy implementation
- include/filters.hpp
- samples/matrix_sample.cpp
- src/filters_dummy.cpp
- src/filters_fabrics.cpp
- test/filters_test.cpp
aa1611b — Switch from strings to enums
- include/filters.hpp
- samples/matrix_sample.cpp
- src/filters_fabrics.cpp
- test/filters_test.cpp
8e8b21b — Add some error checking
- include/filters.hpp
- src/filters_fabrics.cpp
- test/filters_test.cpp
|
Последовательность патчей — это полная история проекта. |
Визуализация истории изменений
- https://www.youtube.com/watch?v=8nIvLK32faA
- Сделано при помощи gource
Три поколения СКВ
First |
None |
One file at a time |
Locks |
RCS, SCCS |
Second |
Centralized |
Multi-file |
Merge before commit |
CVS, Subversion, SourceSafe, Team Foundation Server |
Third |
Distributed |
Changesets |
Commit before merge |
Git, Mercurial, Bazaar |
Eric Sink "A History of Version Control"
Три поколения СКВ: Локальные
- Примеры: RCS, SCCS
- Организация одновременной работы: locks
Три поколения СКВ: Централизованные
- Примеры: Subversion, CVS
- Организация одновременной работы: merge before commit
Три поколения СКВ: Распределенные
- Примеры: Git, Mercurial
- Организация одновременной работы: commit before merge
Преимущества распределенных СКВ (DVCS)
- Допускают локальную работу (коммиты без наличия интернет)
- Упрощают слияние (а значит параллельную разработку)
- Дают максимальную свободу по организации рабочего процесса (workflow)
Благодаря этому, они фактически стали стандартом де-факто.
Компании и проекты, использующие Git
Git
|
- Разработан Линусом Торвальдсом для работы над ядром Linux в 2005 году.
- В настоящее время поддерживается Джунио Хамано, сотрудником Google.
- Не очень прост в освоении, однако очень быстрый и функциональный.
- Имеет наиболее "сильное" сообщество, инструментальную поддержку.
- Огромное количество информации в интернет: инструкции, уроки, статьи
- Официальный сайт проекта: http://www.git-scm.org.
|
Pro Git
|
- Лучшая книга про Git
- Доступна бесплатно
- Переведена на русский язык
- Единственный способ по-настоящему понять Git — это узнать как он работает
- Нужно прочесть хотя бы первые 100 страниц
|
Как сказал Евклид египетскому царю Птолемею:
«Царской дороги в геометрии нет!»
Triangular Workflow (GitHub)
$ cd mp2-lab1-bitfield
$ git remote -v
origin https://github.com/kirill-kornyakov/mp2-lab1-bitfield.git (fetch)
origin https://github.com/kirill-kornyakov/mp2-lab1-bitfield.git (push)
upstream https://github.com/UNN-VMK-Software/mp2-lab1-bitfield.git (fetch)
upstream https://github.com/UNN-VMK-Software/mp2-lab1-bitfield.git (push)
Инструкция по работе с Git / GitHub
- Предварительные действия
- Инсталляция клиента Git (
git help
)
- Конфигурация Git (
git config
)
- Первичное получение исходных кодов
- Регистрация на GitHub
- Создание форка центрального репозитория
- Клонирование форка к себе на локальную машину (
git clone
)
- Конфигурация удаленного репозитория (
git remote -v
)
- Просмотр истории (
git log
, git show
)
- Рабочий цикл (многократно)
- Опциональное получение обновлений из удаленного сервера (
git pull
)
- Создание новой ветки (
git branch
, git checkout -b
)
- Модификация файлов
- Анализ изменений (
git status
, git diff
)
- Регистрация изменений (
git add
, git commit
)
- Отправка изменений на удаленный сервер (
git push
)
Демонстрация
План демонстрации
- Клонирование
- Просмотр истории
git log --graph
git show HASH
- Рабочий цикл
- Создание новой ветки
git checkout -b
- Добавление коммитов в нее
git commit
- Сравнение с
master
: git diff
- Публикация на GitHub (
git push
)
- Вливание в
master
, удаление ветки
Git objects
- По сути это внутреннее представление патча
- Пользователю приходится работать только с коммитами (слава богу!)
Показать содержимое коммита:
$ git show --raw dc2ca9d95c
commit dc2ca9d95cbd5586e9e5ef0fe1ce7db91ea7d3d1
Author: Daniil Osokin <daniil.osokin@itseez.com>
Date: Sun Aug 16 14:35:44 2015 +0300
Switched to factory
:100644 100644 afadff2... bde857e... M README.md
:100644 000000 c977bf3... 0000000... D src/filters_fabrics.cpp
:000000 100644 0000000... c977bf3... A src/filters_factory.cpp
Git commits
Вывести историю изменений:
$ git log
commit aaa321be9191da60ad52c2bc41bd749ed546b409
Merge: 98fce98 3c1d15a
Author: Valentina <valentina-kustikova@users.noreply.github.com>
Date: Thu Aug 13 10:14:47 2015 +0300
Merge pull request #11 from valentina-kustikova/master
Practice description (bug fixes).
commit 3c1d15a1bf366864593f2320fa9a0e6cf3586f52
Author: valentina-kustikova <valentina.kustikova@gmail.com>
Date: Thu Aug 13 10:08:59 2015 +0300
Practice description (bug fixes).
Понятие ветки (branch)
- Ветка в Git'е — это просто указатель на один из коммитов.
- Есть соглашение, что имя
master
используется для ветки,
указывающей на последнее актуальное состояние проекта.
Вывести список существующих веток:
$ git branch
* master
Git branch
Создать новую ветку с именем testing
(указатель на коммит!):
$ git branch testing
Текущий список веток:
$ git branch
* master
testing
HEAD
HEAD
— специальный указатель, ссылающийся на локальную ветку, на которой вы находитесь.
- Это просто алиас (псевдоним) для текущей ветки, введенный для удобства.
Git checkout
Извлечь состояние репозитория, соответствующее ветке testing
:
$ git checkout testing
Вывести список существующих веток:
$ git branch
master
* testing
Три состояния файлов
Git commit
$ vim README.md
$ git add README.md
$ git commit -m 'Made a change'
Go back to master
Make a commit to master
$ vim main.cpp
$ git add main.cpp
$ git commit -m 'Made other changes'
# Или можно сделать так
$ git status
$ git commit -a -m 'Made other changes'
Merging
Merging
С6
— это так называемый merge commit
- Он основан не на каком-то патче, он указывает на состояние проекта,
в котором наложены патчи обоих ветвей (master
и testing
).
Merge Conflicts
- Возникают когда несколько участников отредактировали одинаковые строки,
или когда это произошло в разных ветках.
- Разрешаются человеком при помощи инструментов (
git mergetool
).
- В реальности довольно редкая ситуация, если соблюдать практики:
- Грамотное распределение задач
- Частые коммиты, много маленьких веток, частая интеграция
Multiple Branches
- Даже у одного разработчика может быть несколько активных веток.
- Правильно создавать отдельную ветку на каждую логически независимую задачу.
- Долгоживущие ветки — это неправильно, они быстро устаревают.
Centralized Workflow
Плюсы и минусы данного подхода?
Integration Manager Workflow
Плюсы и минусы данного подхода?
Dictator and Lieutenants Workflow
Современное состояние
- Использование в ИТ-проектах:
- Фундаментальный инструмент разработки
- Также используется для: файлы конфигурации, документация, тестовые данные и пр.
- Нестандартные применения Git
- Хранилище для веб-контента: GitHub pages, devtools page.
- Легковесная база данных.
- Git можно использовать программно при помощи libgit2, практически из любого популярного языка.
Резюме
- Системы контроля версий — центральный инструмент разработки
- Навигация по истории изменений
- Централизованный доступ
- Имеются и другие применения:
- Распределенные СКВ фактически стали стандартом. Их сильные стороны:
- Допускают локальные коммиты (без наличия интернет или доступа к серверу)
- Упрощают слияние (а значит параллельную разработку)
- Дают максимальную свободу по организации рабочего процесса (workflow)
- Git не самая простая в освоении СКВ, однако очень функциональная,
к тому же дает максимальную свободу по организации процесса разработки.
Контрольные вопросы
- Определение СКВ
- Основные функции/возможности современных СКВ
- Преимущества DVCS
Спасибо!
Вопросы?
Подумать
- Настройка работы с SSH-ключами