- •Введение
 - •Об управлении версиями
 - •Локальные системы управления версиями
 - •Централизованные системы управления версиями
 - •Распределённые системы контроля версий
 - •Краткая история 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
 - •Удаление ссылок
 - •Протоколы передачи
 - •Тупой протокол
 - •Умный протокол
 - •Загрузка данных
 - •Скачивание данных
 - •Обслуживание и восстановление данных
 - •Обслуживание
 - •Восстановление данных
 - •Удаление объектов
 - •Итоги
 
Scott Chacon Pro Git  | 
	Раздел 6.6 Подмодули  | 
$ git log -1 rack
commit 85a3eee996800fcfa91e2119372dd4172bf76678 Author: Scott Chacon <schacon@gmail.com>
Date: Thu Apr 9 09:19:14 2009 -0700
added a submodule reference I will never make public. hahahahaha!
Азатем отправить этому человеку письмо со своими возмущениями.
6.6.3Суперпроекты
Иногда, разработчики хотят объединить подкаталоги крупного проекта в нечто связанное,
в зависимости от того, в какой они команде. Это типично для людей перешедших с CVS или
Subversion, где они определяли модуль или набор подкаталогов, и они хотят сохранить данный тип рабочего процесса.
Хороший способ сделать такое в Git — это сделать каждый из подкаталогов отдельным
Git-репозиторием, и создать Git-репозиторий для суперпроекта, который будет содержать несколько подмодулей. Преимущество такого подхода в том, что вы можете более гибко определять отношения между проектами при помощи меток и ветвей в суперпроектах.
6.6.4 Проблемы с подмодулями
Однако, использование подмодулей не обходится без загвоздок. Во-первых, вы должны быть относительно осторожны работая в каталоге подмодуля. Когда вы выполняете команду git submodule update, она возвращает определённую версию проекта, но не внутри ветви. Это называется состоянием с отделённым HEAD (detached HEAD) — это означает, что файл HEAD указывает на конкретный коммит, а не на символическую ссылку. Проблема в том,
что вы, скорее всего, не хотите работать в окружении с отделённым HEAD, потому что так легко потерять изменения. Если вы сделаете первоначальный submodule update, сделаете коммит в каталоге подмодуля не создавая ветки для работы в ней, и затем вновь выполните git submodule update из основного проекта, без создания коммита в суперпроекте, Git затрёт ваши изменения без предупреждения. Технически вы не потеряете проделанную работу, но у вас не будет ветки указывающей на неё, так что будет несколько сложновато её восстановить.
Для предотвращения этой проблемы, создавайте ветвь, когда работаете в каталоге подмодуля с использованием команды git checkout -b work или какой-нибудь аналогичной. Когда вы сделаете обновление подмодуля командой submodule update в следующий раз, она все же откатит вашу работу, но, по крайней мере, у вас будет указатель для возврата назад.
Переключение веток с подмодулями в них также может быть мудрёным. Если вы создадите новую ветку, добавите туда подмодуль и затем переключитесь обратно, туда где не было этого подмодуля, вы все ещё будете иметь каталог подмодуля в виде неотслеживаемого каталога:
$ git checkout -b rack Switched to a new branch "rack"
$ git submodule add git@github.com:schacon/rack.git rack Initialized empty Git repository in /opt/myproj/rack/.git/
179
Глава 6 Инструменты Git  | 
	Scott Chacon Pro Git  | 
...
Receiving objects: 100% (3184/3184), 677.42 KiB | 34 KiB/s, done. Resolving deltas: 100% (1952/1952), done.
$ git commit -am 'added rack submodule' [rack cc49a69] added rack submodule
2 files changed, 4 insertions(+), 0 deletions(-) create mode 100644 .gitmodules
create mode 160000 rack $ git checkout master
Switched to branch "master" $ git status
#On branch master
#Untracked files:
#(use "git add <file>..." to include in what will be committed)
#rack/
Вы будете вынуждены либо переместить каталог подмодуля в другое место, либо удалить его. В случае удаления вам потребуется клонировать его снова при переключении обратно,
и тогда вы можете потерять локальные изменения или ветки, которые не были отправлены в основной репозиторий.
Последняя проблема, которая возникает у многих, и о которой стоит предостеречь, возникает при переходе от подкаталогов к подмодулям. Если вы держали некоторые файлы под версионным контролем в своём проекте, а сейчас хотите перенести их в подмодуль, вам надо быть осторожным,
иначе Git разозлится на вас. Допустим, вы держите файлы rack в подкаталоге проекта, и вы хотите вынести его в подмодуль. Если вы просто удалите подкаталог и затем выполните submodule add, Git наорёт на вас:
$ rm -Rf rack/
$ git submodule add git@github.com:schacon/rack.git rack
'rack' already exists in the index
Вначале вам следует убрать каталог rack из индекса (убрать из под версионного контроля).
Потом можете добавить подмодуль:
$ git rm -r rack
$ git submodule add git@github.com:schacon/rack.git rack Initialized empty Git repository in /opt/testsub/rack/.git/ remote: Counting objects: 3184, done.
remote: Compressing objects: 100% (1465/1465), done. remote: Total 3184 (delta 1952), reused 2770 (delta 1675)
Receiving objects: 100% (3184/3184), 677.42 KiB | 88 KiB/s, done. Resolving deltas: 100% (1952/1952), done.
Теперь, предположим, вы сделали это в ветке. Если вы попытаетесь переключиться обратно на ту ветку, где эти файлы всё еще в актуальном дереве, а не в подмодуле, то вы получите такую
ошибку:
180
