- •Введение
- •Об управлении версиями
- •Локальные системы управления версиями
- •Централизованные системы управления версиями
- •Распределённые системы контроля версий
- •Краткая история Git
- •Основы Git
- •Слепки вместо патчей
- •Почти все операции — локальные
- •Git следит за целостностью данных
- •Чаще всего данные в Git только добавляются
- •Три состояния
- •Установка Git
- •Установка из исходников
- •Установка в Linux
- •Установка на Mac
- •Установка в Windows
- •Первоначальная настройка Git
- •Имя пользователя
- •Выбор редактора
- •Утилита сравнения
- •Проверка настроек
- •Как получить помощь?
- •Итоги
- •Основы Git
- •Создание репозитория Git
- •Создание репозитория в существующем каталоге
- •Клонирование существующего репозитория
- •Запись изменений в репозиторий
- •Определение состояния файлов
- •Отслеживание новых файлов
- •Индексация измененных файлов
- •Игнорирование файлов
- •Просмотр индексированных и неиндексированных изменений
- •Фиксация изменений
- •Игнорирование индексации
- •Удаление файлов
- •Перемещение файлов
- •Просмотр истории коммитов
- •Ограничение вывода команды log
- •Использование графического интерфейса для визуализации истории
- •Отмена изменений
- •Изменение последнего коммита
- •Отмена индексации файла
- •Отмена изменений файла
- •Работа с удалёнными репозиторями
- •Отображение удалённых репозиториев
- •Добавление удалённых репозиториев
- •Fetch и Pull
- •Push
- •Инспекция удалённого репозитория
- •Удаление и переименование удалённых репозиториев
- •Работа с метками
- •Просмотр меток
- •Создание меток
- •Аннотированные метки
- •Подписанные метки
- •Легковесные метки
- •Верификация меток
- •Выставление меток позже
- •Обмен метками
- •Полезные советы
- •Автоматическое дополнение
- •Псевдонимы в Git
- •Итоги
- •Ветвление в Git
- •Что такое ветка?
- •Основы ветвления и слияния
- •Основы ветвления
- •Основы слияния
- •Основы конфликтов при слиянии
- •Управление ветками
- •Приемы работы с ветками
- •Долгоживущие ветки
- •Тематические ветки
- •Удалённые ветки
- •Отправка изменений
- •Отслеживание веток
- •Удаление веток на удалённом сервере
- •Перемещение
- •Основы перемещения
- •Более интересные перемещения
- •Возможные риски перемещения
- •Итоги
- •Git на сервере
- •Протоколы
- •Локальный протокол
- •Преимущества
- •Недостатки
- •Протокол SSH
- •Достоинства
- •Недостатки
- •Git-протокол
- •Достоинства
- •Недостатки
- •Протокол HTTP/S
- •Достоинства
- •Недостатки
- •Установка Git на сервер
- •Размещение «голого» репозитория на сервере
- •Малые установки
- •SSH доступ
- •Создание открытого SSH-ключа
- •Настраиваем сервер
- •Открытый доступ
- •GitWeb
- •Gitosis
- •Gitolite
- •Установка
- •Изменение параметров установки
- •Конфигурационный файл и правила контроля доступа
- •Продвинутый контроль доступа с запрещающими правилами
- •Ограничение push-ей на основе изменённых файлов
- •Персональные ветки
- •«Шаблонные» репозитории
- •Другие функции
- •Git-демон
- •Git-хостинг
- •GitHub
- •Настройка учётной записи
- •Создание нового репозитория
- •Импорт из Subversion
- •Добавление участников
- •Ваш проект
- •Ответвления проектов
- •Заключение о GitHub
- •Итоги
- •Распределённый Git
- •Распределённые рабочие процессы
- •Централизованный рабочий процесс
- •Рабочий процесс с менеджером по интеграции
- •Рабочий процесс с диктатором и его помощниками
- •Содействие проекту
- •Рекомендации по созданию коммитов
- •Отдельная маленькая команда
- •Отдельная команда с менеджером
- •Небольшой открытый проект
- •Большой открытый проект
- •Итоги
- •Сопровождение проекта
- •Работа с тематическими ветками
- •Применение патчей, отправленных по почте
- •Применение патчей с помощью команды apply
- •Применение патчей с помощью команды am
- •Проверка удалённых веток
- •Определение вносимых изменений
- •Интегрирование чужих наработок
- •Процессы слияния
- •Рабочие процессы с крупными слияниями
- •Рабочие процессы с перемещениями и отбором лучшего
- •Отметка релизов
- •Генерация номера сборки
- •Подготовка релиза
- •Команда shortlog
- •Итоги
- •Инструменты Git
- •Выбор ревизии
- •Одиночные ревизии
- •Сокращенный SHA
- •Небольшое замечание о SHA-1
- •Ссылки на ветки
- •RefLog-сокращения
- •Ссылки на предков
- •Диапазон коммитов
- •Две точки
- •Множество вершин
- •Три точки
- •Интерактивное индексирование
- •Добавление и удаление файлов из индекса
- •Индексирование по частям
- •Прятанье
- •Прятанье своих трудов
- •Откат применения спрятанных изменений
- •Создание ветки из спрятанных изменений
- •Перезапись истории
- •Изменение последнего коммита
- •Изменение сообщений нескольких коммитов
- •Переупорядочение коммитов
- •Уплотнение коммитов
- •Разбиение коммита
- •Крайнее средство: filter-branch
- •Удаление файла изо всех коммитов
- •Сделать подкаталог новым корнем
- •Отладка с помощью Git
- •Аннотация файла
- •Бинарный поиск
- •Подмодули
- •Начало использования подмодулей
- •Клонирование проекта с подмодулями
- •Суперпроекты
- •Проблемы с подмодулями
- •Слияние поддеревьев
- •Итоги
- •Настройка Git
- •Конфигурирование Git
- •Основные настройки клиента
- •core.editor
- •commit.template
- •core.pager
- •user.signingkey
- •core.excludesfile
- •help.autocorrect
- •Цвета в Git
- •color.ui
- •color.*
- •Внешние утилиты merge и diff
- •Форматирование и пробельные символы
- •core.autocrlf
- •core.whitespace
- •Настройка сервера
- •receive.fsckObjects
- •receive.denyNonFastForwards
- •receive.denyDeletes
- •Git-атрибуты
- •Бинарные файлы
- •Определение бинарных файлов
- •Получение дельты для бинарных файлов
- •Документы MS Word
- •Текстовые файлы в формате OpenDocument
- •Изображения
- •Развёртывание ключа
- •Экспорт репозитория
- •export-ignore
- •export-subst
- •Стратегии слияния
- •Перехватчики в Git
- •Установка перехватчика
- •Перехватчики на стороне клиента
- •Перехватчики для работы с коммитами
- •Другие клиентские перехватчики
- •Перехватчики на стороне сервера
- •update
- •Пример навязывания политики с помощью Git
- •Перехватчик на стороне сервера
- •Установка особого формата сообщений коммитов
- •Настройка системы контроля доступа для пользователей
- •Перехватчики на стороне клиента
- •Итоги
- •Git и Subversion
- •Настройка
- •Приступим к работе
- •Коммит в Subversion
- •Получение новых изменений
- •Проблемы с ветвлением в Git
- •Ветвление в Subversion
- •Создание новой ветки в SVN
- •Переключение активных веток
- •Команды Subversion
- •Просмотр истории в стиле SVN
- •SVN-Аннотации
- •Игнорирование того, что игнорирует Subversion
- •Заключение по Git-Svn
- •Миграция на Git
- •Импортирование
- •Subversion
- •Perforce
- •Собственная утилита для импорта
- •Итоги
- •Git изнутри
- •Сантехника и фарфор
- •Объекты в Git
- •Объекты-деревья
- •Объекты-коммиты
- •Хранение объектов
- •Ссылки в Git
- •HEAD
- •Метки
- •Ссылки на удалённые ветки
- •Pack-файлы
- •Спецификации ссылок
- •Спецификации ссылок для команды push
- •Удаление ссылок
- •Протоколы передачи
- •Тупой протокол
- •Умный протокол
- •Загрузка данных
- •Скачивание данных
- •Обслуживание и восстановление данных
- •Обслуживание
- •Восстановление данных
- •Удаление объектов
- •Итоги
Pro Git
Scott Chacon*
2012-08-31
*This is the PDF file for the Pro Git book contents. It is licensed under the Creative Commons AttributionNon Commercial-Share Alike 3.0 license. I hope you enjoy it, I hope it helps you learn Git, and I hope you’ll support Apress and me by purchasing a print copy of the book at Amazon: http://tinyurl.com/ amazonprogit
Содержание
1 Введение |
|
1 |
|
1.1 |
Об управлении версиями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
1 |
|
|
1.1.1 Локальные системы управления версиями . . . . . . . . . . . . . . . . . |
1 |
|
|
1.1.2 Централизованные системы управления версиями . . . . . . . . . . . . . |
2 |
|
|
1.1.3 Распределённые системы контроля версий . . . . . . . . . . . . . . . . . |
3 |
|
1.2 |
Краткая история Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
3 |
|
1.3 |
Основы Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
4 |
|
|
1.3.1 |
Слепки вместо патчей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
4 |
|
1.3.2 Почти все операции — локальные . . . . . . . . . . . . . . . . . . . . . . |
5 |
|
|
1.3.3 Git следит за целостностью данных . . . . . . . . . . . . . . . . . . . . . |
6 |
|
|
1.3.4 Чаще всего данные в Git только добавляются . . . . . . . . . . . . . . . . |
6 |
|
|
1.3.5 |
Три состояния . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
6 |
1.4 |
Установка Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
7 |
|
|
1.4.1 |
Установка из исходников . . . . . . . . . . . . . . . . . . . . . . . . . . . |
7 |
|
1.4.2 |
Установка в Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
8 |
|
1.4.3 |
Установка на Mac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
9 |
|
1.4.4 |
Установка в Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
9 |
1.5 |
Первоначальная настройка Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
9 |
|
|
1.5.1 |
Имя пользователя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
10 |
|
1.5.2 |
Выбор редактора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
10 |
|
1.5.3 |
Утилита сравнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
10 |
|
1.5.4 |
Проверка настроек . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
11 |
1.6 |
Как получить помощь? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
11 |
|
1.7 |
Итоги |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
12 |
2 Основы Git |
|
13 |
2.1 Создание репозитория Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
13 |
|
2.1.1 Создание репозитория в существующем каталоге . . . . . . . . . . . . . |
13 |
|
2.1.2 |
Клонирование существующего репозитория . . . . . . . . . . . . . . . . |
14 |
2.2 Запись изменений в репозиторий . . . . . . . . . . . . . . . . . . . . . . . . . . . |
15 |
|
2.2.1 |
Определение состояния файлов . . . . . . . . . . . . . . . . . . . . . . . |
15 |
2.2.2 |
Отслеживание новых файлов . . . . . . . . . . . . . . . . . . . . . . . . . |
16 |
2.2.3 |
Индексация измененных файлов . . . . . . . . . . . . . . . . . . . . . . . |
17 |
2.2.4 |
Игнорирование файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
18 |
2.2.5 Просмотр индексированных и неиндексированных изменений . . . . . . |
19 |
|
2.2.6 |
Фиксация изменений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
22 |
iii
|
2.2.7 |
Игнорирование индексации . . . . . . . . . . . . . . . . . . . . . . . . . |
23 |
|
2.2.8 |
Удаление файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
24 |
|
2.2.9 |
Перемещение файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
25 |
2.3 |
Просмотр истории коммитов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
26 |
|
|
2.3.1 Ограничение вывода команды log . . . . . . . . . . . . . . . . . . . . . . |
30 |
|
|
2.3.2 |
Использование графического интерфейса для визуализации истории . . |
31 |
2.4 |
Отмена изменений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
32 |
|
|
2.4.1 |
Изменение последнего коммита . . . . . . . . . . . . . . . . . . . . . . . |
32 |
|
2.4.2 |
Отмена индексации файла . . . . . . . . . . . . . . . . . . . . . . . . . . |
32 |
|
2.4.3 |
Отмена изменений файла . . . . . . . . . . . . . . . . . . . . . . . . . . . |
33 |
2.5 |
Работа с удалёнными репозиторями . . . . . . . . . . . . . . . . . . . . . . . . . |
34 |
|
|
2.5.1 |
Отображение удалённых репозиториев . . . . . . . . . . . . . . . . . . . |
34 |
|
2.5.2 |
Добавление удалённых репозиториев . . . . . . . . . . . . . . . . . . . . |
35 |
|
2.5.3 |
Fetch и Pull . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
36 |
|
2.5.4 |
Push . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
37 |
|
2.5.5 |
Инспекция удалённого репозитория . . . . . . . . . . . . . . . . . . . . . |
37 |
|
2.5.6 Удаление и переименование удалённых репозиториев . . . . . . . . . . . |
38 |
|
2.6 |
Работа с метками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
39 |
|
|
2.6.1 |
Просмотр меток . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
39 |
|
2.6.2 |
Создание меток . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
39 |
|
2.6.3 |
Аннотированные метки . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
39 |
|
2.6.4 |
Подписанные метки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
40 |
|
2.6.5 |
Легковесные метки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
41 |
|
2.6.6 |
Верификация меток . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
41 |
|
2.6.7 |
Выставление меток позже . . . . . . . . . . . . . . . . . . . . . . . . . . |
42 |
|
2.6.8 |
Обмен метками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
43 |
2.7 |
Полезные советы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
44 |
|
|
2.7.1 |
Автоматическое дополнение . . . . . . . . . . . . . . . . . . . . . . . . . |
44 |
|
2.7.2 |
Псевдонимы в Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
45 |
2.8 |
Итоги |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
46 |
3 Ветвление в Git |
47 |
||
3.1 |
Что такое ветка? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
47 |
|
3.2 |
Основы ветвления и слияния . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
52 |
|
|
3.2.1 |
Основы ветвления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
52 |
|
3.2.2 |
Основы слияния . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
56 |
|
3.2.3 Основы конфликтов при слиянии . . . . . . . . . . . . . . . . . . . . . . |
57 |
|
3.3 |
Управление ветками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
60 |
|
3.4 |
Приемы работы с ветками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
61 |
|
|
3.4.1 |
Долгоживущие ветки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
61 |
|
3.4.2 |
Тематические ветки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
62 |
3.5 |
Удалённые ветки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
63 |
|
|
3.5.1 |
Отправка изменений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
66 |
|
3.5.2 |
Отслеживание веток . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
67 |
|
3.5.3 Удаление веток на удалённом сервере . . . . . . . . . . . . . . . . . . . . |
68 |
|
3.6 |
Перемещение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
68 |
iv
|
3.6.1 |
Основы перемещения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
69 |
|
3.6.2 |
Более интересные перемещения . . . . . . . . . . . . . . . . . . . . . . . |
70 |
|
3.6.3 |
Возможные риски перемещения . . . . . . . . . . . . . . . . . . . . . . . |
73 |
3.7 |
Итоги |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
75 |
4 Git на сервере |
77 |
||
4.1 |
Протоколы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
77 |
|
|
4.1.1 |
Локальный протокол . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
78 |
|
|
Преимущества . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
78 |
|
|
Недостатки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
79 |
|
4.1.2 |
Протокол SSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
79 |
|
|
Достоинства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
79 |
|
|
Недостатки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
80 |
|
4.1.3 |
Git-протокол . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
80 |
|
|
Достоинства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
80 |
|
|
Недостатки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
80 |
|
4.1.4 |
Протокол HTTP/S . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
80 |
|
|
Достоинства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
81 |
|
|
Недостатки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
81 |
4.2 |
Установка Git на сервер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
82 |
|
|
4.2.1 |
Размещение «голого» репозитория на сервере . . . . . . . . . . . . . . . |
82 |
|
4.2.2 |
Малые установки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
83 |
|
|
SSH доступ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
83 |
4.3 |
Создание открытого SSH-ключа . . . . . . . . . . . . . . . . . . . . . . . . . . . |
84 |
|
4.4 |
Настраиваем сервер . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
85 |
|
4.5 |
Открытый доступ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
87 |
|
4.6 |
GitWeb |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
88 |
4.7 |
Gitosis |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
90 |
4.8 |
Gitolite |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
95 |
|
4.8.1 |
Установка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
95 |
|
4.8.2 |
Изменение параметров установки . . . . . . . . . . . . . . . . . . . . . . |
97 |
|
4.8.3 |
Конфигурационный файл и правила контроля доступа . . . . . . . . . . |
97 |
|
4.8.4 |
Продвинутый контроль доступа с запрещающими правилами . . . . . . |
98 |
|
4.8.5 |
Ограничение push-ей на основе изменённых файлов . . . . . . . . . . . |
99 |
|
4.8.6 |
Персональные ветки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
99 |
|
4.8.7 |
«Шаблонные» репозитории . . . . . . . . . . . . . . . . . . . . . . . . . |
100 |
|
4.8.8 |
Другие функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
100 |
4.9 |
Git-демон . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
101 |
|
4.10 |
Git-хостинг . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
103 |
|
|
4.10.1 |
GitHub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
103 |
|
4.10.2 |
Настройка учётной записи . . . . . . . . . . . . . . . . . . . . . . . . . . |
103 |
|
4.10.3 |
Создание нового репозитория . . . . . . . . . . . . . . . . . . . . . . . . |
105 |
|
4.10.4 |
Импорт из Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
106 |
|
4.10.5 |
Добавление участников . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
106 |
|
4.10.6 |
Ваш проект . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
108 |
|
4.10.7 |
Ответвления проектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
108 |
v
|
|
4.10.8 |
Заключение о GitHub . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . . 109 |
|
4.11 |
Итоги |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . . 109 |
5 |
Распределённый Git |
111 |
||
|
5.1 |
Распределённые рабочие процессы . . . . . . . . . . . . . . . . . . . . . |
. . . . 111 |
|
|
|
5.1.1 |
Централизованный рабочий процесс . . . . . . . . . . . . . . . . |
. . . . 111 |
|
|
5.1.2 |
Рабочий процесс с менеджером по интеграции . . . . . . . . . . . |
. . . . 112 |
|
|
5.1.3 |
Рабочий процесс с диктатором и его помощниками . . . . . . . . |
. . . . 113 |
|
5.2 |
Содействие проекту . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 114 |
|
|
|
5.2.1 |
Рекомендации по созданию коммитов . . . . . . . . . . . . . . . . |
. . . . 115 |
|
|
5.2.2 |
Отдельная маленькая команда . . . . . . . . . . . . . . . . . . . . |
. . . . 117 |
|
|
5.2.3 |
Отдельная команда с менеджером . . . . . . . . . . . . . . . . . . |
. . . . 122 |
|
|
5.2.4 |
Небольшой открытый проект . . . . . . . . . . . . . . . . . . . . |
. . . . 126 |
|
|
5.2.5 |
Большой открытый проект . . . . . . . . . . . . . . . . . . . . . . |
. . . . 130 |
|
|
5.2.6 |
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 133 |
|
5.3 |
Сопровождение проекта . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 133 |
|
|
|
5.3.1 |
Работа с тематическими ветками . . . . . . . . . . . . . . . . . . |
. . . . 133 |
|
|
5.3.2 |
Применение патчей, отправленных по почте . . . . . . . . . . . . |
. . . . 134 |
|
|
|
Применение патчей с помощью команды apply . . . . . . . |
. . . . 134 |
|
|
|
Применение патчей с помощью команды am . . . . . . . . |
. . . . 135 |
|
|
5.3.3 |
Проверка удалённых веток . . . . . . . . . . . . . . . . . . . . . . |
. . . . 137 |
|
|
5.3.4 |
Определение вносимых изменений . . . . . . . . . . . . . . . . . |
. . . . 138 |
|
|
5.3.5 |
Интегрирование чужих наработок . . . . . . . . . . . . . . . . . . |
. . . . 140 |
|
|
|
Процессы слияния . . . . . . . . . . . . . . . . . . . . . . |
. . . . 140 |
|
|
|
Рабочие процессы с крупными слияниями . . . . . . . . . |
. . . . 142 |
|
|
|
Рабочие процессы с перемещениями и отбором лучшего |
. . . . . 143 |
|
|
5.3.6 |
Отметка релизов . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 144 |
|
|
5.3.7 |
Генерация номера сборки . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 145 |
|
|
5.3.8 |
Подготовка релиза . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 146 |
|
|
5.3.9 |
Команда shortlog . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 146 |
|
5.4 |
Итоги |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 147 |
6 |
Инструменты Git |
149 |
||
|
6.1 |
Выбор ревизии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 149 |
|
|
|
6.1.1 |
Одиночные ревизии . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 149 |
|
|
6.1.2 |
Сокращенный SHA . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 149 |
|
|
6.1.3 |
Небольшое замечание о SHA-1 . . . . . . . . . . . . . . . . . . . |
. . . . 150 |
|
|
6.1.4 |
Ссылки на ветки . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 151 |
|
|
6.1.5 |
RefLog-сокращения . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 151 |
|
|
6.1.6 |
Ссылки на предков . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 153 |
|
|
6.1.7 |
Диапазон коммитов . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 154 |
|
|
|
Две точки . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 154 |
|
|
|
Множество вершин . . . . . . . . . . . . . . . . . . . . . . |
. . . . 155 |
|
|
|
Три точки . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 156 |
|
6.2 |
Интерактивное индексирование . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 157 |
|
|
|
6.2.1 |
Добавление и удаление файлов из индекса . . . . . . . . . . . . . |
. . . . 157 |
vi
|
6.2.2 |
Индексирование по частям . . . . . . . . . . . . . . . . . . . . . . . . . . |
159 |
6.3 |
Прятанье . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
161 |
|
|
6.3.1 |
Прятанье своих трудов . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
161 |
|
6.3.2 Откат применения спрятанных изменений . . . . . . . . . . . . . . . . . |
163 |
|
|
6.3.3 Создание ветки из спрятанных изменений . . . . . . . . . . . . . . . . . |
164 |
|
6.4 |
Перезапись истории . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
164 |
|
|
6.4.1 |
Изменение последнего коммита . . . . . . . . . . . . . . . . . . . . . . . |
164 |
|
6.4.2 Изменение сообщений нескольких коммитов . . . . . . . . . . . . . . . . |
165 |
|
|
6.4.3 |
Переупорядочение коммитов . . . . . . . . . . . . . . . . . . . . . . . . . |
167 |
|
6.4.4 |
Уплотнение коммитов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
168 |
|
6.4.5 |
Разбиение коммита . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
168 |
|
6.4.6 |
Крайнее средство: filter-branch . . . . . . . . . . . . . . . . . . . . . . . . |
169 |
|
|
Удаление файла изо всех коммитов . . . . . . . . . . . . . . . . . |
170 |
|
|
Сделать подкаталог новым корнем . . . . . . . . . . . . . . . . . |
170 |
|
|
Глобальное именение e-mail адреса . . . . . . . . . . . . . . . . . |
170 |
6.5 Отладка с помощью Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
171 |
||
|
6.5.1 |
Аннотация файла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
171 |
|
6.5.2 |
Бинарный поиск . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
172 |
6.6 |
Подмодули . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
174 |
|
|
6.6.1 |
Начало использования подмодулей . . . . . . . . . . . . . . . . . . . . . |
175 |
|
6.6.2 Клонирование проекта с подмодулями . . . . . . . . . . . . . . . . . . . |
177 |
|
|
6.6.3 |
Суперпроекты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
179 |
|
6.6.4 |
Проблемы с подмодулями . . . . . . . . . . . . . . . . . . . . . . . . . . |
179 |
6.7 |
Слияние поддеревьев . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
181 |
|
6.8 |
Итоги |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
183 |
7 Настройка Git |
185 |
||
7.1 |
Конфигурирование Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
185 |
|
|
7.1.1 |
Основные настройки клиента . . . . . . . . . . . . . . . . . . . . . . . . |
186 |
|
|
core.editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
186 |
|
|
commit.template . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
186 |
|
|
core.pager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
187 |
|
|
user.signingkey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
187 |
|
|
core.excludesfile . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
188 |
|
|
help.autocorrect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
188 |
|
7.1.2 |
Цвета в Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
188 |
|
|
color.ui . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
188 |
|
|
color.* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
189 |
|
7.1.3 Внешние утилиты merge и diff . . . . . . . . . . . . . . . . . . . . . . . . |
189 |
|
|
7.1.4 Форматирование и пробельные символы . . . . . . . . . . . . . . . . . . |
192 |
|
|
|
core.autocrlf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
192 |
|
|
core.whitespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
193 |
|
7.1.5 |
Настройка сервера . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
194 |
|
|
receive.fsckObjects . . . . . . . . . . . . . . . . . . . . . . . . . . . |
194 |
|
|
receive.denyNonFastForwards . . . . . . . . . . . . . . . . . . . . . |
194 |
|
|
receive.denyDeletes . . . . . . . . . . . . . . . . . . . . . . . . . . |
194 |
vii
7.2 |
Git-атрибуты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . . 195 |
|
|
7.2.1 |
Бинарные файлы . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 195 |
|
|
Определение бинарных файлов . . . . . . . . . . . . . . . |
. . . . 195 |
|
|
Получение дельты для бинарных файлов . . . . . . . . . . |
. . . . 196 |
|
|
Документы MS Word . . . . . . . . . . . . . . . . . . . . . |
. . . . 196 |
|
|
Текстовые файлы в формате OpenDocument . . . . . . . . |
. . . . 197 |
|
|
Изображения . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 198 |
|
7.2.2 |
Развёртывание ключа . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 199 |
|
7.2.3 |
Экспорт репозитория . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 202 |
|
|
export-ignore . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 202 |
|
|
export-subst . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 202 |
|
7.2.4 |
Стратегии слияния . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 203 |
7.3 |
Перехватчики в Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 203 |
|
|
7.3.1 |
Установка перехватчика . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 204 |
|
7.3.2 |
Перехватчики на стороне клиента . . . . . . . . . . . . . . . . . . |
. . . . 204 |
|
|
Перехватчики для работы с коммитами . . . . . . . . . . . |
. . . . 204 |
|
|
Перехватчики для работы с e-mail . . . . . . . . . . . . . . |
. . . . 205 |
|
|
Другие клиентские перехватчики . . . . . . . . . . . . . . |
. . . . 205 |
|
7.3.3 |
Перехватчики на стороне сервера . . . . . . . . . . . . . . . . . . |
. . . . 206 |
|
|
pre-receive и post-receive . . . . . . . . . . . . . . . . . . . |
. . . . 206 |
|
|
update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 206 |
7.4 Пример навязывания политики с помощью Git . . . . . . . . . . . . . . . |
. . . . 207 |
||
|
7.4.1 |
Перехватчик на стороне сервера . . . . . . . . . . . . . . . . . . . |
. . . . 207 |
|
|
Установка особого формата сообщений коммитов . . . . . |
. . . . 207 |
|
|
Настройка системы контроля доступа для пользователей |
. . . . . 209 |
|
|
Разрешение только обновлений-перемоток . . . . . . . . . |
. . . . 211 |
|
7.4.2 |
Перехватчики на стороне клиента . . . . . . . . . . . . . . . . . . |
. . . . 213 |
7.5 |
Итоги |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 217 |
8 Git и другие системы управления версиями |
219 |
||
8.1 |
Git и Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 219 |
|
|
8.1.1 |
git svn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 220 |
|
8.1.2 |
Настройка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 220 |
|
8.1.3 |
Приступим к работе . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 221 |
|
8.1.4 |
Коммит в Subversion . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 223 |
|
8.1.5 |
Получение новых изменений . . . . . . . . . . . . . . . . . . . . . |
. . . . 224 |
|
8.1.6 |
Проблемы с ветвлением в Git . . . . . . . . . . . . . . . . . . . . |
. . . . 226 |
|
8.1.7 |
Ветвление в Subversion . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 226 |
|
|
Создание новой ветки в SVN . . . . . . . . . . . . . . . . . |
. . . . 227 |
|
8.1.8 |
Переключение активных веток . . . . . . . . . . . . . . . . . . . . |
. . . . 227 |
|
8.1.9 |
Команды Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 228 |
|
|
Просмотр истории в стиле SVN . . . . . . . . . . . . . . . |
. . . . 228 |
|
|
SVN-Аннотации . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 228 |
|
|
Информация о SVN-сервере . . . . . . . . . . . . . . . . . |
. . . . 229 |
|
|
Игнорирование того, что игнорирует Subversion . . . . . . |
. . . . 229 |
|
8.1.10 |
Заключение по Git-Svn . . . . . . . . . . . . . . . . . . . . . . . . |
. . . . 230 |
viii
8.2 |
Миграция на Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
230 |
|
|
8.2.1 |
Импортирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
230 |
|
8.2.2 |
Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
230 |
|
8.2.3 |
Perforce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
232 |
|
8.2.4 Собственная утилита для импорта . . . . . . . . . . . . . . . . . . . . . . |
234 |
|
8.3 |
Итоги |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
240 |
9 Git изнутри |
|
241 |
|
9.1 |
Сантехника и фарфор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
241 |
|
9.2 |
Объекты в Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
242 |
|
|
9.2.1 |
Объекты-деревья . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
244 |
|
9.2.2 |
Объекты-коммиты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
247 |
|
9.2.3 |
Хранение объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
249 |
9.3 |
Ссылки в Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
250 |
|
|
9.3.1 |
HEAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
252 |
|
9.3.2 |
Метки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
253 |
|
9.3.3 Ссылки на удалённые ветки . . . . . . . . . . . . . . . . . . . . . . . . . |
254 |
|
9.4 |
Pack-файлы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
255 |
|
9.5 |
Спецификации ссылок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
258 |
|
|
9.5.1 Спецификации ссылок для команды push . . . . . . . . . . . . . . . . . . |
260 |
|
|
9.5.2 |
Удаление ссылок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
260 |
9.6 |
Протоколы передачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
260 |
|
|
9.6.1 |
Тупой протокол . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
260 |
|
9.6.2 |
Умный протокол . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
263 |
|
|
Загрузка данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
263 |
|
|
Скачивание данных . . . . . . . . . . . . . . . . . . . . . . . . . . |
264 |
9.7 |
Обслуживание и восстановление данных . . . . . . . . . . . . . . . . . . . . . . |
265 |
|
|
9.7.1 |
Обслуживание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
265 |
|
9.7.2 |
Восстановление данных . . . . . . . . . . . . . . . . . . . . . . . . . . . |
266 |
|
9.7.3 |
Удаление объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
269 |
9.8 |
Итоги |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
272 |
ix
Глава 1
Введение
Эта глава о том, как начать работу с Git. Сначала мы объясним основы инструментов управления версиями, затем — как запустить Git на вашей машине и наконец как настроить его, чтобы можно было работать. К концу главы вы будете понимать, для чего Git вообще сделан, почему вам следует пользоваться им, и будете уметь настраивать его.
1.1 Об управлении версиями
Что такое управление версиями, и зачем оно вам нужно? Система управления версиями
(СУВ) — это система, сохраняющая изменения в одном или нескольких файлах так, чтобы потом можно было восстановить определённые старые версии. Для примеров в этой книге мы будем использовать исходные коды программ, но на самом деле можно управлять версиями практически любых типов файлов.
Если вы графический или веб-дизайнер и хотите хранить каждую версию изображения или макета — вот это вам наверняка нужно — то пользоваться системой управления версиями будет очень мудрым решением. Она позволяет вернуть файлы к прежнему виду, вернуть к прежнему состоянию весь проект, сравнить изменения с какого-то времени, увидеть, кто последним изменял модуль, который дал сбой, кто создал проблему, и так далее. Вообще,
если, пользуясь СУВ, вы всё испортили или потеряли файлы, всё можно легко восстановить.
Кроме того, издержки на всё это будут очень маленькими.
1.1.1 Локальные системы управления версиями
Многие люди, чтобы управлять версиями, просто копируют файлы в другой каталог (умные ещё пишут текущую дату в название каталога). Такой подход очень распространён, потому что прост, но он ещё и чаще даёт сбои. Очень легко забыть, что ты не в том каталоге, и случайно изменить не тот файл, либо скопировать и перезаписать файлы не туда, куда хотел.
Чтобы решить эту проблему, программисты уже давно разработали локальные СУВ с простой базой данных, в которой хранятся все изменения нужных файлов (см. рисунок 1-1).
Одной из наиболее популярных СУВ данного типа является rcs, которая до сих пор устанавливается на многие компьютеры. Даже в современной операционной системе Mac OS X утилита rcs
устанавливается вместе с Developer Tools. Эта утилита основана на работе с наборами патчей между парами изменений (патч — файл, описывающий различие между файлами), которые
1
Глава 1 Введение |
Scott Chacon Pro Git |
Рисунок 1.1: Схема локальной СУВ.
хранятся в специальном формате на диске. Это позволяет пересоздать любой файл на любой момент времени, последовательно накладывая патчи.
1.1.2 Централизованные системы управления версиями
Следующей большой проблемой оказалась необходимость сотрудничать с разработчиками за другими компьютерами. Чтобы решить её, были созданы централизованные системы управления версиями (ЦСУВ). В таких системах, например CVS, Subversion и Perforce, есть центральный сервер, на котором хранятся все отслеживаемые файлы, и ряд клиентов, которые получают копии файлов из него. Много лет это был стандарт управления версиями (см. рис. 1-2).
Рисунок 1.2: Схема централизованного управления версиями.
Такой подход имеет множество преимуществ, особенно над локальными СУВ. К примеру,
все знают, кто и чем занимается в проекте. У администраторов есть чёткий контроль над тем,
кто и что может делать, и, конечно, администрировать ЦСУВ гораздо легче, чем локальные базы на каждом клиенте.
Однако при таком подходе есть и несколько серьёзных недостатков. Наиболее очевидный
— централизованный сервер является уязвимым местом всей системы. Если сервер выключается на час, то в течение часа разработчики не могут взаимодействовать, и никто не может сохранить новые версии. Если же повреждается диск с центральной базой данных и нет резервной копии,
2