Системы контроля версий

Кирилл Корняков (Intel, ННГУ)
4 Октябрь 2019

Содержание

  1. Системы контроля версий
  2. Git
  3. Модели рабочего процесса (командная работа)
  4. Заключение

Тест Джоэла

Joel Spolsky, August 09, 2000

Системы контроля версий

Системы контроля версий — это программные системы, хранящие несколько версий одного документа, и позволяющие вернуться к более ранним версиям.

  1. История изменений
    • Откат дефектных изменений
    • Извлечение кода "из прошлого" (как оно раньше работало?)
    • Поиск ошибок сравнением (кто виноват?)
  2. Централизованное хранение
    • Актуальное и используемое всеми участниками (где последняя версия?!)
    • Защищенное, с разграничением прав доступа


Машина времени и сетевое хранилище в одном флаконе!
А нужны ли специальные инструменты? Вспоминаем Sharepoint, tarballs.

StackOverflow Survey 2015

Stack Overflow Developer Survey 2015

StackOverflow Survey 2018

Патчи

Патч (англ. patch — заплатка) — информация, предназначенная для автоматизированного внесения определённых изменений в компьютерные файлы.

Unified diff format: @@ -l,s +l,s @@ optional section heading

Отображение на GitHub

Отображение в командной строке

Патчи

Патчи и СКВ

История изменений

ddc4a1dReadme bug fixes.

 - README.md

f9e76e6Remove dummy implementation

 - include/filters.hpp
 - samples/matrix_sample.cpp
 - src/filters_dummy.cpp
 - src/filters_fabrics.cpp
 - test/filters_test.cpp

aa1611bSwitch from strings to enums

 - include/filters.hpp
 - samples/matrix_sample.cpp
 - src/filters_fabrics.cpp
 - test/filters_test.cpp

8e8b21bAdd some error checking

 - include/filters.hpp
 - src/filters_fabrics.cpp
 - test/filters_test.cpp

Последовательность патчей — это полная история проекта.

Визуализация истории изменений

Три поколения СКВ

Generation Networking Operations Concurrency Examples

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"

Три поколения СКВ: Локальные

Три поколения СКВ: Централизованные

Три поколения СКВ: Распределенные

Преимущества распределенных СКВ (DVCS)

  1. Допускают локальную работу (коммиты без наличия интернет)
  2. Упрощают слияние (а значит параллельную разработку)
  3. Дают максимальную свободу по организации рабочего процесса (workflow)

Благодаря этому, они фактически стали стандартом де-факто.

Компании и проекты, использующие Git

Git

  • Разработан Линусом Торвальдсом для работы над ядром Linux в 2005 году.
  • В настоящее время поддерживается Джунио Хамано, сотрудником Google.
  • Не очень прост в освоении, однако очень быстрый и функциональный.
  • Имеет наиболее "сильное" сообщество, инструментальную поддержку.
  • Огромное количество информации в интернет: инструкции, уроки, статьи
  • Официальный сайт проекта: http://www.git-scm.org.

Pro Git

  • Лучшая книга про Git
  • Доступна бесплатно
  • Переведена на русский язык
  • Единственный способ по-настоящему понять Git — это узнать как он работает
  • Нужно прочесть хотя бы первые 100 страниц

Как сказал Евклид египетскому царю Птолемею:

«Царской дороги в геометрии нет!»

Atlassian SourceTree

Tortoise Git

GitHub Desktop

Command Line Interface!

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

  1. Предварительные действия
    1. Инсталляция клиента Git (git help)
    2. Конфигурация Git (git config)
  2. Первичное получение исходных кодов
    1. Регистрация на GitHub
    2. Создание форка центрального репозитория
    3. Клонирование форка к себе на локальную машину (git clone)
    4. Конфигурация удаленного репозитория (git remote -v)
    5. Просмотр истории (git log, git show)
  3. Рабочий цикл (многократно)
    1. Опциональное получение обновлений из удаленного сервера (git pull)
    2. Создание новой ветки (git branch, git checkout -b)
    3. Модификация файлов
    4. Анализ изменений (git status, git diff)
    5. Регистрация изменений (git add, git commit)
    6. Отправка изменений на удаленный сервер (git push)

Демонстрация

План демонстрации

  1. Клонирование
  2. Просмотр истории
    • git log --graph
    • git show HASH
  3. Рабочий цикл
    • Создание новой ветки 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 branch
* master

Git branch

Создать новую ветку с именем testing (указатель на коммит!):

$ git branch testing

Текущий список веток:

$ git branch
* master
  testing

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

$ git checkout 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

Merge Conflicts

Multiple Branches

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

Centralized Workflow

Плюсы и минусы данного подхода?

Integration Manager Workflow

Плюсы и минусы данного подхода?

Dictator and Lieutenants Workflow

Современное состояние

Резюме

  1. Системы контроля версий — центральный инструмент разработки
    • Навигация по истории изменений
    • Централизованный доступ
  2. Имеются и другие применения:
  3. Распределенные СКВ фактически стали стандартом. Их сильные стороны:
    • Допускают локальные коммиты (без наличия интернет или доступа к серверу)
    • Упрощают слияние (а значит параллельную разработку)
    • Дают максимальную свободу по организации рабочего процесса (workflow)
  4. Git не самая простая в освоении СКВ, однако очень функциональная,
    к тому же дает максимальную свободу по организации процесса разработки.

Контрольные вопросы

  1. Определение СКВ
  2. Основные функции/возможности современных СКВ
  3. Преимущества DVCS

Ссылки

  1. Wikipedia "Системы контроля версий".
  2. Pro Git by Scott Chacon.
  3. "Mercurial tutorial" by Joel Spolsky.

Спасибо!

Вопросы?

Подумать