- •Введение
 - •Об управлении версиями
 - •Локальные системы управления версиями
 - •Централизованные системы управления версиями
 - •Распределённые системы контроля версий
 - •Краткая история 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
 - •Удаление ссылок
 - •Протоколы передачи
 - •Тупой протокол
 - •Умный протокол
 - •Загрузка данных
 - •Скачивание данных
 - •Обслуживание и восстановление данных
 - •Обслуживание
 - •Восстановление данных
 - •Удаление объектов
 - •Итоги
 
Глава 2
Основы Git
Если вы хотите начать работать с Git, прочитав всего одну главу, то эта глава — то, что вам нужно. Здесь рассмотрены все базовые команды, необходимые вам для решения подавляющего большинства задач возникающих при работе с Git. После прочтения этой главы вы научитесь настраивать и инициализировать репозиторий, начинать и прекращать версионный контроль файлов, а также подготавливать и фиксировать изменения. Мы также продемонстрируем вам как настроить игнорирование отдельных файлов или их групп в Git, как быстро и просто отменить ошибочные изменения, как просмотреть историю вашего проекта и изменения между отдельными коммитами (commit), а также как выкладывать (push) и забирать (pull) изменения в/из удаленного (remote) репозитория.
2.1 Создание репозитория Git
Для создания репозитория Git существуют два основных подхода. Первый подход — импорт в Git уже существующего проекта или каталога. Второй — клонирование уже существующего репозитория с сервера.
2.1.1 Создание репозитория в существующем каталоге
Если вы собираетесь начать использовать Git для существующего проекта, то вам необходимо перейти в проектный каталог и в командной строке ввести
$ git init
Эта команда создает в текущем каталоге новый подкаталог с именем .git содержащий все необходимые файлы репозитория — основу репозитория Git. На этом этапе ваш проект еще не находится под версионным контролем. (В Главе 9 приведено подробное описание файлов содержащихся в только что созданном вами каталоге «.git»)
Если вы хотите добавить под версионный контроль существующие файлы (в отличие от пустого каталога), вам стоит проиндексировать эти файлы и осуществить первую фиксацию изменений. Осуществить это вы можете с помощью нескольких команд git add указывающих индексируемые файлы, а затем commit:
13
Глава 2 Основы Git  | 
	Scott Chacon Pro Git  | 
$ git add *.c
$ git add README
$ git commit -m 'initial project version'
Мы разберём, что делают эти команды чуть позже. На данном этапе, у вас есть репозиторий
Git с добавленными файлами и начальным коммитом.
2.1.2 Клонирование существующего репозитория
Если вы желаете получить копию существующего репозитория Git, например, проекта, в
котором вы хотите поучаствовать, то вам нужна команда git clone. Если вы знакомы с другими системами контроля версий, такими как Subversion, то заметите, что команда называется clone,
а не checkout. Это важное отличие — Git получает копию практически всех данных, что есть на сервере. Каждая версия каждого файла из истории проекта забирается (pulled) с сервера,
когда вы выполняете git clone. Фактически, если серверный диск выйдет из строя, вы можете использовать любой из клонов на любом из клиентов, для того чтобы вернуть сервер в то состояние, в котором он находился в момент клонирования (вы можете потерять часть
серверных правил (server-side hooks) и т.п., но все данные, помещённые под версионный контроль,
будут сохранены, подробнее см. в Главе 4).
Клонирование репозитория осуществляется командой git clone [url]. Например,
если вы хотите клонировать библиотеку Ruby Git, известную как Grit, вы можете сделать это следующим образом:
$ git clone git://github.com/schacon/grit.git
Эта команда создает каталог с именем «grit», инициализирует в нем каталог .git, скачивает все данные для этого репозитория и создает (checks out) рабочую копию последней версии.
Если вы зайдете в новый каталог grit, вы увидите в нем проектные файлы, пригодные для работы и использования. Если вы хотите клонировать репозиторий в каталог, отличный от grit, можно это указать в следующем параметре командной строки:
$ git clone git://github.com/schacon/grit.git mygrit
Эта команда делает все то же самое, что и предыдущая, только результирующий каталог будет назван mygrit.
Git реализует несколько транспортных протоколов, которые вы можете использовать. В
предыдущем примере использовался протокол git://, вы также можете встретить http(s)://
или user@server:/path.git, использующий протокол передачи SSH. В Главе 4 представлены все доступные варианты конфигурации сервера для доступа к вашему репозиторию Git, а
также их достоинства и недостатки.
14
