Статьи

Git лаконично: запись изменений

Поддержание серии «безопасных» ревизий проекта является основной функцией любой системы контроля версий. Git выполняет это путем записи снимков проекта. После записи снимка вы можете вернуться и просмотреть старые версии, восстановить их и экспериментировать, не боясь разрушить существующую функциональность.

Пользователи SVN и CVS должны заметить, что это принципиально отличается от реализации их системы. Обе эти программы записывают различия для каждого файла — инкрементную запись изменений в проекте. Напротив, снимки Git — это просто снимки . Каждый коммит содержит полную версию каждого файла, который он содержит. Это делает Git невероятно быстрым, так как состояние файла не нужно генерировать каждый раз, когда его запрашивают:

Рисунок 7: Запись полных снимков, а не различий между ревизиями
Запись полных снимков, а не различий между ревизиями

В этой главе описывается базовый рабочий процесс создания снимков с использованием рабочего каталога, области подготовки и фиксированной истории. Это основные компоненты контроля версий на основе Git.


Промежуточная область Git дает вам возможность организовать коммит до его добавления в историю проекта. Постановка — это процесс перемещения изменений из рабочего каталога в промежуточный снимок.

Рисунок 8: Компоненты, участвующие в постановке коммита
Компоненты, участвующие в постановке коммита

Это дает вам возможность выбирать связанные изменения из рабочего каталога, а не фиксировать все сразу. Это означает, что вы можете создавать логические снимки поверх хронологических . Это благо для разработчиков, поскольку оно позволяет им отделять действия по кодированию от действий по управлению версиями. Когда вы пишете функции, вы можете забыть прекратить их фиксацию в виде отдельных фрагментов. Затем, когда вы закончите сеанс кодирования, вы можете разделить изменения на столько коммитов, сколько захотите на этапе.

Чтобы добавить новые или измененные файлы из рабочего каталога в промежуточную область, используйте следующую команду:

1
git add <file>

Чтобы удалить файл из проекта, вам нужно добавить его в промежуточную область, как новый или измененный файл. Следующая команда установит удаление и остановит отслеживание файла, но не удалит файл из рабочего каталога:

1
git rm —cached <file>

Просмотр статуса вашего репозитория является одним из самых распространенных действий в Git. Следующая команда выводит состояние рабочего каталога и промежуточной области:

1
git status

Это приведет к появлению сообщения, похожего на следующее (некоторые разделы могут быть пропущены в зависимости от состояния вашего хранилища):

01
02
03
04
05
06
07
08
09
10
11
12
# On branch master
# Changes to be committed:
#
# new file: foobar.txt
#
# Changes not staged for commit:
#
# modified: foo.txt
#
# Untracked files:
#
# bar.txt

Первый раздел, «Изменения, которые должны быть зафиксированы» — это ваш подготовленный снимок. Если бы вы запустили git commit прямо сейчас, только эти файлы были бы добавлены в историю проекта. В следующем разделе перечислены отслеживаемые файлы, которые не будут включены в следующий коммит. Наконец, «неотслеживаемые файлы» содержат файлы в вашем рабочем каталоге, которые не были добавлены в хранилище.

Если вам нужна более подробная информация об изменениях в вашем рабочем каталоге или промежуточной области, вы можете сгенерировать diff с помощью следующей команды:

1
git diff

Это выводит diff каждого неустановленного изменения в вашем рабочем каталоге. Вы также можете сгенерировать diff всех поэтапных изменений с флагом --cached :

1
git diff —cached

Обратите внимание, что история проекта выходит за рамки состояния git status . Для отображения зафиксированных снимков вам понадобится git log .

Рисунок 9: Компоненты в области состояния git
Компоненты в области git status

Коммиты представляют каждую сохраненную версию проекта, что делает их атомным элементом управления версиями на основе Git. Каждый коммит содержит снимок проекта, информацию о вашем пользователе, дату, сообщение о коммите и контрольную сумму SHA-1 всего его содержимого:

1
2
3
4
5
commit b650e3bd831aba05fa62d6f6d064e7ca02b5ee1b
Author: john <[email protected]>
Date: Wed Jan 11 00:45:10 2012 -0600
 
    Some commit message

Эта контрольная сумма служит уникальным идентификатором коммита, а также означает, что коммит никогда не будет поврежден или непреднамеренно изменен без ведома Git об этом.

Поскольку область подготовки уже содержит желаемый набор изменений, фиксация не требует какого-либо участия рабочего каталога.

Рисунок 10: Компоненты, участвующие в создании снимка
Компоненты, участвующие в создании снимка

Чтобы зафиксировать промежуточный снимок и добавить его в историю текущей ветви, выполните следующее:

1
git commit

Вам будет представлен текстовый редактор и предложено «зафиксировать сообщение». Сообщения коммитов должны иметь следующую форму:

1
2
3
<commit summary in 50 characters or less.>
<blank line>
<detailed description of changes in this commit.>

Git использует первую строку для форматирования вывода журнала, исправлений по электронной почте и т. Д., Поэтому он должен быть кратким, но все же описывать весь набор изменений. Если вы не можете найти итоговую строку, это, вероятно, означает, что ваш коммит содержит слишком много несвязанных изменений. Вы должны вернуться и разделить их на отдельные коммиты. Сводка должна сопровождаться пустой строкой и подробным описанием изменений (например, почему вы внесли изменения, какому номеру билета соответствует).


Как и состояние хранилища, просмотр его истории является одной из самых распространенных задач в управлении версиями Git. Вы можете отобразить коммиты текущей ветки с помощью:

1
git log

Теперь у нас есть только два инструмента, которые нам нужны для проверки каждого компонента репозитория Git.

Рисунок 11: Вывод состояния git против журнала git
Вывод git status git log против git log

Это также дает нам естественную группировку команд:

  • Рабочая / рабочая директория: git add , git rm , git status
  • История git commit : git commit , git log

Git предоставляет множество вариантов форматирования для git log , некоторые из которых включены здесь. Чтобы отобразить каждый коммит в одной строке, используйте:

1
git log —oneline

Или, чтобы указать историю отдельного файла вместо всего хранилища, используйте:

1
git log —oneline <file>

Фильтрация вывода журнала также очень полезна, когда ваша история выходит за рамки одного коммита. Вы можете использовать следующее для отображения коммитов, содержащихся в <until> но не в <since>. Оба аргумента могут быть идентификатором фиксации, именем ветви или тегом:

1
git log <since>..<until>

Наконец, вы можете отобразить diffstat изменений в каждом коммите. Это полезно, чтобы увидеть, какие файлы были затронуты конкретным коммитом.

1
git log —stat

Для визуализации истории вы также можете посмотреть на команду gitk , которая на самом деле представляет собой отдельную программу, предназначенную для отображения ветвей. Запустите git help gitk для деталей.


Теги — это простые указатели на коммиты, и они невероятно полезны для добавления в закладки важных изменений, таких как публичные выпуски. Команда git tag может быть использована для создания нового тега:

1
git tag -a v1.0 -m «Stable release»

Опция -a указывает Git создать аннотированный тег, который позволяет вам записывать сообщение вместе с ним (указывается с -m ).

Выполнение той же команды без аргументов выведет список ваших существующих тегов:

1
git tag

Этот урок представляет собой главу от Git Succinctly , бесплатной электронной книги от команды Syncfusion .