- •Введение
 - •Об управлении версиями
 - •Локальные системы управления версиями
 - •Централизованные системы управления версиями
 - •Распределённые системы контроля версий
 - •Краткая история 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  | 
	Scott Chacon Pro Git  | 
коммитом. Указать коммит можно с помощью щелчка мышью.
2.4 Отмена изменений
На любой стадии может возникнуть необходимость что-либо отменить. Здесь мы рассмотрим несколько основных инструментов для отмены произведённых изменений. Будьте осторожны,
ибо не всегда можно отменить сами отмены. Это одно из немногих мест в Git, где вы можете потерять свою работу если сделаете что-то неправильно.
2.4.1 Изменение последнего коммита
Одна из типичных отмен происходит тогда, когда вы делаете коммит слишком рано, забыв добавить какие-то файлы, или напутали с комментарием к коммиту. Если вам хотелось бы сделать этот коммит ещё раз, вы можете выполнить commit с опцией --amend:
$ git commit --amend
Эта команда берёт индекс и использует его для коммита. Если после последнего коммита не было никаких изменений (например, вы запустили приведённую команду сразу после предыдущего
коммита), то состояние проекта будет абсолютно таким же и всё, что вы измените, это комментарий к коммиту.
Появится всё тот же редактор для комментариев к коммитам, но уже с введённым комментарием к последнему коммиту. Вы можете отредактировать это сообщение так же, как обычно, и оно перепишет предыдущее.
Для примера, если после совершения коммита вы осознали, что забыли проиндексировать изменения в файле, которые хотели добавить в этот коммит, вы можете сделать что-то подобное:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
Все три команды вместе дают один коммит — второй коммит заменяет результат первого.
2.4.2Отмена индексации файла
Вследующих двух разделах мы продемонстрируем, как переделать изменения в индексе и в рабочем каталоге. Приятно то, что команда, используемая для определения состояния этих двух вещей, дополнительно напоминает о том, как отменить изменения в них. Приведём пример. Допустим, вы внесли изменения в два файла и хотите записать их как два отдельных коммита, но случайно набрали git add * и проиндексировали оба файла. Как теперь отменить индексацию одного из двух файлов? Команда git status напомнит вам об этом:
32
Scott Chacon Pro Git  | 
	Раздел 2.4 Отмена изменений  | 
|
$ git  | 
	add .  | 
	
  | 
$ git  | 
	status  | 
	
  | 
#On branch master
#Changes to be committed:
#(use "git reset HEAD <file>..." to unstage)
#modified: README.txt
#modified: benchmarks.rb
#
Сразу после надписи «Changes to be committed», написано использовать git reset HEAD <file>... для исключения из индекса. Так что давайте последуем совету и отменим индексацию файла benchmarks.rb:
$ git reset HEAD benchmarks.rb benchmarks.rb: locally modified $ git status
#On branch master
#Changes to be committed:
#(use "git reset HEAD <file>..." to unstage)
#modified: README.txt
#Changed but not updated:
#(use "git add <file>..." to update what will be committed)
#(use "git checkout -- <file>..." to discard changes in working directory)
#modified: benchmarks.rb
#
Эта команда немного странновата, но она работает. Файл benchmarks.rb изменён, но снова
не в индексе.
2.4.3 Отмена изменений файла
Что, если вы поняли, что не хотите оставлять изменения, внесённые в файл benchmarks.rb?
Как быстро отменить изменения, вернуть то состояние, в котором он находился во время последнего коммита (или первоначального клонирования, или какого-то другого действия, после которого файл попал в рабочий каталог)? К счастью, git status говорит, как добиться и этого. В
выводе для последнего примера, неиндексированная область выглядит следующим образом:
#Changed but not updated:
#(use "git add <file>..." to update what will be committed)
#(use "git checkout -- <file>..." to discard changes in working directory)
#modified: benchmarks.rb
#
33
