Система управления версиями

Поделись знанием:
Перейти к: навигация, поиск

Система управления версиями (от англ. Version Control System, VCS или Revision Control System) — программное обеспечение для облегчения работы с изменяющейся информацией. Система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение, и многое другое.

Такие системы наиболее широко используются при разработке программного обеспечения для хранения исходных кодов разрабатываемой программы. Однако они могут с успехом применяться и в других областях, в которых ведётся работа с большим количеством непрерывно изменяющихся электронных документов. В частности, системы управления версиями применяются в САПР, обычно в составе систем управления данными об изделии (PDM). Управление версиями используется в инструментах конфигурационного управления (Software Configuration Management Tools).

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





Общие сведения

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

Традиционные системы управления версиями используют централизованную модель, когда имеется единое хранилище документов, управляемое специальным сервером, который и выполняет бо́льшую часть функций по управлению версиями. Пользователь, работающий с документами, должен сначала получить нужную ему версию документа из хранилища; обычно создаётся локальная копия документа, так называемая «рабочая копия». Может быть получена последняя версия или любая из предыдущих, которая может быть выбрана по номеру версии или дате создания, иногда и по другим признакам. После того, как в документ внесены нужные изменения, новая версия помещается в хранилище. В отличие от простого сохранения файла, предыдущая версия не стирается, а тоже остаётся в хранилище и может быть оттуда получена в любое время. Сервер может использовать т. н. дельта-компрессию — такой способ хранения документов, при котором сохраняются только изменения между последовательными версиями, что позволяет уменьшить объём хранимых данных. Поскольку обычно наиболее востребованной является последняя версия файла, система может при сохранении новой версии сохранять её целиком, заменяя в хранилище последнюю ранее сохранённую версию на разницу между этой и последней версией. Некоторые системы (например, ClearCase) поддерживают сохранение версий обоих видов: большинство версий сохраняется в виде дельт, но периодически (по специальной команде администратора) выполняется сохранение версий всех файлов в полном виде; такой подход обеспечивает максимально полное восстановление истории в случае повреждения репозитория.

Иногда создание новой версии выполняется незаметно для пользователя (прозрачно), либо прикладной программой, имеющей встроенную поддержку такой функции, либо за счёт использования специальной файловой системы. В этом случае пользователь просто работает с файлом, как обычно, и при сохранении файла автоматически создаётся новая версия.

Часто бывает, что над одним проектом одновременно работают несколько человек. Если два человека изменяют один и тот же файл, то один из них может случайно отменить изменения, сделанные другим. Системы управления версиями отслеживают такие конфликты и предлагают средства их решения. Большинство систем может автоматически объединить (слить) изменения, сделанные разными разработчиками. Однако такое автоматическое объединение изменений, обычно, возможно только для текстовых файлов и при условии, что изменялись разные (непересекающиеся) части этого файла. Такое ограничение связано с тем, что большинство систем управления версиями ориентированы на поддержку процесса разработки программного обеспечения, а исходные коды программ хранятся в текстовых файлах. Если автоматическое объединение выполнить не удалось, система может предложить решить проблему вручную.

Часто выполнить слияние невозможно ни в автоматическом, ни в ручном режиме, например, если формат файла неизвестен или слишком сложен. Некоторые системы управления версиями дают возможность заблокировать файл в хранилище. Блокировка не позволяет другим пользователям получить рабочую копию или препятствует изменению рабочей копии файла (например, средствами файловой системы) и обеспечивает, таким образом, исключительный доступ только тому пользователю, который работает с документом.

Многие системы управления версиями предоставляют ряд других возможностей:

  • Позволяют создавать разные варианты одного документа, т. н. ветки, с общей историей изменений до точки ветвления и с разными — после неё.
  • Дают возможность узнать, кто и когда добавил или изменил конкретный набор строк в файле.
  • Ведут журнал изменений, в который пользователи могут записывать пояснения о том, что и почему они изменили в данной версии.
  • Контролируют права доступа пользователей, разрешая или запрещая чтение или изменение данных, в зависимости от того, кто запрашивает это действие.

Типичный порядок работы с системой

Каждая система управления версиями имеет свои специфические особенности в наборе команд, порядке работы пользователей и администрировании. Тем не менее, общий порядок работы для большинства VCS совершенно стереотипен. Здесь предполагается, что проект, каким бы он ни был, уже существует и на сервере размещён его репозиторий, к которому разработчик получает доступ.

Начало работы с проектом

Первым действием, которое должен выполнить разработчик, является извлечение рабочей копии проекта или той его части, с которой предстоит работать. Это действие выполняется с помощью стандартной команды извлечения версии (checkout или clone) либо специальной команды, фактически выполняющей то же самое действие. Разработчик задаёт версию, которая должна быть скопирована, по умолчанию обычно копируется последняя (или выбранная администратором в качестве основной) версия.

По команде извлечения устанавливается соединение с сервером, и проект (или его часть — один из каталогов с подкаталогами) в виде дерева каталогов и файлов копируется на компьютер разработчика. Обычной практикой является дублирование рабочей копии: помимо основного каталога с проектом на локальный диск (либо в отдельный, специально выбранный каталог, либо в системные подкаталоги основного дерева проекта) дополнительно записывается ещё одна его копия. Работая с проектом, разработчик изменяет только файлы основной рабочей копии. Вторая локальная копия хранится в качестве эталона, позволяя в любой момент без обращения к серверу определить, какие изменения внесены в конкретный файл или проект в целом и от какой версии была «отпочкована» рабочая копия; как правило, любая попытка ручного изменения этой копии приводит к ошибкам в работе программного обеспечения VCS.

Ежедневный цикл работы

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

Обновление рабочей копии 
По мере внесения изменений в основную версию проекта рабочая копия на компьютере разработчика стареет: расхождение её с основной версией проекта увеличивается. Это повышает риск возникновения конфликтных изменений (см. ниже). Поэтому удобно поддерживать рабочую копию в состоянии, максимально близком к текущей основной версии, для чего разработчик выполняет операцию обновления рабочей копии (update) насколько возможно часто (реальная частота обновлений определяется частотой внесения изменений, зависящей от активности разработки и числа разработчиков, а также временем, затрачиваемым на каждое обновление — если оно велико, разработчик вынужден ограничивать частоту обновлений, чтобы не терять время).
Модификация проекта 
Разработчик модифицирует проект, изменяя входящие в него файлы в рабочей копии в соответствии с проектным заданием. Эта работа производится локально и не требует обращений к серверу VCS.
Фиксация изменений 
Завершив очередной этап работы над заданием, разработчик фиксирует (commit) свои изменения, передавая их на сервер (либо в основную ветвь, если работа над заданием полностью завершена, либо в отдельную ветвь разработки данного задания). VCS может требовать от разработчика перед фиксацией обязательно выполнить обновление рабочей копии. При наличии в системе поддержки отложенных изменений (shelving) изменения могут быть переданы на сервер без фиксации. Если утверждённая политика работы в VCS это позволяет, то фиксация изменений может проводиться не ежедневно, а только по завершении работы над заданием; в этом случае до завершения работы все связанные с заданием изменения сохраняются только в локальной рабочей копии разработчика.

Ветвления

Делать мелкие исправления в проекте можно путём непосредственной правки рабочей копии и последующей фиксации изменений прямо в главной ветви (в стволе) на сервере. Однако при выполнении объёмных работ такой порядок становится неудобным: отсутствие фиксации промежуточных изменений на сервере не позволяет работать над чем-либо в групповом режиме, кроме того, повышается риск потери изменений при локальных авариях и теряется возможность анализа и возврата к предыдущим вариантам кода в пределах данной работы. Поэтому для таких изменений обычной практикой является создание ветвей (branch), то есть «отпочковывание» от ствола в какой-то версии нового варианта проекта или его части, разработка в котором ведётся параллельно с изменениями в основной версии. Ветвь создаётся специальной командой. Рабочая копия ветви может быть создана заново обычным образом (командой извлечения рабочей копии, с указанием адреса или идентификатора ветви), либо путём переключения имеющейся рабочей копии на заданную ветвь.

Базовый рабочий цикл при использовании ветвей остаётся точно таким же, как и в общем случае: разработчик периодически обновляет рабочую копию (если с ветвью работает более одного человека) и фиксирует в ней свою ежедневную работу. Иногда ветвь разработки так и остаётся самостоятельной (когда изменения порождают новый вариант проекта, который далее развивается отдельно от основного), но чаще всего, когда работа, для которой создана ветвь, выполнена, ветвь реинтегрируется в ствол (основную ветвь). Это может делаться командой слияния (обычно merge), либо путём создания патча (patch), содержащего внесённые в ходе разработки ветви изменения и применения этого патча к текущей основной версии проекта.

Слияние версий

Три вида операций, выполняемых в системе управления версиями, могут приводить к необходимости объединения изменений. Это:

  • Обновление рабочей копии (изменения, сделанные в основной версии, сливаются с локальными).
  • Фиксация изменений (локальные изменения сливаются с изменениями, уже зафиксированными в основной версии).
  • Слияние ветвей (изменения, сделанные в одной ветви разработки, сливаются с изменениями, сделанными в другой).

Во всех случаях ситуация принципиально одинакова и имеет следующие характерные черты:

  1. Ранее была сделана копия дерева файлов и каталогов репозитория или его части.
  2. Впоследствии и в оригинальное дерево, и в копию были независимо внесены некоторые изменения.
  3. Требуется объединить изменения в оригинале и копии таким образом, чтобы не нарушить логическую связность проекта и не потерять данные.

Совершенно очевидно, что при невыполнении условия (2) (то есть если изменения были внесены только в оригинал или только в копию) объединение элементарно — достаточно скопировать изменённую часть туда, где изменений не было. В противном случае слияние изменений превращается в нетривиальную задачу, во многих случаях требующую вмешательства разработчика. В целом механизм автоматического слияния изменений работает, основываясь на следующих принципах:

  • Изменения могут состоять в модификации содержимого файла, создании нового файла или каталога, удалении или переименовании ранее существовавшего файла или каталога в проекте.
  • Если два изменения относятся к разным и не связанным между собой файлам и/или каталогам, они всегда могут быть объединены автоматически. Их объединение состоит в том, что изменения, сделанные в каждой версии проекта, копируются в объединяемую версию.
  • Создание, удаление и переименование файлов в каталогах проекта могут быть объединены автоматически, если только они не конфликтуют между собой. В этом случае изменения, сделанные в каждой версии проекта, копируются в объединяемую версию. Конфликтующими обычно являются:
    • Удаление и изменение одного и того же файла или каталога.
    • Удаление и переименование одного и того же файла или каталога (в случае, если система поддерживает операцию переименования).
    • Создание в разных версиях файла с одним и тем же именем и разным содержимым.
  • Изменения в пределах одного текстового файла, сделанные в разных версиях, могут быть объединены, если они находятся в разных местах этого файла и не пересекаются. В этом случае в объединённую версию вносятся все сделанные изменения.
  • Изменения в пределах одного файла, если он не является текстовым, всегда являются конфликтующими и не могут быть объединены автоматически.

Во всех случаях базовой версией для слияния является версия, в которой было произведено разделение сливаемых версий. Если это операция фиксации изменений, то базовой версией будет версия последнего обновления перед фиксацией, если обновление — то версия предыдущего обновления, если слияние ветвей — то версия, в которой была создана соответствующая ветвь. Соответственно, сопоставляемыми наборами изменений будут наборы изменений, сделанных от базовой до текущей версии во всех объединяемых вариантах.

Абсолютное большинство современных систем управления версиями ориентировано, в первую очередь, на проекты разработки программного обеспечения, в которых основным видом содержимого файла является текст. Соответственно, механизмы автоматического слияния изменений ориентируются на обработку текстовых файлов, то есть файлов, содержащих текст, состоящий из строк буквенно-цифровых символов, пробелов и табуляций, разделённых символами перевода строки.

При определении допустимости слияния изменений в пределах одного и того же текстового файла работает типовой механизм построчного сравнения текстов (примером его реализации является системная утилита GNU diff), который сравнивает объединяемые версии с базовой и строит список изменений, то есть добавленных, удалённых и заменённых наборов строк. Минимальной единицей данных для этого алгоритма является строка, даже самое малое отличие делает строки различными. С учётом того, что символы-разделители, в большинстве случаев, не несут смысловой нагрузки, механизм слияния может игнорировать эти символы при сравнении строк.

Те найденные наборы изменённых строк, которые не пересекаются между собой, считаются совместимыми и их слияние делается автоматически. Если в сливаемых файлах находятся изменения, затрагивающие одну и ту же строку файла, это приводит к конфликту. Такие файлы могут быть объединены только вручную. Любые файлы, кроме текстовых, с точки зрения VCS являются бинарными и не допускают автоматического слияния.

Конфликты и их разрешение

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

Для разрешения конфликта система, в общем случае, предлагает разработчику три варианта конфликтующих файлов: базовый, локальный и серверный. Конфликтующие изменения либо показываются разработчику в специальном программном модуле объединения изменений (в этом случае там демонстрируются сливаемые варианты и динамически изменяющийся в зависимости от команд пользователя объединённый вариант файла), либо просто помечаются специальной разметкой прямо в тексте объединённого файла (тогда разработчик должен сам сформировать желаемый текст в спорных местах и сохранить его).

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

Блокировки

Механизм блокировки позволяет одному из разработчиков захватить в монопольное использование файл или группу файлов для внесения в них изменений. На то время, пока файл заблокирован, он остаётся доступным всем остальным разработчикам только на чтение, и любая попытка внести в него изменения отвергается сервером. Технически блокировка может быть организована по-разному. Типичным для современных систем является следующий механизм.

  • Файлы, для работы с которыми требуется блокировка, помечаются специальным флагом «блокируемый». Такая пометка может ставиться автоматически при добавлении файла в проект, обычно для этого предварительно создаётся список масок имён файлов, которые при добавлении должны становиться блокируемыми.
  • Если файл помечен как блокируемый, то при извлечении рабочей копии с сервера он получает в локальной файловой системе атрибут «только для чтения», что препятствует его случайному редактированию.
  • Разработчик, желающий изменить файл, вызывает специальную команду блокировки (lock) с указанием имени этого файла. В результате работы этой команды происходит следующее:
    1. сервер проверяет, не заблокирован ли уже файл другим разработчиком; если это так, то команда блокировки завершается с ошибкой «файл заблокирован другим пользователем» и разработчик, вызывавший её, должен ожидать, пока другой пользователь не снимет свою блокировку;
    2. файл на сервере помечается как «заблокированный», с сохранением идентификатора заблокировавшего его разработчика и времени блокировки;
    3. если блокировка на сервере прошла удачно, на локальной файловой системе с файла рабочей копии снимается атрибут «только для чтения», что позволяет начать его редактировать[1].
  • Разработчик работает с заблокированным файлом. Если в процессе работы выясняется, что файл изменять не нужно, он может вызвать команду снятия блокировки (unlock, release lock). Все изменения файла будут отменены, локальный файл вернётся в состояние «только для чтения», с файла на сервере будет снят атрибут «заблокирован» и другие разработчики получат возможность изменять этот файл.
  • По завершении работы с блокируемым файлом разработчик фиксирует изменения. Обычно блокировка при этом снимается автоматически, хотя в некоторых системах блокировку требуется снимать вручную после фиксации, либо указывать в команде фиксации изменений соответствующий параметр. Так или иначе, при этом файл после изменений теряет флаг «заблокирован» и может быть изменён другими разработчиками.

Массовое использование блокировок, когда все или большинство файлов в проекте являются блокируемыми и для любых изменений необходимо заблокировать соответствующий набор файлов, называется ещё стратегией «блокированного извлечения».[2] Ранние системы управления версиями поддерживали исключительно эту стратегию, предотвращая таким способом появление конфликтов на корню. В современных VCS предпочтительным является использование неблокирующих извлечений, блокировки же считаются скорее неизбежным злом, которое нужно по возможности ограничивать. Недостатки использования блокировок очевидны:

  • Блокировки просто мешают продуктивной работе, поскольку вынуждают ожидать освобождения блокированных файлов, хотя в большинстве случаев даже совместные изменения одних и тех же файлов, которые делаются в ходе разных по смыслу работ, не пересекаются и объединяются при слиянии автоматически.
  • Частота возникновения конфликтов и сложность их разрешения в большинстве случаев не настолько велики, чтобы создать серьёзные затруднения. Возникновение же серьёзного конфликта изменений чаще всего сигнализирует либо о существенном расхождении во мнениях разных разработчиков относительно дизайна одного и того же фрагмента, либо о неправильной организации работы (когда два или более разработчиков делают одно и то же).
  • Блокировки создают административные проблемы. Типичный пример: разработчик может забыть снять блокировку с занятых им файлов, уходя в отпуск. Для разрешения подобных проблем приходится применять административные меры, в том числе включать в систему технические средства для сброса неверных блокировок, но и при их наличии на приведение системы в порядок расходуется время.

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

Версии проекта, теги

Система управления версиями обеспечивает хранение всех существовавших вариантов файлов и, как следствие, всех вариантов проекта в целом, имевших место с момента начала его разработки. Но само понятие «версии» в разных системах может трактоваться двумя различными способами.

Одни системы поддерживают версионность файлов. Это означает, что любой файл, появляющийся в проекте, получает собственный номер версии (обычно — номер 1, условной «нулевой» версией файла считается пустой файл с тем же именем). При каждой фиксации разработчиком изменений, затрагивающих файл, соответствующая часть фиксируемых изменений применяется к файлу и файл получает новый, обычно следующий по порядку, номер версии. Поскольку фиксации обычно затрагивают только часть файлов в репозитории, номера версий файлов, имеющиеся на один и тот же момент времени, со временем расходятся, и проект в целом (то есть весь набор файлов репозитория), фактически, никакого «номера версии» не имеет, поскольку состоит из множества файлов с различными номерами версий. Подобным образом работает, например, система управления версиями CVS.

Для других систем понятие «версия» относится не к отдельному файлу, а к репозиторию целиком. Вновь созданный пустой репозиторий имеет версию 1 или 0, любая фиксация изменений приводит к увеличению этого номера (то есть даже при изменении одного файла на один байт весь репозиторий считается изменённым и получает новый номер версии). Таким способом трактует номера версий, например, система Subversion. Номера версии отдельного файла здесь, фактически, не существует, условно можно считать таковым текущий номер версии репозитория (то есть считать, что при каждом изменении, внесённом в репозиторий, все его файлы меняют номер версии, даже те, которые не менялись). Иногда, говоря о «версии файла» в таких системах, имеют в виду ту версию репозитория, в которой файл был последний раз (до интересующего нас момента) изменён.

Для практических целей обычно имеет значение не отдельный файл, а весь проект целиком. В системах, поддерживающих версионность отдельных файлов, для идентификации определённой версии проекта можно использовать дату и время — тогда версия проекта будет состоять из тех версий входящих в него файлов, которые имелись в репозитории на указанный момент времени. Если поддерживается версионность репозитория в целом, номером версии проекта может выступать номер версии репозитория. Однако оба варианта не слишком удобны, так как ни дата, ни номер версии репозитория обычно не несут информации о значимых изменениях в проекте, о том, насколько долго и интенсивно над ним работали. Для более удобной пометки версий проекта (или его частей) системы управления версиями поддерживают понятие тегов.

Тег (tag) — это символическая метка, которая может быть связана с определённой версией файла и/или каталога в репозитории. С помощью соответствующей команды всем или части файлов проекта, отвечающим определённым условиям (например, входящим в головную версию главной ветви проекта на определённый момент времени) может быть присвоена заданная метка. Таким образом можно идентифицировать версию проекта (версия «XX.XXX.XXX» — это набор версий файлов репозитория, имеющих тег «XX.XXX.XXX»), зафиксировав таким образом его состояние на некоторый желаемый момент. Как правило, система тегов достаточно гибкая и позволяет пометить одним тегом и не одновременные версии файлов и каталогов. Это позволяет собрать «версию проекта» любым произвольным образом. С точки зрения пользователя системы пометка тегами может выглядеть по-разному. В некоторых системах она изображается именно как пометка (тег можно создать, применить к определённым версиям файлов и каталогов, снять). В других системах (например, Subversion) тег представляет собой просто отдельный каталог на файловом дереве репозитория, куда из ствола и ветвей проекта с помощью команды копирования делаются копии нужных версий файлов. Так что визуально тег — это просто вынесенная в отдельный каталог копия определённых версий файлов репозитория. По соглашению в дерево каталогов, соответствующее тегу, запрещена фиксация изменений (то есть версия проекта, представляемая тегом, является неизменной).

Базовые принципы разработки ПО в VCS

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

  1. Любые рабочие, тестовые или демонстрационные версии проекта собираются только из репозитория системы. «Персональные» сборки, включающие ещё незафиксированные изменения, могут делать только разработчики для целей промежуточного тестирования. Таким образом, гарантируется, что репозиторий содержит всё необходимое для создания рабочей версии проекта.
  2. Текущая версия главной ветви всегда корректна. Не допускается фиксация в главной ветви неполных или не прошедших хотя бы предварительное тестирование изменений. В любой момент сборка проекта, проведённая из текущей версии, должна быть успешной.
  3. Любое значимое изменение должно оформляться как отдельная ветвь. Промежуточные результаты работы разработчика фиксируются в эту ветвь. После завершения работы над изменением ветвь объединяется со стволом. Исключения допускаются только для мелких изменений, работа над которыми ведётся одним разработчиком в течение не более чем одного рабочего дня.
  4. Версии проекта помечаются тегами. Выделенная и помеченная тегом версия более никогда не изменяется.

Распределённые системы управления версиями

Также известны как англ. Distributed Version Control System, DVCS. Такие системы используют распределённую модель вместо традиционной клиент-серверной. Они, в общем случае, не нуждаются в централизованном хранилище: вся история изменения документов хранится на каждом компьютере, в локальном хранилище, и при необходимости отдельные фрагменты истории локального хранилища синхронизируются с аналогичным хранилищем на другом компьютере. В некоторых таких системах локальное хранилище располагается непосредственно в каталогах рабочей копии.

Когда пользователь такой системы выполняет обычные действия, такие как извлечение определённой версии документа, создание новой версии и тому подобное, он работает со своей локальной копией хранилища. По мере внесения изменений, хранилища, принадлежащие разным разработчикам, начинают различаться, и возникает необходимость в их синхронизации. Такая синхронизация может осуществляться с помощью обмена патчами или так называемыми наборами изменений (англ. change sets) между пользователями.

Описанная модель логически близка созданию отдельной ветки для каждого разработчика в классической системе управления версиями (в некоторых распределённых системах перед началом работы с локальным хранилищем нужно создать новую ветвь). Отличие состоит в том, что до момента синхронизации другие разработчики этой ветви не видят. Пока разработчик изменяет только свою ветвь, его работа не влияет на других участников проекта и наоборот. По завершении обособленной части работы, внесённые в ветви изменения сливают с основной (общей) ветвью. Как при слиянии ветвей, так и при синхронизации разных хранилищ возможны конфликты версий. На этот случай во всех системах предусмотрены те или иные методы обнаружения и разрешения конфликтов слияния.

С точки зрения пользователя распределённая система отличается необходимостью создавать локальный репозиторий и наличием в командном языке двух дополнительных команд: команды получения репозитория от удалённого компьютера (pull) и передачи своего репозитория на удалённый компьютер (push). Первая команда выполняет слияние изменений удалённого и локального репозиториев с помещением результата в локальный репозиторий; вторая — наоборот, выполняет слияние изменений двух репозиториев с помещением результата в удалённый репозиторий. Как правило, команды слияния в распределённых системах позволяют выбрать, какие наборы изменений будут передаваться в другой репозиторий или извлекаться из него, исправлять конфликты слияния непосредственно в ходе операции или после её неудачного завершения, повторять или возобновлять неоконченное слияние. Обычно передача своих изменений в чужой репозиторий (push) завершается удачно только при условии отсутствия конфликтов. Если конфликты возникают, пользователь должен сначала слить версии в своём репозитории (выполнить pull), и лишь затем передавать их другим.

Обычно рекомендуется организовывать работу с системой так, чтобы пользователи всегда или преимущественно выполняли слияние у себя в репозитории. То есть, в отличие от централизованных систем, где пользователи передают свои изменения на центральный сервер, когда считают нужным, в распределённых системах более естественным является порядок, когда слияние версий инициирует тот, кому нужно получить его результат (например, разработчик, управляющий сборочным сервером).

Основные преимущества распределённых систем — их гибкость и значительно бо́льшая (по сравнению с централизованными системами) автономия отдельного рабочего места. Каждый компьютер разработчика является, фактически, самостоятельным и полнофункциональным сервером, из таких компьютеров можно построить произвольную по структуре и уровню сложности систему, задав (как техническими, так и административными мерами) желаемый порядок синхронизации. При этом каждый разработчик может вести работу независимо, так, как ему удобно, изменяя и сохраняя промежуточные версии документов, пользуясь всеми возможностями системы (в том числе доступом к истории изменений) даже в отсутствие сетевого соединения с сервером. Связь с сервером или другими разработчиками требуется исключительно для проведения синхронизации, при этом обмен наборами изменений может осуществляться по различным схемам.

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

  • Блокировка файла или группы файлов (для хранения признака блокировки нужен общедоступный и постоянно находящийся в онлайне центральный сервер). Это вынуждает применять специальные административные меры, если приходится работать с бинарными файлами, непригодными для автоматического слияния.
  • Слежение за определённым файлом или группой файлов (изменения файлов происходят на разных серверах, слияния и выделения ветвей происходят локально, об изменениях становится известно только при синхронизации, причём не всем разработчикам, а только тем, кто в данной синхронизации участвует).
  • Единая сквозная нумерация версий системы и/или файлов, в которой номер версии монотонно возрастает (такая нумерация также требует наличия главного сервера, задающего номера версий для всех остальных). В распределённых системах приходится обходиться локальными обозначениями версий и применять теги, назначение которых определяется соглашением между разработчиками или корпоративными стандартами фирмы.
  • Локальная работа пользователя с отдельной, небольшой по объёму выборкой из значительного по размеру и внутренней сложности хранилища на удалённом сервере.

Можно выделить следующие типичные ситуации, в которых использование распределённой системы даёт заметные преимущества:

  • Периодическая синхронизация нескольких компьютеров под управлением одного разработчика (рабочего компьютера, домашнего компьютера, ноутбука и так далее). Использование распределённой системы избавляет от необходимости выделять один из компьютеров в качестве сервера, а синхронизация выполняется по необходимости, обычно при «пересадке» разработчика с одного устройства на другое.
  • Совместная работа над проектом небольшой территориально распределённой группы разработчиков без выделения общих ресурсов. Как и в предыдущем случае, реализуется схема работы без главного сервера, а актуальность репозиториев поддерживается периодическими синхронизациями по схеме «каждый с каждым».
  • Крупный распределённый проект, участники которого могут долгое время работать каждый над своей частью, при этом не имеют постоянного подключения к сети. Такой проект может использовать централизованный сервер, с которым синхронизируются копии всех его участников. Возможны и более сложные варианты — например, с созданием групп для работы по отдельным направлениям внутри более крупного проекта. При этом могут быть выделены отдельные «групповые» серверы для синхронизации работы групп, тогда процесс окончательного слияния изменения становится древовидным: сначала отдельные разработчики синхронизируют изменения на групповых серверах, затем обновлённые репозитории групп синхронизируются с главным сервером. Возможна работа и без «групповых» серверов, тогда разработчики одной группы синхронизируют изменения между собой, после чего любой из них (например, руководитель группы) передаёт изменения на центральный сервер.

В традиционной «офисной» разработке проектов, когда группа разработчиков относительно невелика и целиком находится на одной территории, в пределах единой локальной компьютерной сети, с постоянно доступными серверами, централизованная система может оказаться лучшим выбором из-за своей более жёсткой структуры и наличия функциональности, отсутствующей в распределённых системах (например, уже упомянутой блокировки). Возможность фиксировать изменения без их слияния в центральную ветвь в таких условиях легко реализуется путём выделения незавершённых работ в отдельные ветви разработки.

Словарь

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

branch 
Ветвь — направление разработки, независимое от других. Ветвь представляет собой копию части (как правило, одного каталога) хранилища, в которую можно вносить свои изменения, не влияющие на другие ветви. Документы в разных ветвях имеют одинаковую историю до точки ветвления и разные — после неё.
changeset, changelist, activity 
Набор изменений. Представляет собой поименованный набор правок, сделанных в локальной копии для какой-то общей цели. В системах, поддерживающих наборы правок, разработчик может объединять локальные правки в группы и выполнять фиксацию логически связанных изменений одной командой, указывая требуемый набор правок в качестве параметра. При этом прочие правки останутся незафиксированными. Типичный пример: ведётся работа над добавлением новой функциональности, а в этот момент обнаруживается критическая ошибка, которую необходимо немедленно исправить. Разработчик создаёт набор изменений для уже сделанной работы и новый — для исправлений. По завершении исправления ошибки отдаётся команда фиксации только второго набора правок.
check-in, commit, submit 
Создание новой версии, фиксация изменений. Распространение изменений, сделанных в рабочей копии, на хранилище документов. При этом в хранилище создаётся новая версия изменённых документов.
check-out, clone 
Извлечение документа из хранилища и создание рабочей копии.
conflict 
Конфликт — ситуация, когда несколько пользователей сделали изменения одного и того же участка документа. Конфликт обнаруживается, когда один пользователь зафиксировал свои изменения, а второй пытается зафиксировать и система сама не может корректно слить конфликтующие изменения. Поскольку программа может быть недостаточно разумна для того, чтобы определить, какое изменение является «корректным», второму пользователю нужно самому разрешить конфликт (resolve).
head 
Основная версия — самая свежая версия для ветви/ствола, находящаяся в хранилище. Сколько ветвей, столько основных версий.
merge, integration 
Слияние — объединение независимых изменений в единую версию документа. Осуществляется, когда два человека изменили один и тот же файл или при переносе изменений из одной ветки в другую.
rebase 
Перенос точки ветвления (версии, от которой начинается ветвь) на более позднюю версию основной ветви. Например, после выпуска версии 1.0 проекта в стволе продолжается доработка (исправление ошибок, доработка имеющегося функционала), одновременно начинается работа над новой функциональностью в новой ветви. Через какое-то время в основной ветви происходит выпуск версии 1.1 (с исправлениями); теперь желательно, чтобы ветвь разработки новой функциональности включала изменения, произошедшие в стволе. Вообще, это можно сделать базовыми средствами, с помощью слияния (merge), выделив набор изменений между версиями 1.0 и 1.1 и слив его в ветвь. Но при наличии в системе поддержки перебазирования ветви эта операция делается проще, одной командой: по команде rebase (с параметрами: ветвью и новой базовой версией) система самостоятельно определяет нужные наборы изменений и производит их слияние, после чего для ветви базовой версией становится версия 1.1; при последующем слиянии ветви со стволом система не рассматривает повторно изменения, внесённые между версиями 1.0 и 1.1, так как ветвь логически считается выделенной после версии 1.1.
repository, depot 
Хранилище документов — место, где система управления версиями хранит все документы вместе с историей их изменения и другой служебной информацией.
revision 
Версия документа. Системы управления версиями различают версии по номерам, которые назначаются автоматически.
shelving 
Откладывание изменений. Предоставляемая некоторыми системами возможность создать набор изменений (changeset) и сохранить его на сервере без фиксации (commit’а). Отложенный набор изменений доступен на чтение другим участникам проекта, но до специальной команды не входит в основную ветвь. Поддержка откладывания изменений даёт возможность пользователям сохранять незавершённые работы на сервере, не создавая для этого отдельных ветвей.
tag, label 
Метка, которую можно присвоить определённой версии документа. Метка представляет собой символическое имя для группы документов, причём метка описывает не только набор имён файлов, но и версию каждого файла. Версии включённых в метку документов могут принадлежать разным моментам времени.
trunk, mainline, master 
Ствол — основная ветвь разработки проекта. Политика работы со стволом может отличаться от проекта к проекту, но в целом она такова: большинство изменений вносится в ствол; если требуется серьёзное изменение, способное привести к нестабильности, создаётся ветвь, которая сливается со стволом, когда нововведение будет в достаточной мере испытано; перед выпуском очередной версии создаётся «релизная» ветвь, в которую вносятся только исправления.
update, sync 
Синхронизация рабочей копии до некоторого заданного состояния хранилища. Чаще всего это действие означает обновление рабочей копии до самого свежего состояния хранилища. Однако при необходимости можно синхронизировать рабочую копию и к более старому состоянию, чем текущее.
working copy 
Рабочая (локальная) копия документов.

См. также

Напишите отзыв о статье "Система управления версиями"

Примечания

  1. Разумеется, никто не может помешать разработчику снять атрибут «только для чтения» с локальной копии файла и изменить его, но большинство систем управления версиями в такой ситуации выдаст при попытке фиксации изменений на сервере ошибку типа «Файл не был заблокирован текущим пользователем».
  2. [lib.profi.net.ua/doc/info_sites/OpenNet/opennet/docs/RUS/cvs/cvs-ru_10.html#SEC94 CVS. Выбор между блокированными и неблокированными извлечениями.]

Ссылки

  • [www.ibm.com/developerworks/ru/library/l-vercon/index.html?S_TACT=105AGX99&S_CMP=GR01 Системы управления версиями для Linux. Обзор архитектуры, моделей и примеров. (Уровень сложности: простой)] (рус.) developerWorks
  • [www.infoq.com/articles/dvcs-guide Distributed Version Control Systems: A Not-So-Quick Guide Through] (англ.)
  • [www.javaworld.com/javaworld/jw-09-2007/jw-09-versioncontrol.html Subversion or CVS, Bazaar or Mercurial?] John Ferguson Smart, JavaWorld.com
  • [blog.red-bean.com/sussman/?p=20 The Risks of Distributed Version Control] Бен Коллинз-Сассман (создатель Subversion) о распределённых системах управления версиями.
  • [lucas-ward.blogspot.com/2010/02/maturity-model-for-source-control-scmm.html A Maturity Model for Source Control (SCMM)] (англ.) сравнение систем управления версиями с точки зрения завершённости процесса разработки ПО.


Отрывок, характеризующий Система управления версиями

Пьер не имел той практической цепкости, которая бы дала ему возможность непосредственно взяться за дело, и потому он не любил его и только старался притвориться перед управляющим, что он занят делом. Управляющий же старался притвориться перед графом, что он считает эти занятия весьма полезными для хозяина и для себя стеснительными.
В большом городе нашлись знакомые; незнакомые поспешили познакомиться и радушно приветствовали вновь приехавшего богача, самого большого владельца губернии. Искушения по отношению главной слабости Пьера, той, в которой он признался во время приема в ложу, тоже были так сильны, что Пьер не мог воздержаться от них. Опять целые дни, недели, месяцы жизни Пьера проходили так же озабоченно и занято между вечерами, обедами, завтраками, балами, не давая ему времени опомниться, как и в Петербурге. Вместо новой жизни, которую надеялся повести Пьер, он жил всё тою же прежней жизнью, только в другой обстановке.
Из трех назначений масонства Пьер сознавал, что он не исполнял того, которое предписывало каждому масону быть образцом нравственной жизни, и из семи добродетелей совершенно не имел в себе двух: добронравия и любви к смерти. Он утешал себя тем, что за то он исполнял другое назначение, – исправление рода человеческого и имел другие добродетели, любовь к ближнему и в особенности щедрость.
Весной 1807 года Пьер решился ехать назад в Петербург. По дороге назад, он намеревался объехать все свои именья и лично удостовериться в том, что сделано из того, что им предписано и в каком положении находится теперь тот народ, который вверен ему Богом, и который он стремился облагодетельствовать.
Главноуправляющий, считавший все затеи молодого графа почти безумством, невыгодой для себя, для него, для крестьян – сделал уступки. Продолжая дело освобождения представлять невозможным, он распорядился постройкой во всех имениях больших зданий школ, больниц и приютов; для приезда барина везде приготовил встречи, не пышно торжественные, которые, он знал, не понравятся Пьеру, но именно такие религиозно благодарственные, с образами и хлебом солью, именно такие, которые, как он понимал барина, должны были подействовать на графа и обмануть его.
Южная весна, покойное, быстрое путешествие в венской коляске и уединение дороги радостно действовали на Пьера. Именья, в которых он не бывал еще, были – одно живописнее другого; народ везде представлялся благоденствующим и трогательно благодарным за сделанные ему благодеяния. Везде были встречи, которые, хотя и приводили в смущение Пьера, но в глубине души его вызывали радостное чувство. В одном месте мужики подносили ему хлеб соль и образ Петра и Павла, и просили позволения в честь его ангела Петра и Павла, в знак любви и благодарности за сделанные им благодеяния, воздвигнуть на свой счет новый придел в церкви. В другом месте его встретили женщины с грудными детьми, благодаря его за избавление от тяжелых работ. В третьем именьи его встречал священник с крестом, окруженный детьми, которых он по милостям графа обучал грамоте и религии. Во всех имениях Пьер видел своими глазами по одному плану воздвигавшиеся и воздвигнутые уже каменные здания больниц, школ, богаделен, которые должны были быть, в скором времени, открыты. Везде Пьер видел отчеты управляющих о барщинских работах, уменьшенных против прежнего, и слышал за то трогательные благодарения депутаций крестьян в синих кафтанах.
Пьер только не знал того, что там, где ему подносили хлеб соль и строили придел Петра и Павла, было торговое село и ярмарка в Петров день, что придел уже строился давно богачами мужиками села, теми, которые явились к нему, а что девять десятых мужиков этого села были в величайшем разорении. Он не знал, что вследствие того, что перестали по его приказу посылать ребятниц женщин с грудными детьми на барщину, эти самые ребятницы тем труднейшую работу несли на своей половине. Он не знал, что священник, встретивший его с крестом, отягощал мужиков своими поборами, и что собранные к нему ученики со слезами были отдаваемы ему, и за большие деньги были откупаемы родителями. Он не знал, что каменные, по плану, здания воздвигались своими рабочими и увеличили барщину крестьян, уменьшенную только на бумаге. Он не знал, что там, где управляющий указывал ему по книге на уменьшение по его воле оброка на одну треть, была наполовину прибавлена барщинная повинность. И потому Пьер был восхищен своим путешествием по именьям, и вполне возвратился к тому филантропическому настроению, в котором он выехал из Петербурга, и писал восторженные письма своему наставнику брату, как он называл великого мастера.
«Как легко, как мало усилия нужно, чтобы сделать так много добра, думал Пьер, и как мало мы об этом заботимся!»
Он счастлив был выказываемой ему благодарностью, но стыдился, принимая ее. Эта благодарность напоминала ему, на сколько он еще больше бы был в состоянии сделать для этих простых, добрых людей.
Главноуправляющий, весьма глупый и хитрый человек, совершенно понимая умного и наивного графа, и играя им, как игрушкой, увидав действие, произведенное на Пьера приготовленными приемами, решительнее обратился к нему с доводами о невозможности и, главное, ненужности освобождения крестьян, которые и без того были совершенно счастливы.
Пьер втайне своей души соглашался с управляющим в том, что трудно было представить себе людей, более счастливых, и что Бог знает, что ожидало их на воле; но Пьер, хотя и неохотно, настаивал на том, что он считал справедливым. Управляющий обещал употребить все силы для исполнения воли графа, ясно понимая, что граф никогда не будет в состоянии поверить его не только в том, употреблены ли все меры для продажи лесов и имений, для выкупа из Совета, но и никогда вероятно не спросит и не узнает о том, как построенные здания стоят пустыми и крестьяне продолжают давать работой и деньгами всё то, что они дают у других, т. е. всё, что они могут давать.


В самом счастливом состоянии духа возвращаясь из своего южного путешествия, Пьер исполнил свое давнишнее намерение заехать к своему другу Болконскому, которого он не видал два года.
Богучарово лежало в некрасивой, плоской местности, покрытой полями и срубленными и несрубленными еловыми и березовыми лесами. Барский двор находился на конце прямой, по большой дороге расположенной деревни, за вновь вырытым, полно налитым прудом, с необросшими еще травой берегами, в середине молодого леса, между которым стояло несколько больших сосен.
Барский двор состоял из гумна, надворных построек, конюшень, бани, флигеля и большого каменного дома с полукруглым фронтоном, который еще строился. Вокруг дома был рассажен молодой сад. Ограды и ворота были прочные и новые; под навесом стояли две пожарные трубы и бочка, выкрашенная зеленой краской; дороги были прямые, мосты были крепкие с перилами. На всем лежал отпечаток аккуратности и хозяйственности. Встретившиеся дворовые, на вопрос, где живет князь, указали на небольшой, новый флигелек, стоящий у самого края пруда. Старый дядька князя Андрея, Антон, высадил Пьера из коляски, сказал, что князь дома, и проводил его в чистую, маленькую прихожую.
Пьера поразила скромность маленького, хотя и чистенького домика после тех блестящих условий, в которых последний раз он видел своего друга в Петербурге. Он поспешно вошел в пахнущую еще сосной, не отштукатуренную, маленькую залу и хотел итти дальше, но Антон на цыпочках пробежал вперед и постучался в дверь.
– Ну, что там? – послышался резкий, неприятный голос.
– Гость, – отвечал Антон.
– Проси подождать, – и послышался отодвинутый стул. Пьер быстрыми шагами подошел к двери и столкнулся лицом к лицу с выходившим к нему, нахмуренным и постаревшим, князем Андреем. Пьер обнял его и, подняв очки, целовал его в щеки и близко смотрел на него.
– Вот не ждал, очень рад, – сказал князь Андрей. Пьер ничего не говорил; он удивленно, не спуская глаз, смотрел на своего друга. Его поразила происшедшая перемена в князе Андрее. Слова были ласковы, улыбка была на губах и лице князя Андрея, но взгляд был потухший, мертвый, которому, несмотря на видимое желание, князь Андрей не мог придать радостного и веселого блеска. Не то, что похудел, побледнел, возмужал его друг; но взгляд этот и морщинка на лбу, выражавшие долгое сосредоточение на чем то одном, поражали и отчуждали Пьера, пока он не привык к ним.
При свидании после долгой разлуки, как это всегда бывает, разговор долго не мог остановиться; они спрашивали и отвечали коротко о таких вещах, о которых они сами знали, что надо было говорить долго. Наконец разговор стал понемногу останавливаться на прежде отрывочно сказанном, на вопросах о прошедшей жизни, о планах на будущее, о путешествии Пьера, о его занятиях, о войне и т. д. Та сосредоточенность и убитость, которую заметил Пьер во взгляде князя Андрея, теперь выражалась еще сильнее в улыбке, с которою он слушал Пьера, в особенности тогда, когда Пьер говорил с одушевлением радости о прошедшем или будущем. Как будто князь Андрей и желал бы, но не мог принимать участия в том, что он говорил. Пьер начинал чувствовать, что перед князем Андреем восторженность, мечты, надежды на счастие и на добро не приличны. Ему совестно было высказывать все свои новые, масонские мысли, в особенности подновленные и возбужденные в нем его последним путешествием. Он сдерживал себя, боялся быть наивным; вместе с тем ему неудержимо хотелось поскорей показать своему другу, что он был теперь совсем другой, лучший Пьер, чем тот, который был в Петербурге.
– Я не могу вам сказать, как много я пережил за это время. Я сам бы не узнал себя.
– Да, много, много мы изменились с тех пор, – сказал князь Андрей.
– Ну а вы? – спрашивал Пьер, – какие ваши планы?
– Планы? – иронически повторил князь Андрей. – Мои планы? – повторил он, как бы удивляясь значению такого слова. – Да вот видишь, строюсь, хочу к будущему году переехать совсем…
Пьер молча, пристально вглядывался в состаревшееся лицо (князя) Андрея.
– Нет, я спрашиваю, – сказал Пьер, – но князь Андрей перебил его:
– Да что про меня говорить…. расскажи же, расскажи про свое путешествие, про всё, что ты там наделал в своих именьях?
Пьер стал рассказывать о том, что он сделал в своих имениях, стараясь как можно более скрыть свое участие в улучшениях, сделанных им. Князь Андрей несколько раз подсказывал Пьеру вперед то, что он рассказывал, как будто всё то, что сделал Пьер, была давно известная история, и слушал не только не с интересом, но даже как будто стыдясь за то, что рассказывал Пьер.
Пьеру стало неловко и даже тяжело в обществе своего друга. Он замолчал.
– А вот что, душа моя, – сказал князь Андрей, которому очевидно было тоже тяжело и стеснительно с гостем, – я здесь на биваках, и приехал только посмотреть. Я нынче еду опять к сестре. Я тебя познакомлю с ними. Да ты, кажется, знаком, – сказал он, очевидно занимая гостя, с которым он не чувствовал теперь ничего общего. – Мы поедем после обеда. А теперь хочешь посмотреть мою усадьбу? – Они вышли и проходили до обеда, разговаривая о политических новостях и общих знакомых, как люди мало близкие друг к другу. С некоторым оживлением и интересом князь Андрей говорил только об устраиваемой им новой усадьбе и постройке, но и тут в середине разговора, на подмостках, когда князь Андрей описывал Пьеру будущее расположение дома, он вдруг остановился. – Впрочем тут нет ничего интересного, пойдем обедать и поедем. – За обедом зашел разговор о женитьбе Пьера.
– Я очень удивился, когда услышал об этом, – сказал князь Андрей.
Пьер покраснел так же, как он краснел всегда при этом, и торопливо сказал:
– Я вам расскажу когда нибудь, как это всё случилось. Но вы знаете, что всё это кончено и навсегда.
– Навсегда? – сказал князь Андрей. – Навсегда ничего не бывает.
– Но вы знаете, как это всё кончилось? Слышали про дуэль?
– Да, ты прошел и через это.
– Одно, за что я благодарю Бога, это за то, что я не убил этого человека, – сказал Пьер.
– Отчего же? – сказал князь Андрей. – Убить злую собаку даже очень хорошо.
– Нет, убить человека не хорошо, несправедливо…
– Отчего же несправедливо? – повторил князь Андрей; то, что справедливо и несправедливо – не дано судить людям. Люди вечно заблуждались и будут заблуждаться, и ни в чем больше, как в том, что они считают справедливым и несправедливым.
– Несправедливо то, что есть зло для другого человека, – сказал Пьер, с удовольствием чувствуя, что в первый раз со времени его приезда князь Андрей оживлялся и начинал говорить и хотел высказать всё то, что сделало его таким, каким он был теперь.
– А кто тебе сказал, что такое зло для другого человека? – спросил он.
– Зло? Зло? – сказал Пьер, – мы все знаем, что такое зло для себя.
– Да мы знаем, но то зло, которое я знаю для себя, я не могу сделать другому человеку, – всё более и более оживляясь говорил князь Андрей, видимо желая высказать Пьеру свой новый взгляд на вещи. Он говорил по французски. Je ne connais l dans la vie que deux maux bien reels: c'est le remord et la maladie. II n'est de bien que l'absence de ces maux. [Я знаю в жизни только два настоящих несчастья: это угрызение совести и болезнь. И единственное благо есть отсутствие этих зол.] Жить для себя, избегая только этих двух зол: вот вся моя мудрость теперь.
– А любовь к ближнему, а самопожертвование? – заговорил Пьер. – Нет, я с вами не могу согласиться! Жить только так, чтобы не делать зла, чтоб не раскаиваться? этого мало. Я жил так, я жил для себя и погубил свою жизнь. И только теперь, когда я живу, по крайней мере, стараюсь (из скромности поправился Пьер) жить для других, только теперь я понял всё счастие жизни. Нет я не соглашусь с вами, да и вы не думаете того, что вы говорите.
Князь Андрей молча глядел на Пьера и насмешливо улыбался.
– Вот увидишь сестру, княжну Марью. С ней вы сойдетесь, – сказал он. – Может быть, ты прав для себя, – продолжал он, помолчав немного; – но каждый живет по своему: ты жил для себя и говоришь, что этим чуть не погубил свою жизнь, а узнал счастие только тогда, когда стал жить для других. А я испытал противуположное. Я жил для славы. (Ведь что же слава? та же любовь к другим, желание сделать для них что нибудь, желание их похвалы.) Так я жил для других, и не почти, а совсем погубил свою жизнь. И с тех пор стал спокойнее, как живу для одного себя.
– Да как же жить для одного себя? – разгорячаясь спросил Пьер. – А сын, а сестра, а отец?
– Да это всё тот же я, это не другие, – сказал князь Андрей, а другие, ближние, le prochain, как вы с княжной Марьей называете, это главный источник заблуждения и зла. Le prochаin [Ближний] это те, твои киевские мужики, которым ты хочешь сделать добро.
И он посмотрел на Пьера насмешливо вызывающим взглядом. Он, видимо, вызывал Пьера.
– Вы шутите, – всё более и более оживляясь говорил Пьер. Какое же может быть заблуждение и зло в том, что я желал (очень мало и дурно исполнил), но желал сделать добро, да и сделал хотя кое что? Какое же может быть зло, что несчастные люди, наши мужики, люди такие же, как и мы, выростающие и умирающие без другого понятия о Боге и правде, как обряд и бессмысленная молитва, будут поучаться в утешительных верованиях будущей жизни, возмездия, награды, утешения? Какое же зло и заблуждение в том, что люди умирают от болезни, без помощи, когда так легко материально помочь им, и я им дам лекаря, и больницу, и приют старику? И разве не ощутительное, не несомненное благо то, что мужик, баба с ребенком не имеют дня и ночи покоя, а я дам им отдых и досуг?… – говорил Пьер, торопясь и шепелявя. – И я это сделал, хоть плохо, хоть немного, но сделал кое что для этого, и вы не только меня не разуверите в том, что то, что я сделал хорошо, но и не разуверите, чтоб вы сами этого не думали. А главное, – продолжал Пьер, – я вот что знаю и знаю верно, что наслаждение делать это добро есть единственное верное счастие жизни.
– Да, ежели так поставить вопрос, то это другое дело, сказал князь Андрей. – Я строю дом, развожу сад, а ты больницы. И то, и другое может служить препровождением времени. А что справедливо, что добро – предоставь судить тому, кто всё знает, а не нам. Ну ты хочешь спорить, – прибавил он, – ну давай. – Они вышли из за стола и сели на крыльцо, заменявшее балкон.
– Ну давай спорить, – сказал князь Андрей. – Ты говоришь школы, – продолжал он, загибая палец, – поучения и так далее, то есть ты хочешь вывести его, – сказал он, указывая на мужика, снявшего шапку и проходившего мимо их, – из его животного состояния и дать ему нравственных потребностей, а мне кажется, что единственно возможное счастье – есть счастье животное, а ты его то хочешь лишить его. Я завидую ему, а ты хочешь его сделать мною, но не дав ему моих средств. Другое ты говоришь: облегчить его работу. А по моему, труд физический для него есть такая же необходимость, такое же условие его существования, как для меня и для тебя труд умственный. Ты не можешь не думать. Я ложусь спать в 3 м часу, мне приходят мысли, и я не могу заснуть, ворочаюсь, не сплю до утра оттого, что я думаю и не могу не думать, как он не может не пахать, не косить; иначе он пойдет в кабак, или сделается болен. Как я не перенесу его страшного физического труда, а умру через неделю, так он не перенесет моей физической праздности, он растолстеет и умрет. Третье, – что бишь еще ты сказал? – Князь Андрей загнул третий палец.
– Ах, да, больницы, лекарства. У него удар, он умирает, а ты пустил ему кровь, вылечил. Он калекой будет ходить 10 ть лет, всем в тягость. Гораздо покойнее и проще ему умереть. Другие родятся, и так их много. Ежели бы ты жалел, что у тебя лишний работник пропал – как я смотрю на него, а то ты из любви же к нему его хочешь лечить. А ему этого не нужно. Да и потом,что за воображенье, что медицина кого нибудь и когда нибудь вылечивала! Убивать так! – сказал он, злобно нахмурившись и отвернувшись от Пьера. Князь Андрей высказывал свои мысли так ясно и отчетливо, что видно было, он не раз думал об этом, и он говорил охотно и быстро, как человек, долго не говоривший. Взгляд его оживлялся тем больше, чем безнадежнее были его суждения.
– Ах это ужасно, ужасно! – сказал Пьер. – Я не понимаю только – как можно жить с такими мыслями. На меня находили такие же минуты, это недавно было, в Москве и дорогой, но тогда я опускаюсь до такой степени, что я не живу, всё мне гадко… главное, я сам. Тогда я не ем, не умываюсь… ну, как же вы?…
– Отчего же не умываться, это не чисто, – сказал князь Андрей; – напротив, надо стараться сделать свою жизнь как можно более приятной. Я живу и в этом не виноват, стало быть надо как нибудь получше, никому не мешая, дожить до смерти.
– Но что же вас побуждает жить с такими мыслями? Будешь сидеть не двигаясь, ничего не предпринимая…
– Жизнь и так не оставляет в покое. Я бы рад ничего не делать, а вот, с одной стороны, дворянство здешнее удостоило меня чести избрания в предводители: я насилу отделался. Они не могли понять, что во мне нет того, что нужно, нет этой известной добродушной и озабоченной пошлости, которая нужна для этого. Потом вот этот дом, который надо было построить, чтобы иметь свой угол, где можно быть спокойным. Теперь ополчение.
– Отчего вы не служите в армии?
– После Аустерлица! – мрачно сказал князь Андрей. – Нет; покорно благодарю, я дал себе слово, что служить в действующей русской армии я не буду. И не буду, ежели бы Бонапарте стоял тут, у Смоленска, угрожая Лысым Горам, и тогда бы я не стал служить в русской армии. Ну, так я тебе говорил, – успокоиваясь продолжал князь Андрей. – Теперь ополченье, отец главнокомандующим 3 го округа, и единственное средство мне избавиться от службы – быть при нем.
– Стало быть вы служите?
– Служу. – Он помолчал немного.
– Так зачем же вы служите?
– А вот зачем. Отец мой один из замечательнейших людей своего века. Но он становится стар, и он не то что жесток, но он слишком деятельного характера. Он страшен своей привычкой к неограниченной власти, и теперь этой властью, данной Государем главнокомандующим над ополчением. Ежели бы я два часа опоздал две недели тому назад, он бы повесил протоколиста в Юхнове, – сказал князь Андрей с улыбкой; – так я служу потому, что кроме меня никто не имеет влияния на отца, и я кое где спасу его от поступка, от которого бы он после мучился.
– А, ну так вот видите!
– Да, mais ce n'est pas comme vous l'entendez, [но это не так, как вы это понимаете,] – продолжал князь Андрей. – Я ни малейшего добра не желал и не желаю этому мерзавцу протоколисту, который украл какие то сапоги у ополченцев; я даже очень был бы доволен видеть его повешенным, но мне жалко отца, то есть опять себя же.
Князь Андрей всё более и более оживлялся. Глаза его лихорадочно блестели в то время, как он старался доказать Пьеру, что никогда в его поступке не было желания добра ближнему.
– Ну, вот ты хочешь освободить крестьян, – продолжал он. – Это очень хорошо; но не для тебя (ты, я думаю, никого не засекал и не посылал в Сибирь), и еще меньше для крестьян. Ежели их бьют, секут, посылают в Сибирь, то я думаю, что им от этого нисколько не хуже. В Сибири ведет он ту же свою скотскую жизнь, а рубцы на теле заживут, и он так же счастлив, как и был прежде. А нужно это для тех людей, которые гибнут нравственно, наживают себе раскаяние, подавляют это раскаяние и грубеют от того, что у них есть возможность казнить право и неправо. Вот кого мне жалко, и для кого бы я желал освободить крестьян. Ты, может быть, не видал, а я видел, как хорошие люди, воспитанные в этих преданиях неограниченной власти, с годами, когда они делаются раздражительнее, делаются жестоки, грубы, знают это, не могут удержаться и всё делаются несчастнее и несчастнее. – Князь Андрей говорил это с таким увлечением, что Пьер невольно подумал о том, что мысли эти наведены были Андрею его отцом. Он ничего не отвечал ему.
– Так вот кого мне жалко – человеческого достоинства, спокойствия совести, чистоты, а не их спин и лбов, которые, сколько ни секи, сколько ни брей, всё останутся такими же спинами и лбами.
– Нет, нет и тысячу раз нет, я никогда не соглашусь с вами, – сказал Пьер.


Вечером князь Андрей и Пьер сели в коляску и поехали в Лысые Горы. Князь Андрей, поглядывая на Пьера, прерывал изредка молчание речами, доказывавшими, что он находился в хорошем расположении духа.
Он говорил ему, указывая на поля, о своих хозяйственных усовершенствованиях.
Пьер мрачно молчал, отвечая односложно, и казался погруженным в свои мысли.
Пьер думал о том, что князь Андрей несчастлив, что он заблуждается, что он не знает истинного света и что Пьер должен притти на помощь ему, просветить и поднять его. Но как только Пьер придумывал, как и что он станет говорить, он предчувствовал, что князь Андрей одним словом, одним аргументом уронит всё в его ученьи, и он боялся начать, боялся выставить на возможность осмеяния свою любимую святыню.
– Нет, отчего же вы думаете, – вдруг начал Пьер, опуская голову и принимая вид бодающегося быка, отчего вы так думаете? Вы не должны так думать.
– Про что я думаю? – спросил князь Андрей с удивлением.
– Про жизнь, про назначение человека. Это не может быть. Я так же думал, и меня спасло, вы знаете что? масонство. Нет, вы не улыбайтесь. Масонство – это не религиозная, не обрядная секта, как и я думал, а масонство есть лучшее, единственное выражение лучших, вечных сторон человечества. – И он начал излагать князю Андрею масонство, как он понимал его.
Он говорил, что масонство есть учение христианства, освободившегося от государственных и религиозных оков; учение равенства, братства и любви.
– Только наше святое братство имеет действительный смысл в жизни; всё остальное есть сон, – говорил Пьер. – Вы поймите, мой друг, что вне этого союза всё исполнено лжи и неправды, и я согласен с вами, что умному и доброму человеку ничего не остается, как только, как вы, доживать свою жизнь, стараясь только не мешать другим. Но усвойте себе наши основные убеждения, вступите в наше братство, дайте нам себя, позвольте руководить собой, и вы сейчас почувствуете себя, как и я почувствовал частью этой огромной, невидимой цепи, которой начало скрывается в небесах, – говорил Пьер.
Князь Андрей, молча, глядя перед собой, слушал речь Пьера. Несколько раз он, не расслышав от шума коляски, переспрашивал у Пьера нерасслышанные слова. По особенному блеску, загоревшемуся в глазах князя Андрея, и по его молчанию Пьер видел, что слова его не напрасны, что князь Андрей не перебьет его и не будет смеяться над его словами.
Они подъехали к разлившейся реке, которую им надо было переезжать на пароме. Пока устанавливали коляску и лошадей, они прошли на паром.
Князь Андрей, облокотившись о перила, молча смотрел вдоль по блестящему от заходящего солнца разливу.
– Ну, что же вы думаете об этом? – спросил Пьер, – что же вы молчите?
– Что я думаю? я слушал тебя. Всё это так, – сказал князь Андрей. – Но ты говоришь: вступи в наше братство, и мы тебе укажем цель жизни и назначение человека, и законы, управляющие миром. Да кто же мы – люди? Отчего же вы всё знаете? Отчего я один не вижу того, что вы видите? Вы видите на земле царство добра и правды, а я его не вижу.
Пьер перебил его. – Верите вы в будущую жизнь? – спросил он.
– В будущую жизнь? – повторил князь Андрей, но Пьер не дал ему времени ответить и принял это повторение за отрицание, тем более, что он знал прежние атеистические убеждения князя Андрея.
– Вы говорите, что не можете видеть царства добра и правды на земле. И я не видал его и его нельзя видеть, ежели смотреть на нашу жизнь как на конец всего. На земле, именно на этой земле (Пьер указал в поле), нет правды – всё ложь и зло; но в мире, во всем мире есть царство правды, и мы теперь дети земли, а вечно дети всего мира. Разве я не чувствую в своей душе, что я составляю часть этого огромного, гармонического целого. Разве я не чувствую, что я в этом огромном бесчисленном количестве существ, в которых проявляется Божество, – высшая сила, как хотите, – что я составляю одно звено, одну ступень от низших существ к высшим. Ежели я вижу, ясно вижу эту лестницу, которая ведет от растения к человеку, то отчего же я предположу, что эта лестница прерывается со мною, а не ведет дальше и дальше. Я чувствую, что я не только не могу исчезнуть, как ничто не исчезает в мире, но что я всегда буду и всегда был. Я чувствую, что кроме меня надо мной живут духи и что в этом мире есть правда.
– Да, это учение Гердера, – сказал князь Андрей, – но не то, душа моя, убедит меня, а жизнь и смерть, вот что убеждает. Убеждает то, что видишь дорогое тебе существо, которое связано с тобой, перед которым ты был виноват и надеялся оправдаться (князь Андрей дрогнул голосом и отвернулся) и вдруг это существо страдает, мучается и перестает быть… Зачем? Не может быть, чтоб не было ответа! И я верю, что он есть…. Вот что убеждает, вот что убедило меня, – сказал князь Андрей.
– Ну да, ну да, – говорил Пьер, – разве не то же самое и я говорю!
– Нет. Я говорю только, что убеждают в необходимости будущей жизни не доводы, а то, когда идешь в жизни рука об руку с человеком, и вдруг человек этот исчезнет там в нигде, и ты сам останавливаешься перед этой пропастью и заглядываешь туда. И, я заглянул…
– Ну так что ж! вы знаете, что есть там и что есть кто то? Там есть – будущая жизнь. Кто то есть – Бог.
Князь Андрей не отвечал. Коляска и лошади уже давно были выведены на другой берег и уже заложены, и уж солнце скрылось до половины, и вечерний мороз покрывал звездами лужи у перевоза, а Пьер и Андрей, к удивлению лакеев, кучеров и перевозчиков, еще стояли на пароме и говорили.
– Ежели есть Бог и есть будущая жизнь, то есть истина, есть добродетель; и высшее счастье человека состоит в том, чтобы стремиться к достижению их. Надо жить, надо любить, надо верить, – говорил Пьер, – что живем не нынче только на этом клочке земли, а жили и будем жить вечно там во всем (он указал на небо). Князь Андрей стоял, облокотившись на перила парома и, слушая Пьера, не спуская глаз, смотрел на красный отблеск солнца по синеющему разливу. Пьер замолк. Было совершенно тихо. Паром давно пристал, и только волны теченья с слабым звуком ударялись о дно парома. Князю Андрею казалось, что это полосканье волн к словам Пьера приговаривало: «правда, верь этому».
Князь Андрей вздохнул, и лучистым, детским, нежным взглядом взглянул в раскрасневшееся восторженное, но всё робкое перед первенствующим другом, лицо Пьера.
– Да, коли бы это так было! – сказал он. – Однако пойдем садиться, – прибавил князь Андрей, и выходя с парома, он поглядел на небо, на которое указал ему Пьер, и в первый раз, после Аустерлица, он увидал то высокое, вечное небо, которое он видел лежа на Аустерлицком поле, и что то давно заснувшее, что то лучшее что было в нем, вдруг радостно и молодо проснулось в его душе. Чувство это исчезло, как скоро князь Андрей вступил опять в привычные условия жизни, но он знал, что это чувство, которое он не умел развить, жило в нем. Свидание с Пьером было для князя Андрея эпохой, с которой началась хотя во внешности и та же самая, но во внутреннем мире его новая жизнь.


Уже смерклось, когда князь Андрей и Пьер подъехали к главному подъезду лысогорского дома. В то время как они подъезжали, князь Андрей с улыбкой обратил внимание Пьера на суматоху, происшедшую у заднего крыльца. Согнутая старушка с котомкой на спине, и невысокий мужчина в черном одеянии и с длинными волосами, увидав въезжавшую коляску, бросились бежать назад в ворота. Две женщины выбежали за ними, и все четверо, оглядываясь на коляску, испуганно вбежали на заднее крыльцо.
– Это Машины божьи люди, – сказал князь Андрей. – Они приняли нас за отца. А это единственно, в чем она не повинуется ему: он велит гонять этих странников, а она принимает их.
– Да что такое божьи люди? – спросил Пьер.
Князь Андрей не успел отвечать ему. Слуги вышли навстречу, и он расспрашивал о том, где был старый князь и скоро ли ждут его.
Старый князь был еще в городе, и его ждали каждую минуту.
Князь Андрей провел Пьера на свою половину, всегда в полной исправности ожидавшую его в доме его отца, и сам пошел в детскую.
– Пойдем к сестре, – сказал князь Андрей, возвратившись к Пьеру; – я еще не видал ее, она теперь прячется и сидит с своими божьими людьми. Поделом ей, она сконфузится, а ты увидишь божьих людей. C'est curieux, ma parole. [Это любопытно, честное слово.]
– Qu'est ce que c'est que [Что такое] божьи люди? – спросил Пьер
– А вот увидишь.
Княжна Марья действительно сконфузилась и покраснела пятнами, когда вошли к ней. В ее уютной комнате с лампадами перед киотами, на диване, за самоваром сидел рядом с ней молодой мальчик с длинным носом и длинными волосами, и в монашеской рясе.
На кресле, подле, сидела сморщенная, худая старушка с кротким выражением детского лица.
– Andre, pourquoi ne pas m'avoir prevenu? [Андрей, почему не предупредили меня?] – сказала она с кротким упреком, становясь перед своими странниками, как наседка перед цыплятами.
– Charmee de vous voir. Je suis tres contente de vous voir, [Очень рада вас видеть. Я так довольна, что вижу вас,] – сказала она Пьеру, в то время, как он целовал ее руку. Она знала его ребенком, и теперь дружба его с Андреем, его несчастие с женой, а главное, его доброе, простое лицо расположили ее к нему. Она смотрела на него своими прекрасными, лучистыми глазами и, казалось, говорила: «я вас очень люблю, но пожалуйста не смейтесь над моими ». Обменявшись первыми фразами приветствия, они сели.
– А, и Иванушка тут, – сказал князь Андрей, указывая улыбкой на молодого странника.
– Andre! – умоляюще сказала княжна Марья.
– Il faut que vous sachiez que c'est une femme, [Знай, что это женщина,] – сказал Андрей Пьеру.
– Andre, au nom de Dieu! [Андрей, ради Бога!] – повторила княжна Марья.
Видно было, что насмешливое отношение князя Андрея к странникам и бесполезное заступничество за них княжны Марьи были привычные, установившиеся между ними отношения.
– Mais, ma bonne amie, – сказал князь Андрей, – vous devriez au contraire m'etre reconaissante de ce que j'explique a Pierre votre intimite avec ce jeune homme… [Но, мой друг, ты должна бы быть мне благодарна, что я объясняю Пьеру твою близость к этому молодому человеку.]
– Vraiment? [Правда?] – сказал Пьер любопытно и серьезно (за что особенно ему благодарна была княжна Марья) вглядываясь через очки в лицо Иванушки, который, поняв, что речь шла о нем, хитрыми глазами оглядывал всех.
Княжна Марья совершенно напрасно смутилась за своих. Они нисколько не робели. Старушка, опустив глаза, но искоса поглядывая на вошедших, опрокинув чашку вверх дном на блюдечко и положив подле обкусанный кусочек сахара, спокойно и неподвижно сидела на своем кресле, ожидая, чтобы ей предложили еще чаю. Иванушка, попивая из блюдечка, исподлобья лукавыми, женскими глазами смотрел на молодых людей.
– Где, в Киеве была? – спросил старуху князь Андрей.
– Была, отец, – отвечала словоохотливо старуха, – на самое Рожество удостоилась у угодников сообщиться святых, небесных тайн. А теперь из Колязина, отец, благодать великая открылась…
– Что ж, Иванушка с тобой?
– Я сам по себе иду, кормилец, – стараясь говорить басом, сказал Иванушка. – Только в Юхнове с Пелагеюшкой сошлись…
Пелагеюшка перебила своего товарища; ей видно хотелось рассказать то, что она видела.
– В Колязине, отец, великая благодать открылась.
– Что ж, мощи новые? – спросил князь Андрей.
– Полно, Андрей, – сказала княжна Марья. – Не рассказывай, Пелагеюшка.
– Ни… что ты, мать, отчего не рассказывать? Я его люблю. Он добрый, Богом взысканный, он мне, благодетель, рублей дал, я помню. Как была я в Киеве и говорит мне Кирюша юродивый – истинно Божий человек, зиму и лето босой ходит. Что ходишь, говорит, не по своему месту, в Колязин иди, там икона чудотворная, матушка пресвятая Богородица открылась. Я с тех слов простилась с угодниками и пошла…
Все молчали, одна странница говорила мерным голосом, втягивая в себя воздух.
– Пришла, отец мой, мне народ и говорит: благодать великая открылась, у матушки пресвятой Богородицы миро из щечки каплет…
– Ну хорошо, хорошо, после расскажешь, – краснея сказала княжна Марья.
– Позвольте у нее спросить, – сказал Пьер. – Ты сама видела? – спросил он.
– Как же, отец, сама удостоилась. Сияние такое на лике то, как свет небесный, а из щечки у матушки так и каплет, так и каплет…
– Да ведь это обман, – наивно сказал Пьер, внимательно слушавший странницу.
– Ах, отец, что говоришь! – с ужасом сказала Пелагеюшка, за защитой обращаясь к княжне Марье.
– Это обманывают народ, – повторил он.
– Господи Иисусе Христе! – крестясь сказала странница. – Ох, не говори, отец. Так то один анарал не верил, сказал: «монахи обманывают», да как сказал, так и ослеп. И приснилось ему, что приходит к нему матушка Печерская и говорит: «уверуй мне, я тебя исцелю». Вот и стал проситься: повези да повези меня к ней. Это я тебе истинную правду говорю, сама видела. Привезли его слепого прямо к ней, подошел, упал, говорит: «исцели! отдам тебе, говорит, в чем царь жаловал». Сама видела, отец, звезда в ней так и вделана. Что ж, – прозрел! Грех говорить так. Бог накажет, – поучительно обратилась она к Пьеру.
– Как же звезда то в образе очутилась? – спросил Пьер.
– В генералы и матушку произвели? – сказал князь Aндрей улыбаясь.
Пелагеюшка вдруг побледнела и всплеснула руками.
– Отец, отец, грех тебе, у тебя сын! – заговорила она, из бледности вдруг переходя в яркую краску.
– Отец, что ты сказал такое, Бог тебя прости. – Она перекрестилась. – Господи, прости его. Матушка, что ж это?… – обратилась она к княжне Марье. Она встала и чуть не плача стала собирать свою сумочку. Ей, видно, было и страшно, и стыдно, что она пользовалась благодеяниями в доме, где могли говорить это, и жалко, что надо было теперь лишиться благодеяний этого дома.
– Ну что вам за охота? – сказала княжна Марья. – Зачем вы пришли ко мне?…
– Нет, ведь я шучу, Пелагеюшка, – сказал Пьер. – Princesse, ma parole, je n'ai pas voulu l'offenser, [Княжна, я право, не хотел обидеть ее,] я так только. Ты не думай, я пошутил, – говорил он, робко улыбаясь и желая загладить свою вину. – Ведь это я, а он так, пошутил только.
Пелагеюшка остановилась недоверчиво, но в лице Пьера была такая искренность раскаяния, и князь Андрей так кротко смотрел то на Пелагеюшку, то на Пьера, что она понемногу успокоилась.


Странница успокоилась и, наведенная опять на разговор, долго потом рассказывала про отца Амфилохия, который был такой святой жизни, что от ручки его ладоном пахло, и о том, как знакомые ей монахи в последнее ее странствие в Киев дали ей ключи от пещер, и как она, взяв с собой сухарики, двое суток провела в пещерах с угодниками. «Помолюсь одному, почитаю, пойду к другому. Сосну, опять пойду приложусь; и такая, матушка, тишина, благодать такая, что и на свет Божий выходить не хочется».
Пьер внимательно и серьезно слушал ее. Князь Андрей вышел из комнаты. И вслед за ним, оставив божьих людей допивать чай, княжна Марья повела Пьера в гостиную.
– Вы очень добры, – сказала она ему.
– Ах, я право не думал оскорбить ее, я так понимаю и высоко ценю эти чувства!
Княжна Марья молча посмотрела на него и нежно улыбнулась. – Ведь я вас давно знаю и люблю как брата, – сказала она. – Как вы нашли Андрея? – спросила она поспешно, не давая ему времени сказать что нибудь в ответ на ее ласковые слова. – Он очень беспокоит меня. Здоровье его зимой лучше, но прошлой весной рана открылась, и доктор сказал, что он должен ехать лечиться. И нравственно я очень боюсь за него. Он не такой характер как мы, женщины, чтобы выстрадать и выплакать свое горе. Он внутри себя носит его. Нынче он весел и оживлен; но это ваш приезд так подействовал на него: он редко бывает таким. Ежели бы вы могли уговорить его поехать за границу! Ему нужна деятельность, а эта ровная, тихая жизнь губит его. Другие не замечают, а я вижу.
В 10 м часу официанты бросились к крыльцу, заслышав бубенчики подъезжавшего экипажа старого князя. Князь Андрей с Пьером тоже вышли на крыльцо.
– Это кто? – спросил старый князь, вылезая из кареты и угадав Пьера.
– AI очень рад! целуй, – сказал он, узнав, кто был незнакомый молодой человек.
Старый князь был в хорошем духе и обласкал Пьера.
Перед ужином князь Андрей, вернувшись назад в кабинет отца, застал старого князя в горячем споре с Пьером.
Пьер доказывал, что придет время, когда не будет больше войны. Старый князь, подтрунивая, но не сердясь, оспаривал его.
– Кровь из жил выпусти, воды налей, тогда войны не будет. Бабьи бредни, бабьи бредни, – проговорил он, но всё таки ласково потрепал Пьера по плечу, и подошел к столу, у которого князь Андрей, видимо не желая вступать в разговор, перебирал бумаги, привезенные князем из города. Старый князь подошел к нему и стал говорить о делах.
– Предводитель, Ростов граф, половины людей не доставил. Приехал в город, вздумал на обед звать, – я ему такой обед задал… А вот просмотри эту… Ну, брат, – обратился князь Николай Андреич к сыну, хлопая по плечу Пьера, – молодец твой приятель, я его полюбил! Разжигает меня. Другой и умные речи говорит, а слушать не хочется, а он и врет да разжигает меня старика. Ну идите, идите, – сказал он, – может быть приду, за ужином вашим посижу. Опять поспорю. Мою дуру, княжну Марью полюби, – прокричал он Пьеру из двери.
Пьер теперь только, в свой приезд в Лысые Горы, оценил всю силу и прелесть своей дружбы с князем Андреем. Эта прелесть выразилась не столько в его отношениях с ним самим, сколько в отношениях со всеми родными и домашними. Пьер с старым, суровым князем и с кроткой и робкой княжной Марьей, несмотря на то, что он их почти не знал, чувствовал себя сразу старым другом. Они все уже любили его. Не только княжна Марья, подкупленная его кроткими отношениями к странницам, самым лучистым взглядом смотрела на него; но маленький, годовой князь Николай, как звал дед, улыбнулся Пьеру и пошел к нему на руки. Михаил Иваныч, m lle Bourienne с радостными улыбками смотрели на него, когда он разговаривал с старым князем.