Git

Поделись знанием:
Перейти к: навигация, поиск
Git
К:Википедия:Статьи без изображений (тип: не указан)

Git (произн. «гит»[1]) — распределённая система управления версиями. Проект был создан Линусом Торвальдсом для управления разработкой ядра Linux, первая версия выпущена 7 апреля 2005 года. На сегодняшний день его поддерживает Джунио Хамано.

Примерами проектов, использующих Git, являются Ядро Linux, Swift, Android, Drupal, Cairo, GNU Core Utilities, Mesa, Wine, Chromium, Compiz Fusion, FlightGear, jQuery, PHP, NASM, MediaWiki, DokuWiki, Qt и некоторые дистрибутивы Linux (см. ниже).

Программа является свободной и выпущена под лицензией GNU GPL версии 2.





Возможности

Система спроектирована как набор программ, специально разработанных с учётом их использования в скриптах. Это позволяет удобно создавать специализированные системы контроля версий на базе Git или пользовательские интерфейсы. Например, Cogito является именно таким примером оболочки к репозиториям Git, а StGit использует Git для управления коллекцией исправлений (патчей).

Git поддерживает быстрое разделение и слияние версий, включает инструменты для визуализации и навигации по нелинейной истории разработки. Как и Darcs, BitKeeper, Mercurial, Bazaar и Monotone, Git предоставляет каждому разработчику локальную копию всей истории разработки, изменения копируются из одного репозитория в другой.

Удалённый доступ к репозиториям Git обеспечивается git-daemon, SSH- или HTTP-сервером. TCP-сервис git-daemon входит в дистрибутив Git и является наряду с SSH наиболее распространённым и надёжным методом доступа. Метод доступа по HTTP, несмотря на ряд ограничений, очень популярен в контролируемых сетях, потому что позволяет использовать существующие конфигурации сетевых фильтров.

Особенности реализации

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

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

По умолчанию репозиторий хранится в подкаталоге с названием «.git» в корневом каталоге рабочей копии дерева файлов, хранящегося в репозитории. Любое файловое дерево в системе можно превратить в репозиторий git, отдав команду создания репозитория из корневого каталога этого дерева (или указав корневой каталог в параметрах программы). Репозиторий может быть импортирован с другого узла, доступного по сети. При импорте нового репозитория автоматически создаётся рабочая копия, соответствующая последнему зафиксированному состоянию импортируемого репозитория (то есть не копируются изменения в рабочей копии исходного узла, для которых на том узле не была выполнена команда commit).

Архитектура

Нижний уровень git является т. н. файловой системой с адресацией по содержимому (content-addressed file system). Инструмент командной строки git содержит ряд команд по непосредственной манипуляции этим репозиторием на низком уровне. Эти команды не нужны при нормальной работе с git как с системой контроля версий, но нужны для реализации сложных операций (ремонт поврежденного репозитория и т. д.), а также дают возможность создать на базе репозитория git какое-то своё приложение.

Для каждого объекта в репозитории вычисляется SHA-1 хеш, и именно он становится именем файла, содержащего данный объект в директории .git/objects. Для оптимизации работы с файловыми системами, не использующими деревья для директорий, первый байт хеша становится именем поддиректории, а остальные — именем файла в ней, что снижает количество файлов в одной директории (лимитирующий фактор производительности на таких устаревших файловых системах).

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

Кроме того, в репозитории существует директория refs, которая позволяет задать читаемые человеком имена для каких-то объектов git. В командах git оба вида ссылок — читаемые человеком из refs, и нижележащие SHA-1 — полностью взаимозаменяемы.

В классическом обычном сценарии в репозитории git есть три типа объектов — файл, дерево и коммит. Файл есть какая-то версия какого-то пользовательского файла, дерево — совокупность файлов из разных поддиректорий, коммит — дерево + некая дополнительная информация (например, родительский(е) коммит(ы), а также комментарий).

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

Репозиторий git бывает локальный и удаленный. Локальный репозиторий — это поддиректория .git, создается (в пустом виде) командой git init и (в непустом виде с немедленным копированием содержимого родительского удаленного репозитория и простановкой ссылки на родителя) командой git clone.

Практически все обычные операции с системой контроля версий, такие, как коммит и слияние, производятся только с локальным репозиторием. Удаленный репозиторий можно только синхронизировать с локальным как «вверх» (push), так и «вниз» (pull).

Наличие полностью всего репозитория проекта локально у каждого разработчика дает git ряд преимуществ перед SVN. Так, например, все операции, кроме push и pull, можно осуществлять без наличия Интернет-соединения.

Очень мощной возможностью git являются ветви, реализованные куда более полно, чем в SVN. Создать новую ветвь так же просто, как и совершить коммит. По сути, ветвь git есть не более чем читаемое человеком имя, «навешенное» на некий коммит в репозитории (используется поддиректория refs). Коммит без создания новой ветви всего лишь передвигает эту ссылку на себя, а коммит с созданием ветви — оставляет старую ссылку на месте, но создает новую на новый коммит, и объявляет её текущей. Заменить локальные девелоперские файлы на набор файлов из иной ветви, тем самым перейдя к работе с ней — также тривиально.

Также поддерживаются суб-репозитории с синхронизацией текущих ветвей в них.

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

Команда pull — обратна команде push. В случае, если одна и та же ветвь имеет независимую историю развития от какого-то момента в локальной и в удаленной копии, pull немедленно переходит к слиянию.

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

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

Кроме слияния, git поддерживает ещё и rebase. Эта операция есть получение набора всех изменений в ветви А, с последующим их «накатом» на ветвь B. В результате ветвь B продвигается до состояния AB. В отличие от слияния, в истории ветви AB не останется никаких промежуточных коммитов ветви A (только история ветви B и запись о самом rebase, это упрощает интеграцию крупных и очень крупных проектов).

Также git имеет временный локальный индекс файлов. Это — промежуточное хранилище между собственно файлами и очередным коммитом (коммит делается только из этого индекса). С помощью этого индекса осуществляется добавление новых файлов (git add добавляет их в индекс, они попадут в следующий коммит), а также коммит НЕ ВСЕХ измененных файлов (коммит делается только тем файлам, которым был сделан git add). После git add можно редактировать файл далее, получатся три копии одного и того же файла — последняя, в индексе (та, что была на момент git add), и в последнем коммите.

Имя ветви по умолчанию: master.

Имя удаленного репозитория по умолчанию, создаваемое git clone во время типичной операции «взять имеющийся проект с какого-то сервера себе на машину»: origin.

Таким образом, в локальном репозитории всегда есть ветвь master, которая есть последний локальный коммит, и ветвь origin/master, которая есть последнее состояние удаленного репозитория на момент завершения исполнения последней команды pull или push.

Команда fetch (частичный pull) — берет с удаленного сервера все изменения в origin/master, и переписывает их в локальный репозиторий, продвигая метку origin/master.

Если после этого master и origin/master разошлись в стороны, то необходимо сделать слияние, установив master на результат слияния (команда pull есть fetch+merge). Далее возможно сделать push, отправив результат слияния на сервер и установив на него origin/master.

Детали реализации в Windows

В Windows версии (официальная Windows-версия называется mSysGit) используется пакет mSys — эмулятор POSIX-совместимой командной строки над Windows (производный от MinGW, примерный аналог Cygwin).

Под mSys перенесены все необходимые для git библиотеки и инструменты, а также сам git.

При работе с удаленными репозиториями по протоколу SSL будет использоваться хранилище сертификатов из mSys, а не из Windows.

Существует немало графических оболочек для Git, например, TortoiseGit. Все они реализованы через вызовы mSysGit и требуют его установки на машину. Не исключение и SourceTree, решение компании Atlassian, но mSysGit оно содержит внутри себя, что имеет свои плюсы и минусы (так установка в глубокую поддиректорию затрудняет добавление в mSys нужных SSL-сертификатов).

Сетевые возможности и серверные решения

git использует сеть только для операций обмена с удалёнными репозиториями.

Возможно использование следующих протоколов:

  • git://, открытый протокол[2], требующий наличие на сервере запущенного демона[3] (поставляется вместе с git). Протокол не имеет средств аутентификации пользователей.
  • ssh:// Использует аутентификацию пользователей с помощью пар ключей, а также встроенный в UNIX-систему «основной» SSH-сервер (sshd). Со стороны сервера требуется создание аккаунтов, шеллом у которых будет некая команда git.
  • http(s)://. Использует внутри себя инструмент curl (для Windows — поставляется вместе с git), и его возможности HTTP-аутентификации, как и его поддержку SSL и сертификатов.

В последнем случае необходимо наличие на сервере некоего ПО веб-приложения, которое будет исполнять роль прослойки между командами git на сервере и HTTP-сервером. Такие прослойки существуют как под Linux, так и под Windows (например, WebGitNet, разработанный на ASP.NET MVC 4).

Кроме поддержки серверной стороны команд push и pull, такие веб-приложения могут также давать доступ только на чтение к репозиторию через веб-браузер.

Преимущества и недостатки

К:Википедия:Статьи без источников (тип: не указан)

Преимущества и недостатки git по сравнению с централизованными системами управления версиями (такими как, например, Subversion) типичны для любой распределённой системы и описаны в статье «Система управления версиями». Если же сравнивать git с «родственными» ей распределёнными системами, можно отметить, что git изначально идеологически ориентирован на работу с изменениями, а не с файлами, «единицей обработки» для него является набор изменений, или патч. Эта особенность прослеживается как в структуре самой системы (в частности — в структуре репозитория), так и в принципах построения команд; она отражается на производительности системы в различных вариантах её использования и на достоинствах и недостатках git по сравнению с другими DVCS.

Часто называемые преимущества git перед другими DVCS:

  • Высокая производительность.
  • Развитые средства интеграции с другими VCS, в частности, с CVS, SVN и Mercurial. Помимо разнонаправленных конвертеров репозиториев, имеющиеся в комплекте программные средства позволяют разработчикам использовать git при размещении центрального репозитория в SVN или CVS, кроме того, git может имитировать cvs-сервер, обеспечивая работу через клиентские приложения и поддержку в средах разработки, специально не поддерживающих git.
  • Продуманная система команд, позволяющая удобно встраивать git в скрипты.
  • Качественный веб-интерфейс «из коробки».
  • Репозитории git могут распространяться и обновляться общесистемными файловыми утилитами архивации и обновления, такими как rsync, благодаря тому, что фиксации изменений и синхронизации не меняют существующие файлы с данными, а только добавляют новые (за исключением некоторых служебных файлов, которые могут быть автоматически обновлены с помощью имеющихся в составе системы утилит). Для раздачи репозитория по сети достаточно любого веб-сервера.

В числе недостатков git обычно называют:

  • Отсутствие сквозной нумерации коммитов монотонно непрерывно возрастающими целыми числами. Во многих проектах используется автоматическое получение номера этой версии (например, командой svnversion), построение .H файла на основе этого числа, и далее его использование при создании штампа версии исполняемого файла, некоторых вшитых в него строк и так далее.
  • Отсутствие переносимой на другие операционные системы поддержки путей в кодировке Unicode в Microsoft Windows (для версий msysgit до 1.8.1). Если путь содержит символы, отличные от ANSI, то их поддержка из командной строки требует специфических настроек, которые не гарантируют правильного отображения файловых имён при пользовании тем же репозиторием из других ОС. Одним из способов решения проблемы для git 1.7 является использование специально пропатченного консольного клиента. Другой вариант — использование графических утилит, работающих напрямую через API, таких как TortoiseGit.
  • Некоторое неудобство для пользователей, переходящих с других VCS. Команды git, ориентированные на наборы изменений, а не на файлы, могут вызвать недоумение у пользователей, привыкших к файл-ориентированным VCS, таким как SVN. Например, команда «add», которая в большинстве систем управления версиями производит добавление файла к проекту, в git подготавливает к фиксации сделанные в файлах изменения. При этом сохраняется не патч, описывающий изменения, а новая версия целевого файла.
  • Использование для идентификации ревизий хешей SHA1, что приводит к необходимости оперировать длинными строками вместо коротких номеров версий, как во многих других системах (хотя в командах допускается использование неполных хеш-строк).
  • Бо́льшие накладные расходы при работе с проектами, в которых делаются многочисленные несвязанные между собой изменения файлов. При работе в таком режиме размеры наборов изменений становятся достаточно велики и происходит быстрый рост объёма репозиториев.
  • Бо́льшие затраты времени, по сравнению с файл-ориентированными системами, на формирование истории конкретного файла, истории правок конкретного пользователя, поиска изменений, относящихся к заданному месту определённого файла.
  • Отсутствие отдельной команды переименования/перемещения файла, которая отображалась бы в истории как соответствующее единое действие. Существующий скрипт git mv фактически выполняет переименование, копирование файла и удаление его на старом месте, что требует специального анализа для определения, что в действительности файл был просто перенесён (этот анализ выполняется автоматически командами просмотра истории). Однако, учитывая тот факт, что наличие специальной команды для переименования/перемещения файлов технически не вынуждает пользователя использовать именно её (и, как следствие, в этом случае возможны разрывы в истории), поведение git может считаться преимуществом.
  • Система работает только с файлами и их содержимым, и не отслеживает пустые каталоги.

В ряде публикаций, относящихся преимущественно к 2005—2008 годам можно встретить также нарекания в отношении документации git, отсутствия удобной windows-версии и удобных графических клиентов. В настоящее время эта критика неактуальна: существует версия git на основе MinGW («родная» сборка под Windows), и несколько высококачественных графических клиентов для различных операционных систем, в частности, под Windows имеется клиент TortoiseGit, идеологически очень близкий к широко распространённому TortoiseSVN — клиенту SVN, встраиваемому в оболочку Windows.

Графические интерфейсы

  • [www.syntevo.com/smartgit/index.html SmartGit] — кроссплатформенный интерфейс для Git на Java.
  • [gitk.sourceforge.net/ gitk] — простая и быстрая программа, написана на Tcl/Tk, распространяется с самим Git.
  • [digilander.libero.it/mcostalba/ QGit], интерфейс которого написан с использованием Qt, во многом схож с gitk, но несколько отличается набором возможностей. В настоящее время существуют реализации на Qt3 и Qt4.
  • [live.gnome.org/giggle Giggle] — вариант на Gtk+.
  • [trac.novowork.com/gitg/ gitg] — ещё один интерфейс для gtk+/GNOME
  • [gitextensions.github.io/ Git Extensions] — кроссплатформенный вариант на .NET.
  • TortoiseGit — интерфейс, реализованный как расширение для проводника Windows.
  • [sourcetreeapp.com/ SourceTree] — бесплатный git клиент для Windows и Mac.
  • [git-cola.github.com/ Git-cola] — кроссплатформенный интерфейс на Python.
  • [gitx.frim.nl/ GitX] — оболочка для Mac OS X с интерфейсом Cocoa, интерфейс схож с gitk.
  • [gittiapp.com/ Gitti] — оболочка для Mac OS X с интерфейсом Cocoa.
  • [gitboxapp.com/ Gitbox] — оболочка для Mac OS X с интерфейсом Cocoa.
  • Github-клиент
  • [www.procode.org/stgit/ StGit] — написанная на Python система управления коллекцией патчей (Catalin Marinas)
  • [www.gitkraken.com/ GitKraken] — кросплатформенный клиент.

Фронтенды для Web

Название Функции Язык Активность Версия Лицензия
[gitlab.org/ GitLab] Просмотр репозитория и истории изменений, управление репозиториями. Права доступа. Система непрерывного тестирования Ruby да 8.8.1 (23 мая 2016) [gitlab.com/gitlab-org/gitlab-ce/blob/master/LICENSE MIT]
[gitblit.com/ Gitblit] Просмотр репозитория и истории изменений, управление репозиториями. Права доступа Java да 1.7.1 (23 ноября 2015) Apache License 2.0
Gerrit Интеграция с репозиторием для организации совместной инспекции кода Java да 2.12.2 (11 марта 2015) Apache License 2.0
[git.wiki.kernel.org/index.php/Gitweb Gitweb] Просмотр репозитория. Может работать как CGI скрипт в веб-сервере Perl да поставляется с git GPLv2
[git.zx2c4.com/cgit/about/ cgit] Просмотр репозитория и истории изменений C да 0.12 (14 января 2016) GPLv2
[sourceforge.net/projects/viewgit/ ViewGit] Просмотр репозитория и истории изменений PHP да 0.0.7 (март 2013) GNU AGPLv3
[github.com/klaussilveira/gitlist GitList] Просмотр репозитория и истории изменений PHP нет июль 2006 New BSD license
[github.com/josegonzalez/git-php git-php] Доработанная версия другого заброшенного проекта с одноимённым [code.google.com/p/git-php/ названием]. PHP нет 2011 GPLv2 (?)
[www.absolutegiganten.org/wit/ wit]  ??? Python нет 0.0.4 (сентябрь 2005) GPLv2
[flameeyes.is-a-geek.org/projects#gitarella gitarella] Просмотр репозитория и истории изменений Ruby нет 0.003 (июль 2006) GPLv2
[gogs.io/ Gogs] Просмотр репозитория и истории изменений, управление репозиториями. Права доступа Go да 0.9.13 (19 марта 2016) MIT License

Обмен изменениями с другими системами контроля версий

  • CVS — импорт и экспорт, эмуляция CVS-сервера, в стандартной поставке
  • Subversion — импорт и экспорт (частично), в стандартной поставке
  • .tar.gz, .tar.bz2 (серии версионированых файлов) — импорт и экспорт, в стандартной поставке

Напишите отзыв о статье "Git"

Примечания

  1. [dictionary.reference.com/browse/git?qsrc=2446 git]
  2. [git-scm.com/book/en/Git-Internals-Transfer-Protocols Git - Transfer Protocols]
  3. [git-scm.com/book/ru/v1/Git-на-сервере-Git-демон Git на сервере - Git-демон]

См. также

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

Сервисы, предоставляющие хостинг для git-репозиториев:

Ссылки

  • [git-scm.com/ Домашняя страница Git] (англ.)
  • [www.youtube.com/watch?v=BtAlN4MaBr8 Линус Торвальдс о git]  (рус.) (YouTube)
  • [geektimes.ru/post/248744/ Десять лет Git: интервью с создателем — Линус Торвальдс]
  • [githowto.com/ru/ Интерактивный тур Git How To] (рус.)
  • [freesource.info/wiki/RuslanHihin/gitusermanual?v=b7s& Руководство пользователя GIT]  (рус.)
  • [schacon.github.com/git/user-manual.html Git User’s Manual]  (англ.) (также распространяется вместе с исходным текстом программы: Documentation/user-manual.txt)
  • [kernel.org/pub/software/scm/git/ Страница Git на kernel.org] (англ.)
  • [schacon.github.com/git/everyday.html Everyday Git] (англ.) («Git на каждый день») — набор из примерно 20 команд (на самом деле их будет около 5-6), которые пригодятся в повседневном использовании системы.
  • [www.youtube.com/watch?v=4XpnKHJAok8 Linus Torvalds on Git] (англ.) — рассказ Линуса Торвальдса о git и других системах контроля версий (YouTube)
  • [youtube.com/watch?v=8dhZ9BXQgc4 Randal Schwartz on Git] (англ.) — рассказ Рэндела Шварца о git (YouTube)
  • [www.youtube.com/watch?v=j45cs5_nY2k Contributing with Git] (англ.) — Google Talks 27.10.2008 (YouTube)
  • [gitcasts.com GitCasts.com] (англ.) — сайт, посвящённый скринкастам по использованию git.
  • [code.google.com/p/support/wiki/DVCSAnalysis Сравнение Git и Mercurial в FAQ сайта Google Code] (англ.)
  • [www.eqqon.com/index.php/GitSharp C#-реализация Git — системы контроля версий для .NET и Mono] (англ.)
  • Учебник [git-scm.com/book/ru/ Pro Git] на русском языке (Creative Commons Attribution-Non Commercial-Share Alike 3.0 license).
  • [habrahabr.ru/post/68341/ Git на пальцах] (рус.)
  • [habrahabr.ru/post/106912/ Удачная модель ветвления для Git] (рус.)
  • [marklodato.github.com/visual-git-guide/index-ru.html Git — наглядная справка] (рус.)

Отрывок, характеризующий Git

– Ну, что тебе за дело, Вера? – тихеньким голоском, заступнически проговорила Наташа.
Она, видимо, была ко всем еще более, чем всегда, в этот день добра и ласкова.
– Очень глупо, – сказала Вера, – мне совестно за вас. Что за секреты?…
– У каждого свои секреты. Мы тебя с Бергом не трогаем, – сказала Наташа разгорячаясь.
– Я думаю, не трогаете, – сказала Вера, – потому что в моих поступках никогда ничего не может быть дурного. А вот я маменьке скажу, как ты с Борисом обходишься.
– Наталья Ильинишна очень хорошо со мной обходится, – сказал Борис. – Я не могу жаловаться, – сказал он.
– Оставьте, Борис, вы такой дипломат (слово дипломат было в большом ходу у детей в том особом значении, какое они придавали этому слову); даже скучно, – сказала Наташа оскорбленным, дрожащим голосом. – За что она ко мне пристает? Ты этого никогда не поймешь, – сказала она, обращаясь к Вере, – потому что ты никогда никого не любила; у тебя сердца нет, ты только madame de Genlis [мадам Жанлис] (это прозвище, считавшееся очень обидным, было дано Вере Николаем), и твое первое удовольствие – делать неприятности другим. Ты кокетничай с Бергом, сколько хочешь, – проговорила она скоро.
– Да уж я верно не стану перед гостями бегать за молодым человеком…
– Ну, добилась своего, – вмешался Николай, – наговорила всем неприятностей, расстроила всех. Пойдемте в детскую.
Все четверо, как спугнутая стая птиц, поднялись и пошли из комнаты.
– Мне наговорили неприятностей, а я никому ничего, – сказала Вера.
– Madame de Genlis! Madame de Genlis! – проговорили смеющиеся голоса из за двери.
Красивая Вера, производившая на всех такое раздражающее, неприятное действие, улыбнулась и видимо не затронутая тем, что ей было сказано, подошла к зеркалу и оправила шарф и прическу. Глядя на свое красивое лицо, она стала, повидимому, еще холоднее и спокойнее.

В гостиной продолжался разговор.
– Ah! chere, – говорила графиня, – и в моей жизни tout n'est pas rose. Разве я не вижу, что du train, que nous allons, [не всё розы. – при нашем образе жизни,] нашего состояния нам не надолго! И всё это клуб, и его доброта. В деревне мы живем, разве мы отдыхаем? Театры, охоты и Бог знает что. Да что обо мне говорить! Ну, как же ты это всё устроила? Я часто на тебя удивляюсь, Annette, как это ты, в свои годы, скачешь в повозке одна, в Москву, в Петербург, ко всем министрам, ко всей знати, со всеми умеешь обойтись, удивляюсь! Ну, как же это устроилось? Вот я ничего этого не умею.
– Ах, душа моя! – отвечала княгиня Анна Михайловна. – Не дай Бог тебе узнать, как тяжело остаться вдовой без подпоры и с сыном, которого любишь до обожания. Всему научишься, – продолжала она с некоторою гордостью. – Процесс мой меня научил. Ежели мне нужно видеть кого нибудь из этих тузов, я пишу записку: «princesse une telle [княгиня такая то] желает видеть такого то» и еду сама на извозчике хоть два, хоть три раза, хоть четыре, до тех пор, пока не добьюсь того, что мне надо. Мне всё равно, что бы обо мне ни думали.
– Ну, как же, кого ты просила о Бореньке? – спросила графиня. – Ведь вот твой уже офицер гвардии, а Николушка идет юнкером. Некому похлопотать. Ты кого просила?
– Князя Василия. Он был очень мил. Сейчас на всё согласился, доложил государю, – говорила княгиня Анна Михайловна с восторгом, совершенно забыв всё унижение, через которое она прошла для достижения своей цели.
– Что он постарел, князь Василий? – спросила графиня. – Я его не видала с наших театров у Румянцевых. И думаю, забыл про меня. Il me faisait la cour, [Он за мной волочился,] – вспомнила графиня с улыбкой.
– Всё такой же, – отвечала Анна Михайловна, – любезен, рассыпается. Les grandeurs ne lui ont pas touriene la tete du tout. [Высокое положение не вскружило ему головы нисколько.] «Я жалею, что слишком мало могу вам сделать, милая княгиня, – он мне говорит, – приказывайте». Нет, он славный человек и родной прекрасный. Но ты знаешь, Nathalieie, мою любовь к сыну. Я не знаю, чего я не сделала бы для его счастья. А обстоятельства мои до того дурны, – продолжала Анна Михайловна с грустью и понижая голос, – до того дурны, что я теперь в самом ужасном положении. Мой несчастный процесс съедает всё, что я имею, и не подвигается. У меня нет, можешь себе представить, a la lettre [буквально] нет гривенника денег, и я не знаю, на что обмундировать Бориса. – Она вынула платок и заплакала. – Мне нужно пятьсот рублей, а у меня одна двадцатипятирублевая бумажка. Я в таком положении… Одна моя надежда теперь на графа Кирилла Владимировича Безухова. Ежели он не захочет поддержать своего крестника, – ведь он крестил Борю, – и назначить ему что нибудь на содержание, то все мои хлопоты пропадут: мне не на что будет обмундировать его.
Графиня прослезилась и молча соображала что то.
– Часто думаю, может, это и грех, – сказала княгиня, – а часто думаю: вот граф Кирилл Владимирович Безухой живет один… это огромное состояние… и для чего живет? Ему жизнь в тягость, а Боре только начинать жить.
– Он, верно, оставит что нибудь Борису, – сказала графиня.
– Бог знает, chere amie! [милый друг!] Эти богачи и вельможи такие эгоисты. Но я всё таки поеду сейчас к нему с Борисом и прямо скажу, в чем дело. Пускай обо мне думают, что хотят, мне, право, всё равно, когда судьба сына зависит от этого. – Княгиня поднялась. – Теперь два часа, а в четыре часа вы обедаете. Я успею съездить.
И с приемами петербургской деловой барыни, умеющей пользоваться временем, Анна Михайловна послала за сыном и вместе с ним вышла в переднюю.
– Прощай, душа моя, – сказала она графине, которая провожала ее до двери, – пожелай мне успеха, – прибавила она шопотом от сына.
– Вы к графу Кириллу Владимировичу, ma chere? – сказал граф из столовой, выходя тоже в переднюю. – Коли ему лучше, зовите Пьера ко мне обедать. Ведь он у меня бывал, с детьми танцовал. Зовите непременно, ma chere. Ну, посмотрим, как то отличится нынче Тарас. Говорит, что у графа Орлова такого обеда не бывало, какой у нас будет.


– Mon cher Boris, [Дорогой Борис,] – сказала княгиня Анна Михайловна сыну, когда карета графини Ростовой, в которой они сидели, проехала по устланной соломой улице и въехала на широкий двор графа Кирилла Владимировича Безухого. – Mon cher Boris, – сказала мать, выпрастывая руку из под старого салопа и робким и ласковым движением кладя ее на руку сына, – будь ласков, будь внимателен. Граф Кирилл Владимирович всё таки тебе крестный отец, и от него зависит твоя будущая судьба. Помни это, mon cher, будь мил, как ты умеешь быть…
– Ежели бы я знал, что из этого выйдет что нибудь, кроме унижения… – отвечал сын холодно. – Но я обещал вам и делаю это для вас.
Несмотря на то, что чья то карета стояла у подъезда, швейцар, оглядев мать с сыном (которые, не приказывая докладывать о себе, прямо вошли в стеклянные сени между двумя рядами статуй в нишах), значительно посмотрев на старенький салоп, спросил, кого им угодно, княжен или графа, и, узнав, что графа, сказал, что их сиятельству нынче хуже и их сиятельство никого не принимают.
– Мы можем уехать, – сказал сын по французски.
– Mon ami! [Друг мой!] – сказала мать умоляющим голосом, опять дотрогиваясь до руки сына, как будто это прикосновение могло успокоивать или возбуждать его.
Борис замолчал и, не снимая шинели, вопросительно смотрел на мать.
– Голубчик, – нежным голоском сказала Анна Михайловна, обращаясь к швейцару, – я знаю, что граф Кирилл Владимирович очень болен… я затем и приехала… я родственница… Я не буду беспокоить, голубчик… А мне бы только надо увидать князя Василия Сергеевича: ведь он здесь стоит. Доложи, пожалуйста.
Швейцар угрюмо дернул снурок наверх и отвернулся.
– Княгиня Друбецкая к князю Василию Сергеевичу, – крикнул он сбежавшему сверху и из под выступа лестницы выглядывавшему официанту в чулках, башмаках и фраке.
Мать расправила складки своего крашеного шелкового платья, посмотрелась в цельное венецианское зеркало в стене и бодро в своих стоптанных башмаках пошла вверх по ковру лестницы.
– Mon cher, voue m'avez promis, [Мой друг, ты мне обещал,] – обратилась она опять к Сыну, прикосновением руки возбуждая его.
Сын, опустив глаза, спокойно шел за нею.
Они вошли в залу, из которой одна дверь вела в покои, отведенные князю Василью.
В то время как мать с сыном, выйдя на середину комнаты, намеревались спросить дорогу у вскочившего при их входе старого официанта, у одной из дверей повернулась бронзовая ручка и князь Василий в бархатной шубке, с одною звездой, по домашнему, вышел, провожая красивого черноволосого мужчину. Мужчина этот был знаменитый петербургский доктор Lorrain.
– C'est donc positif? [Итак, это верно?] – говорил князь.
– Mon prince, «errare humanum est», mais… [Князь, человеку ошибаться свойственно.] – отвечал доктор, грассируя и произнося латинские слова французским выговором.
– C'est bien, c'est bien… [Хорошо, хорошо…]
Заметив Анну Михайловну с сыном, князь Василий поклоном отпустил доктора и молча, но с вопросительным видом, подошел к ним. Сын заметил, как вдруг глубокая горесть выразилась в глазах его матери, и слегка улыбнулся.
– Да, в каких грустных обстоятельствах пришлось нам видеться, князь… Ну, что наш дорогой больной? – сказала она, как будто не замечая холодного, оскорбительного, устремленного на нее взгляда.
Князь Василий вопросительно, до недоумения, посмотрел на нее, потом на Бориса. Борис учтиво поклонился. Князь Василий, не отвечая на поклон, отвернулся к Анне Михайловне и на ее вопрос отвечал движением головы и губ, которое означало самую плохую надежду для больного.
– Неужели? – воскликнула Анна Михайловна. – Ах, это ужасно! Страшно подумать… Это мой сын, – прибавила она, указывая на Бориса. – Он сам хотел благодарить вас.
Борис еще раз учтиво поклонился.
– Верьте, князь, что сердце матери никогда не забудет того, что вы сделали для нас.
– Я рад, что мог сделать вам приятное, любезная моя Анна Михайловна, – сказал князь Василий, оправляя жабо и в жесте и голосе проявляя здесь, в Москве, перед покровительствуемою Анною Михайловной еще гораздо большую важность, чем в Петербурге, на вечере у Annette Шерер.
– Старайтесь служить хорошо и быть достойным, – прибавил он, строго обращаясь к Борису. – Я рад… Вы здесь в отпуску? – продиктовал он своим бесстрастным тоном.
– Жду приказа, ваше сиятельство, чтоб отправиться по новому назначению, – отвечал Борис, не выказывая ни досады за резкий тон князя, ни желания вступить в разговор, но так спокойно и почтительно, что князь пристально поглядел на него.
– Вы живете с матушкой?
– Я живу у графини Ростовой, – сказал Борис, опять прибавив: – ваше сиятельство.
– Это тот Илья Ростов, который женился на Nathalie Шиншиной, – сказала Анна Михайловна.
– Знаю, знаю, – сказал князь Василий своим монотонным голосом. – Je n'ai jamais pu concevoir, comment Nathalieie s'est decidee a epouser cet ours mal – leche l Un personnage completement stupide et ridicule.Et joueur a ce qu'on dit. [Я никогда не мог понять, как Натали решилась выйти замуж за этого грязного медведя. Совершенно глупая и смешная особа. К тому же игрок, говорят.]
– Mais tres brave homme, mon prince, [Но добрый человек, князь,] – заметила Анна Михайловна, трогательно улыбаясь, как будто и она знала, что граф Ростов заслуживал такого мнения, но просила пожалеть бедного старика. – Что говорят доктора? – спросила княгиня, помолчав немного и опять выражая большую печаль на своем исплаканном лице.
– Мало надежды, – сказал князь.
– А мне так хотелось еще раз поблагодарить дядю за все его благодеяния и мне и Боре. C'est son filleuil, [Это его крестник,] – прибавила она таким тоном, как будто это известие должно было крайне обрадовать князя Василия.
Князь Василий задумался и поморщился. Анна Михайловна поняла, что он боялся найти в ней соперницу по завещанию графа Безухого. Она поспешила успокоить его.
– Ежели бы не моя истинная любовь и преданность дяде, – сказала она, с особенною уверенностию и небрежностию выговаривая это слово: – я знаю его характер, благородный, прямой, но ведь одни княжны при нем…Они еще молоды… – Она наклонила голову и прибавила шопотом: – исполнил ли он последний долг, князь? Как драгоценны эти последние минуты! Ведь хуже быть не может; его необходимо приготовить ежели он так плох. Мы, женщины, князь, – она нежно улыбнулась, – всегда знаем, как говорить эти вещи. Необходимо видеть его. Как бы тяжело это ни было для меня, но я привыкла уже страдать.
Князь, видимо, понял, и понял, как и на вечере у Annette Шерер, что от Анны Михайловны трудно отделаться.
– Не было бы тяжело ему это свидание, chere Анна Михайловна, – сказал он. – Подождем до вечера, доктора обещали кризис.
– Но нельзя ждать, князь, в эти минуты. Pensez, il у va du salut de son ame… Ah! c'est terrible, les devoirs d'un chretien… [Подумайте, дело идет о спасения его души! Ах! это ужасно, долг христианина…]
Из внутренних комнат отворилась дверь, и вошла одна из княжен племянниц графа, с угрюмым и холодным лицом и поразительно несоразмерною по ногам длинною талией.
Князь Василий обернулся к ней.
– Ну, что он?
– Всё то же. И как вы хотите, этот шум… – сказала княжна, оглядывая Анну Михайловну, как незнакомую.
– Ah, chere, je ne vous reconnaissais pas, [Ах, милая, я не узнала вас,] – с счастливою улыбкой сказала Анна Михайловна, легкою иноходью подходя к племяннице графа. – Je viens d'arriver et je suis a vous pour vous aider a soigner mon oncle . J`imagine, combien vous avez souffert, [Я приехала помогать вам ходить за дядюшкой. Воображаю, как вы настрадались,] – прибавила она, с участием закатывая глаза.
Княжна ничего не ответила, даже не улыбнулась и тотчас же вышла. Анна Михайловна сняла перчатки и в завоеванной позиции расположилась на кресле, пригласив князя Василья сесть подле себя.
– Борис! – сказала она сыну и улыбнулась, – я пройду к графу, к дяде, а ты поди к Пьеру, mon ami, покаместь, да не забудь передать ему приглашение от Ростовых. Они зовут его обедать. Я думаю, он не поедет? – обратилась она к князю.
– Напротив, – сказал князь, видимо сделавшийся не в духе. – Je serais tres content si vous me debarrassez de ce jeune homme… [Я был бы очень рад, если бы вы меня избавили от этого молодого человека…] Сидит тут. Граф ни разу не спросил про него.
Он пожал плечами. Официант повел молодого человека вниз и вверх по другой лестнице к Петру Кирилловичу.


Пьер так и не успел выбрать себе карьеры в Петербурге и, действительно, был выслан в Москву за буйство. История, которую рассказывали у графа Ростова, была справедлива. Пьер участвовал в связываньи квартального с медведем. Он приехал несколько дней тому назад и остановился, как всегда, в доме своего отца. Хотя он и предполагал, что история его уже известна в Москве, и что дамы, окружающие его отца, всегда недоброжелательные к нему, воспользуются этим случаем, чтобы раздражить графа, он всё таки в день приезда пошел на половину отца. Войдя в гостиную, обычное местопребывание княжен, он поздоровался с дамами, сидевшими за пяльцами и за книгой, которую вслух читала одна из них. Их было три. Старшая, чистоплотная, с длинною талией, строгая девица, та самая, которая выходила к Анне Михайловне, читала; младшие, обе румяные и хорошенькие, отличавшиеся друг от друга только тем, что у одной была родинка над губой, очень красившая ее, шили в пяльцах. Пьер был встречен как мертвец или зачумленный. Старшая княжна прервала чтение и молча посмотрела на него испуганными глазами; младшая, без родинки, приняла точно такое же выражение; самая меньшая, с родинкой, веселого и смешливого характера, нагнулась к пяльцам, чтобы скрыть улыбку, вызванную, вероятно, предстоящею сценой, забавность которой она предвидела. Она притянула вниз шерстинку и нагнулась, будто разбирая узоры и едва удерживаясь от смеха.
– Bonjour, ma cousine, – сказал Пьер. – Vous ne me гесоnnaissez pas? [Здравствуйте, кузина. Вы меня не узнаете?]
– Я слишком хорошо вас узнаю, слишком хорошо.
– Как здоровье графа? Могу я видеть его? – спросил Пьер неловко, как всегда, но не смущаясь.
– Граф страдает и физически и нравственно, и, кажется, вы позаботились о том, чтобы причинить ему побольше нравственных страданий.
– Могу я видеть графа? – повторил Пьер.
– Гм!.. Ежели вы хотите убить его, совсем убить, то можете видеть. Ольга, поди посмотри, готов ли бульон для дяденьки, скоро время, – прибавила она, показывая этим Пьеру, что они заняты и заняты успокоиваньем его отца, тогда как он, очевидно, занят только расстроиванием.
Ольга вышла. Пьер постоял, посмотрел на сестер и, поклонившись, сказал:
– Так я пойду к себе. Когда можно будет, вы мне скажите.
Он вышел, и звонкий, но негромкий смех сестры с родинкой послышался за ним.
На другой день приехал князь Василий и поместился в доме графа. Он призвал к себе Пьера и сказал ему:
– Mon cher, si vous vous conduisez ici, comme a Petersbourg, vous finirez tres mal; c'est tout ce que je vous dis. [Мой милый, если вы будете вести себя здесь, как в Петербурге, вы кончите очень дурно; больше мне нечего вам сказать.] Граф очень, очень болен: тебе совсем не надо его видеть.
С тех пор Пьера не тревожили, и он целый день проводил один наверху, в своей комнате.
В то время как Борис вошел к нему, Пьер ходил по своей комнате, изредка останавливаясь в углах, делая угрожающие жесты к стене, как будто пронзая невидимого врага шпагой, и строго взглядывая сверх очков и затем вновь начиная свою прогулку, проговаривая неясные слова, пожимая плечами и разводя руками.
– L'Angleterre a vecu, [Англии конец,] – проговорил он, нахмуриваясь и указывая на кого то пальцем. – M. Pitt comme traitre a la nation et au droit des gens est condamiene a… [Питт, как изменник нации и народному праву, приговаривается к…] – Он не успел договорить приговора Питту, воображая себя в эту минуту самим Наполеоном и вместе с своим героем уже совершив опасный переезд через Па де Кале и завоевав Лондон, – как увидал входившего к нему молодого, стройного и красивого офицера. Он остановился. Пьер оставил Бориса четырнадцатилетним мальчиком и решительно не помнил его; но, несмотря на то, с свойственною ему быстрою и радушною манерой взял его за руку и дружелюбно улыбнулся.
– Вы меня помните? – спокойно, с приятной улыбкой сказал Борис. – Я с матушкой приехал к графу, но он, кажется, не совсем здоров.
– Да, кажется, нездоров. Его всё тревожат, – отвечал Пьер, стараясь вспомнить, кто этот молодой человек.
Борис чувствовал, что Пьер не узнает его, но не считал нужным называть себя и, не испытывая ни малейшего смущения, смотрел ему прямо в глаза.
– Граф Ростов просил вас нынче приехать к нему обедать, – сказал он после довольно долгого и неловкого для Пьера молчания.
– А! Граф Ростов! – радостно заговорил Пьер. – Так вы его сын, Илья. Я, можете себе представить, в первую минуту не узнал вас. Помните, как мы на Воробьевы горы ездили c m me Jacquot… [мадам Жако…] давно.
– Вы ошибаетесь, – неторопливо, с смелою и несколько насмешливою улыбкой проговорил Борис. – Я Борис, сын княгини Анны Михайловны Друбецкой. Ростова отца зовут Ильей, а сына – Николаем. И я m me Jacquot никакой не знал.
Пьер замахал руками и головой, как будто комары или пчелы напали на него.
– Ах, ну что это! я всё спутал. В Москве столько родных! Вы Борис…да. Ну вот мы с вами и договорились. Ну, что вы думаете о булонской экспедиции? Ведь англичанам плохо придется, ежели только Наполеон переправится через канал? Я думаю, что экспедиция очень возможна. Вилльнев бы не оплошал!
Борис ничего не знал о булонской экспедиции, он не читал газет и о Вилльневе в первый раз слышал.
– Мы здесь в Москве больше заняты обедами и сплетнями, чем политикой, – сказал он своим спокойным, насмешливым тоном. – Я ничего про это не знаю и не думаю. Москва занята сплетнями больше всего, – продолжал он. – Теперь говорят про вас и про графа.
Пьер улыбнулся своей доброю улыбкой, как будто боясь за своего собеседника, как бы он не сказал чего нибудь такого, в чем стал бы раскаиваться. Но Борис говорил отчетливо, ясно и сухо, прямо глядя в глаза Пьеру.
– Москве больше делать нечего, как сплетничать, – продолжал он. – Все заняты тем, кому оставит граф свое состояние, хотя, может быть, он переживет всех нас, чего я от души желаю…
– Да, это всё очень тяжело, – подхватил Пьер, – очень тяжело. – Пьер всё боялся, что этот офицер нечаянно вдастся в неловкий для самого себя разговор.
– А вам должно казаться, – говорил Борис, слегка краснея, но не изменяя голоса и позы, – вам должно казаться, что все заняты только тем, чтобы получить что нибудь от богача.
«Так и есть», подумал Пьер.
– А я именно хочу сказать вам, чтоб избежать недоразумений, что вы очень ошибетесь, ежели причтете меня и мою мать к числу этих людей. Мы очень бедны, но я, по крайней мере, за себя говорю: именно потому, что отец ваш богат, я не считаю себя его родственником, и ни я, ни мать никогда ничего не будем просить и не примем от него.