Изменения

Презентация по VCS

8017 байтов добавлено, 16:29, 29 июня 2012
Нет описания правки
* Практика
** Feature Branch
** SVN
** Mercurial
** Git

== Контроль версий ==

Зачем?

* История на случай утери кода<br />(или, скажем, инфицирования)
* Неблокирующие совместные правки
* Code review
* Поддержка старых версий

== Локальные VCS ==

Простейший вариант — архивы или папочки со старыми версиями.<br />
''(не надо так делать)''

'''SCCS (1972), RCS (1985)'''.

<graph>
digraph local {
bgcolor=transparent;
rankdir=LR;
fontname=sans;
node [fontname=sans];
edge [fontname=sans];
v3 -> wc;
wc [label="Рабочая копия", fillcolor="#c3d8ff", shape=box, style="filled,rounded"];
subgraph cluster_vers {
rank=same;
center=10;
label="Хранилище версий";
bgcolor=white;
node [shape=box; style="filled,rounded"];
style=solid;
v1 -> v2;
v2 -> v3;
v1 [label="version 1", fillcolor="#97ffb8"];
v2 [label="version 2", fillcolor="#97ffb8"];
v3 [label="version 3", fillcolor="#97ffb8", style="filled,rounded", shape=box];
}
}
</graph>

== Diff, patch ==

[[File:Diff-screenshot.png|right|200px]]

* diff (1970) — подсчёт разницы между текстовыми файлами
*: [[rupedia:наибольшая общая подпоследовательность|Наибольшая общая подпоследовательность…]]
* patch (1984) — применение этих разниц — '''патчей'''
*: Автор — Лэрри Уолл (он же создатель Perl’а)

<div style="clear: both"></div>

== Централизованные VCS ==

* История версий хранится на центральном сервере
* Рабочие копии создаются на компьютерах разработчиков

'''CVS (1990), Subversion (2000).'''

<graph>
digraph centralized {
bgcolor=transparent;
rankdir=LR;
fontname=sans;
compound=true;
node [fontname=sans];
edge [fontname=sans];
subgraph cluster_srv {
label="Центральный сервер";
bgcolor="#e0e0e0";
subgraph cluster_vers {
center=10;
label="Хранилище версий";
bgcolor=white;
node [shape=box; style="filled,rounded"];
style=solid;
v1 -> v2;
v2 -> v3;
v1 [label="version 1", fillcolor="#97ffb8"];
v2 [label="version 2", fillcolor="#97ffb8"];
v3 [label="version 3", fillcolor="#97ffb8", style="filled,rounded", shape=box];
}
}
subgraph cluster_c1 {
label="Компьютер 1";
bgcolor=white;
wc [label="Рабочая копия", fillcolor="#c3d8ff", shape=box, style="filled,rounded"];
v3 -> wc [lhead=cluster_c1, ltail=cluster_vers, weight=0];
}
subgraph cluster_c2 {
label="Компьютер 2";
bgcolor=white;
wc2 [label="Рабочая копия 2", fillcolor="#c3d8ff", shape=box, style="filled,rounded"];
v3 -> wc2 [lhead=cluster_c2, ltail=cluster_vers, weight=0];
}
}
</graph>

== Распределённые VCS ==

* Каждая копия содержит всю историю ревизий
* Возможен обмен между любыми участниками
* Лёгкость ветвления и слияния

'''TLA (2001); Monotone, Darcs (2003); Git, Mercurial (2005); Bazaar (2007).'''

<graph>
digraph local {
bgcolor=transparent;
rankdir=BT;
fontname=sans;
compound=true;
node [fontname=sans];
edge [fontname=sans];

subgraph cluster_each {
label="<Каждый компьютер>";
bgcolor="#e0e0e0";
"рабочая копия" [fillcolor="#c3d8ff", shape=box, style="filled,rounded"];
repo [label=" репозиторий\lистория версий", shape=box, style="rounded,filled", fillcolor="#97ffb8"];
repo -> "рабочая копия";
}
}
</graph>

=== Пример ветвления — Feature Branches ===

Смысл: каждая доработка ''в отдельной ветке''.

[[Файл:TN-IShop-Revision-Graph.svg]]

=== Дерево доверия ===

Можно понимать как репозитории, можно — как ветки.

<graph>
digraph tree {
rankdir=BT;
compound=true;
node [fillcolor="#e0e0e0", shape=box, style="filled,rounded", fontname=sans];
prod [label="Продукт"];
test [label="Проверяющий"];
test -> prod;
M1 -> test;
M2 -> test;
C1 -> M1 [lhead=cluster_m];
C2 -> M1 [lhead=cluster_m];
C3 -> M2 [lhead=cluster_m];
C4 -> M2 [lhead=cluster_m];
C9 -> prod;
C9 [label="Доверенный разработчик"];
subgraph cluster_r {
label="Контрибьюторы";
fontname=sans;
style=solid;
C1; C2; C3; C4;
};
subgraph cluster_m {
label="Maintainer'ы";
fontname=sans;
style=solid;
M1; M2;
};
}
</graph>

=== Эмуляция централизации ===

Можно работать с DVCS, как с централизованной!

<twopi>
digraph x {
node [fillcolor="#e0e0e0", shape=box, style="filled,rounded", fontname=sans];
s [fillcolor="#ffe0e0", label="Сервер"];
u1 -> s;
u2 -> s;
u3 -> s;
u4 -> s;
u5 -> s;
}
</twopi>

== История VCS ==

…по большей части свободных.

<!-- <div style="margin: 10px; padding: 10px; float: left; box-shadow: 0 0 10px rgba(0,0,0,0.5); text-align: center"> -->
<graph>
digraph rcs {

rankdir = LR;
node [fillcolor="#fff0e0", style=filled, fontname=sans];
edge [fontname=sans];

node [shape=box, style="filled, rounded"];
lvcs [label="Локальные", fillcolor="#e0ffe0"];
cvcs [label="Централизованные", fillcolor="#e0f0ff"];
dvcs [label="Распределённые"];
lvcs -> cvcs [minlen=2];
cvcs -> dvcs [minlen=2];

node [shape=plaintext, style=solid];
1972 -> 1985 -> 1990 -> 1998 -> 2000 -> 2003 -> 2005 -> 2007;

node [shape=oval, style=filled];
SCCS [fillcolor="#e0ffe0"];
RCS [fillcolor="#e0ffe0"];
CVS [fillcolor="#e0f0ff"];
CVSnt [fillcolor="#e0f0ff"];
Subversion [fillcolor="#e0f0ff"];
SCCS -> BitKeeper [minlen=4];
SCCS -> RCS [label=free, style=dashed];
RCS -> CVS;
CVS -> Subversion [label="CVS done right", style=dashed, minlen=2];
CVS -> CVSnt;
Monotone -> Git [style=dashed];
Monotone -> Mercurial [style=dashed];
BitKeeper -> Git [style=dashed, minlen=2];
BitKeeper -> Mercurial [style=dashed, minlen=2];
tla [label="GNU Arch"];
CVS -> tla [style=dashed, minlen=2, label="альтернатива CVS"];
tla -> Baz;
tla -> darcs [style=dashed];
Baz -> Bazaar [style=dashed, minlen=2];

}
</graph>

=== История Git и Hg ===

[[File:Tux.svg|200px|right]]
* В 2000—2005 для ядра Linux использовался BitKeeper
* Анекдотичный «реверс-инжиниринг» привёл к отзыву бесплатной лицензии

<div style="clear:both"></div>

== Терминология ==

; Ревизия: одна версия проекта или файла.
; Метка, тег (tag): символьное имя какой-либо версии проекта.
; Ветка (branch): почти то же самое, но ей метится множество версий.
; trunk (svn), HEAD (cvs), master (git), mainline (bazaar): основная ветка.
; Репозиторий: хранилище версий.
; Рабочая копия, work copy: копия проекта, привязанная к какому-то репозиторию.
; Коммит, фиксация, checkin, commit: отправка изменений в репозиторий.
; Чекаут (checkout): получение версии из репозитория.
; Конфликты: внесённые в одну версию ''разные'' изменения одних и тех же частей кода.
; Патч: различия между файлами, пригодные к применению в автоматическом режиме.