Работа с исходным текстом
Передача файла:
diff и patch
patch -pN, diff -ru, .rej/.orig …
patchutils
Недостатки обмена патчами.
Задачи:
- Учёт версий
- Доступное хранение всего кода
- Поддержка совместной разработки
Учёт версий
SCCS (Source Code Control System, 1972г ) — маркировка файлов строковой константой (сохраняется в объектнике!)
- RCS + история изменений (с вычислением дельты)
Хранение кода и совместная разработка
Общее название — VCS (Version Control System)
- CVS + централизованный сервер-хранилище
- SVN = CVS «на стероидах»
- …
=> совместная работа
- Дисциплина
- Права доступа
- Просмотр истории
- В т. ч. по коммитерам
Дисциплина обновления хранилища
Малый цикл (локальная модификация):
- Редактирование (до некоторого промежуточного результата)
- Проверка того, что результат достигнут
Регистрация изменений (commit)
В случае централизованного сервера с общим доступом превращается в большой цикл:
Обновление рабочей копии(pull)
- Редактирование. Не имеет смысла без (1)
- Проверка
- Регистрация изменений. Не имеет смысла без (5)
Обновление хранилища (push).
Ветки
Большой цикл не всегда успешен => конфликт:
- Сделать commit побольше (когда всё готово)
- Как можно чаще синхронизовать
=> Собственные версии хранилища, branches (ветки)
- до некоторого коммита имеют общую историю
- далее ведутся как заблагорассудится
А обратно? => Слияние веток (merge). Дерево превращается в орграф.
- Алгоритмы слияния
Конфликты (формат diff3)
DVCS
Не заталкивать всё на сервер, а скачивать друг у друга?
- Bazaar
- Mercuirial
- Git
- Darcs
- Monotone
- …
Свойства:
- Полная локальная копия хранилища (+ы и -ы)
- Необходимость публикации
- Например,
- Поддержка малого цикла обновления
=> Одно изменение = один коммит
- Необходимость организации информационного пространства
теги (tags)
описание коммита (commit messages)
- аутентификация коммитеров (подпись)
Git
История: BitKeeper, Larry McVoy, Andrew Tridgell и Линус
Работа:
clone
Малый цикл: pull → (hack+ → add → commit)+
Исправление коммита git commit -amend
Публикация: push в своё публичное хранилище
Работа с произвольными исходниками:
git init
git add .
git commit -a -m "INITIAL"
git tag Start
- Малый цикл
Если не понравилось: git reset --hard Start и git clean -f
Создание патчей git fotmat-patch Start
Всякое:
Полезные команды: git am, git stash, git rebase [--interactive]…
инфраструктура: GitHub, Gitorius etc.; gitolite, gitosis etc.; gitweb
Материалы
Их туча.
http://ru.wikipedia.org/wiki/Git в разделе ссылки
Д/З
Склонировать какой-нибудь SVN-рапозиторий (например, DOSBox)
- Посмотреть историю изменений
Посмотреть на структуру каталогов (.svn в каждом каталоге)
Склонировать простой git-репозитарий (git://git.altlinux.org/people/george/packages/xfractint.git). Это исходники пакета, так что upstream лежит в подкаталоге xfractint/xfractint.
Приложить патч xfractint-20.04p10-patch (в корне репозитария)
- Откатить изменения
Попробовать приложить патч xfractint-20.04p09-patch и попробовать разобраться, отчего он не приложился
Склонировать простой git-репозитарий (http://git.altlinux.org/people/george/packages/?p=greed.git;a=summary), собрать находящуюся в нём программу (greed/greed, см. выше про исходник пакета)
- Посмотреть историю изменений, теги и ветки
посмотреть на структуру каталогов (.git в корне рапозитория)
- Сделать новую ветку, в которой поменять ширину поля с 80 на 64.
- Пронаблюдать типичный способ, как не надо писать программу. Узнать фамилию автора. Печалиться о несовершенстве мира.
- Смержить ветку с основной
Склонировать более сложный git-репозитарий (напр., https://github.com/timburks/nu)
- Посмотреть историю изменений и дерево коммитов
- Посмотреть все ветки (включая те, что на сервере)
- Поставить на свою машину какой-нибудь git-инструмент и насладиться деревом с ветками