Mercurial

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

Matt Mackall

К:Википедия:Статьи без изображений (тип: не указан)

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





Описание

Система Mercurial написана на Python, хотя чувствительные к производительности части (например, своя реализация diff) выполнены в качестве модулей-расширений на C[1]. Mercurial первоначально была написана для Linux, позже портирована под Windows, Mac OS X и большинство Unix-систем. Репозитории Mercurial управляются при помощи утилиты командной строки hg, но есть и GUI–интерфейсы.

Наряду с традиционными возможностями систем контроля версий, Mercurial поддерживает полностью децентрализованную работу (отсутствует понятие основного хранилища кода), ветвление (возможно вести несколько веток одного проекта и копировать изменения между ветками), слияние репозиториев (чем и достигается «распределённость» работы). Поддерживается обмен данными между репозиториями через HTTP/HTTPS, SSH и вручную при помощи упакованных наборов изменений.

Утилита hg обладает компактным интерфейсом, и Mercurial считается более простой в освоении системой, чем, например, git[2].

Концепции

Рабочий процесс

Mercurial является распределённой (децентрализованной) системой контроля версий. Это означает, что рабочий процесс, как правило, выглядит следующим образом:

  1. На личном компьютере создаётся новый репозиторий (путём клонирования существующего репозитория, создания нового и т. п.);
  2. В рабочей директории данного репозитория изменяются/добавляются/удаляются файлы;
  3. Выполняется фиксация (commit) изменений в данный репозиторий (то есть в локальный репозиторий на личном компьютере);
  4. Шаги 2 и 3 повторяются столько раз, сколько необходимо;
  5. При необходимости производится синхронизация изменений с другими репозиториями: забираются (pull) чужие наборы изменений и/или отдаются (push) собственные.

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

Консольная программа

Консольная программа реализована таким образом, что название любой команды можно сокращать до тех пор, пока её имя остаётся однозначным. Плюс некоторые команды имеют псевдонимы. Например, вместо hg commit можно написать hg commi, hg comm или hg com, но если написать hg c, то Mercurial откажется выполнять эту команду, сообщив, что «команда 'c' неоднозначна» и приведя список команд, которые попадают под это сокращение. Использовать hg co в качестве сокращения для hg commit нельзя, так как это псевдоним для команды hg update, однако доступно сокращение hg ci.

Логическая структура наборов изменений

При вызове команды hg commit выполняется фиксация изменений. При этом программа сохраняет в репозиторий набор изменений(changeset или ревизия). Физически происходят те же изменения, что и у вас, но сохраняются они в служебные файлы, а не в копии (подробнее в [bacher09.org/hgbook/ru/html/behind-the-scenes.html За кулисами]).

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

Узнать идентификаторы родительских наборов изменений, с которыми связаны зафиксированные наборы изменений можно с помощью команды hg log --debug. У каждого набора изменений будет два родителя (благодаря чему возможно ветвление внутри репозитория, см. hg -v help branch). Значение «-1:0000000000000000000000000000000000000000» означает отсутствие родителя. Например, у самого первого набора изменений в репозитории данное значение будет проставлено для обоих родителей, а у последующих данное значение будет проставлено для второго родителя (если для них в репозитории не использовалось ветвление), а для первого родителя будет проставлен идентификатор от предыдущего набора изменений.

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

Идентификация наборов изменений

Ревизии распознают по следующим признакам[4]:

  • Номеру ревизии;
  • Идентификатору набора изменений;
  • Меткам (Тег);
  • Имени ветки.

Номер ревизии

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

Идентификатор набора изменений

Идентификатор набора изменений представляет собой SHA-1 хеш, состоящий из цифр и букв «a, b, c, d, e, f», например, «e1be1898f3747386c41c8a5c5776e87373f6d3d3». Идентификатор набора изменений присваивается каждому набору изменений автоматически, вычисляется на основе содержимого этого набора изменений, поэтому соответствует одному и тому же набору изменений во всех репозиториях. Вероятность коллизии, когда для двух разных наборов изменений будет сгенерирован один и тот же SHA-1 хеш, крайне мала.

Mercurial не требует ввода полной строки идентификатора при использовании его в командах, ему достаточно лишь той его начальной части, которая однозначно идентифицирует требуемый набор изменений (в противном случае, Mercurial сообщит о неоднозначности). В выводе команды hg log идентификатор набора изменений можно увидеть после двоеточия (например, «4:e1be1898f374»). Без параметра --debug команда hg log выводит не полный, а сокращенный (из 12 символов) идентификатор набора изменений.

Метки

В дополнение к номеру ревизии и идентификатору набора изменений, Mercurial предоставляет возможность присваивать каждому набору изменений одно или более произвольных символических имен, называемых метками (или тегами). Присваиваются метки с помощью команды hg tag, а посмотреть все добавленные метки можно с помощью команды hg tags. Имя метки не может содержать некоторые символы (например ": "), о чём, в случае необходимости, Mercurial сообщит при выполнении команды hg tag.

Везде, где в командах можно указать идентификатор набора изменений, можно подставить имя метки.

Название ветки

Каждая ветка имеет собственное название. Оно указывается при создании ветки и больше никогда не изменяется.

Неочевидные моменты

К:Википедия:Статьи без источников (тип: не указан)
  • Если в качестве идентификатора ревизии какой-либо команде передано число, то Mercurial будет считать, что ему передан номер ревизии и будет выполнять проверку на неоднозначность с сокращенным идентификатором наборов изменений только в том случае, если отсутствует набор изменений с указанным номером ревизии. Например, если в репозитории существует один набор изменений с номером ревизии «6» и другой набор изменений с идентификатором «647362ac74d76124267215af1a3f94aa9707dfdf» (начинается с цифры «6»), то команда hg log -r 6 выдаст информацию о первом наборе изменений, не сообщив о неоднозначности. Поэтому, если глобальный идентификатор начинается с цифры, полезно всегда сокращать его лишь до тех пор, пока в нём не встретится буква. Данное поведение наблюдалось в версии 2.2.1 под Mac OS X 10.7.4.
  • Если создать метку с именем, например, «5», в то время как в репозитории существует (или появится в будущем) набор изменений с номеров ревизии «5», то Mercurial будет искать в первую очередь наборы изменений по номеру ревизии. Но если создать метку с именем, например, «e1be», в то время как в репозитории существует (или появится в будущем) набор изменений с идентификатором наборов изменений, начинающимся с «e1be», то Mercurial будет искать наборы изменений в первую очередь уже по меткам. Притом, в обоих случаях о неоднозначности сообщено не будет. По этой причине не рекомендуется создавать метки, состоящие только из цифр и/или букв «a, b, c, d, e, f». Данное поведение наблюдалось в версии 2.2.1 под Mac OS X 10.7.4.
  • Нельзя добавить в репозиторий пустую папку (для решения этой проблемы можно положить в папку любой файл, например, readme.txt). Такое поведение связано с тем, что Mercurial не отслеживает папки, а только файлы[5]. Поведение реализовано осознанно для упрощения системы и пока что изменений не планируется[5].

Дополнительные средства

В комплекте с Mercurial поставляются CGI-сценарии для предоставления веб-интерфейса к репозиториям[6].

Есть графическая оболочка TortoiseHg[7], работающая как под Windows (с интеграцией в Explorer), так и под Linux (в виде отдельного приложения[8] или с интеграцией в Gnome/Nautilus[9]). Существует разрабатываемый консольный клиент [code.google.com/p/hgtui/ hgtui] для Linux и Windows (с использованием cygwin).

Ряд сред разработки имеет возможности для работы с Mercurial, например Microsoft Visual Studio[10][11], IntelliJ IDEA[12][13][14], Eclipse[15], Qt Creator (начиная с версии 2.0)[16], PIDA[17], NetBeans[18]. Возможна работа с Mercurial из Emacs c помощью входящего в Emacs универсального пакета VC.

Экспериментальная поддержка Mercurial есть в системе Trac[19]. Проект Redmine[20] также поддерживает репозитории Mercurial.

При помощи утилиты Tailor[21] или расширения convert[22] поддерживается конвертирование[23] репозиториев других систем контроля версий, включая CVS, Subversion, Git, Perforce, Darcs, GNU Arch, Bazaar.

Проекты, использующие Mercurial

Значительное количество проектов по разработке свободного программного обеспечения использует Mercurial в качестве основной системы контроля версий[24]. В их числе:

Поддерживаются Mercurial-зеркала основных репозиториев других проектов[29], например, GCC, GNU Emacs и Linux.

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

Примечания

  1. [www.opennet.ru/opennews/art.shtml?num=34476 Релиз распределённой системы управления версиями Mercurial 2.3]. Проверено 11 марта 2013. [www.webcitation.org/6F9Q4FKHV Архивировано из первоисточника 16 марта 2013].
  2. [code.google.com/p/support/wiki/DVCSAnalysis Сравнение Git и Mercurial в FAQ сайта Google Code] (англ.)
  3. [stackoverflow.com/questions/1235597/mercurial-automatic-push-on-every-commit/1235614#1235614 mercurial automatic push on every commit] (англ.)
  4. [devopswiki.net/index.php/Mercurial#Идентификация_наборов_изменений Идентификация наборов изменений]. Проверено 12 марта 2013. [www.webcitation.org/6F9Q6QBF3 Архивировано из первоисточника 16 марта 2013].
  5. 1 2 [mercurial.selenic.com/wiki/FAQ#FAQ.2FCommonProblems.I_tried_to_check_in_an_empty_directory_and_it_failed.21 FAQ — Mercurial]
  6. (недоступная ссылка с 04-06-13 (4067 дней) — Настройка сервера для работы с Mercurial история)  (рус.)
  7. [www.selenic.com/mercurial/wiki/index.cgi/TortoiseHg TortoiseHg — Mercurial]
  8. [tortoisehg.wiki.sourceforge.net/hgtk SourceForge.net: TortoiseHg — Develop]
  9. [tortoisehg.wiki.sourceforge.net/Nautilus SourceForge.net: TortoiseHg — Develop]
  10. [sharesource.org/project/visualhg/ VisualHG — плагин-провайдер для Microsoft Visual Studio 2008/2010]
  11. [bitbucket.org/zzsergant/hgsccpackage/ HgSccPackage — Mercurial-плагин для Microsoft Visual Studio 2008/2010]
  12. [plugins.intellij.net/plugin/?id=2038 Mercurial Integration for IDEA]
  13. [plugins.intellij.net/plugin/?id=3370 hg4idea]
  14. [plugins.intellij.net/plugin/?idea&id=4624 JetBrains IntelliJ IDEA Plugin Repository]
  15. [www.vectrace.com/mercurialeclipse/ Mercurial Eclipse]
  16. [doc.qt.nokia.com/qtcreator-2.3/creator-version-control.html Qt Creator: Using version control systems]
  17. [www.daa.com.au/pipermail/pygtk/2005-August/010752.html Появление поддержки Mercurial в PIDA]
  18. [wiki.netbeans.org/wiki/view/MercurialVersionControl Mercurial-плагин для NetBeans]
  19. [trac.edgewall.org/wiki/TracMercurial Mercurial Plugin for Trac]
  20. [www.redmine.org/wiki/redmine/RedmineRepositories Repositories in Redmine]
  21. [progetti.arstecnica.it/tailor Tailor]
  22. [www.selenic.com/mercurial/wiki/index.cgi/ConvertExtension ConvertExtension] в Mercurial Wiki
  23. [www.selenic.com/mercurial/wiki/index.cgi/RepositoryConversion RepositoryConversion] в Mercurial Wiki
  24. [www.selenic.com/mercurial/wiki/index.cgi/ProjectsUsingMercurial Some projects that use Mercurial] (англ.)
  25. [blogs.sun.com/GullFOSS/entry/openoffice_org_development_switches_to OpenOffice.org development switches to Mercurial — GullFOSS]
  26. [groups.google.com/group/vim_use/msg/e70a01d50ede5be5?pli=1 Planning Vim 7.3 — vim_use | Google Groups]
  27. [adiumx.com/blog/2009/04/switching-to-mercurial/ Adium — Switching to Mercurial]
  28. [ru.twitch.tv/seargedp/b/328620641 seargedp - Updating MCP to 1.3.2]
  29. [www.selenic.com/mercurial/wiki/index.cgi/ProjectsWithSynchronizedMercurialRepositories Projects with synchronized Mercurial repositories] (англ.)

Ссылки

  • [www.mercurial-scm.org/ Домашняя страница Mercurial] (англ.)
  • [mkharitonov.net/hg/help/ru Документация по Mercurial] (рус.)
  • [bacher09.org/hgbook/ru/html/ Книга «Mercurial: Полное руководство»] (рус.) ([bacher09.org/2012/02/hgbook-in-russian/ другие форматы])
  • [mercurial.ru Сборник статей о Mercurial] (рус.)

Литература

  • Bryan O'Sullivan. Mercurial: The Definitive Guide. — O'Reilly Media, Inc., 2009. — 288 с. — ISBN 9780596800673.

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

– Так ничего?
– Ничего, – сказала княжна Марья, лучистыми глазами твердо глядя на невестку. Она решилась не говорить ей и уговорила отца скрыть получение страшного известия от невестки до ее разрешения, которое должно было быть на днях. Княжна Марья и старый князь, каждый по своему, носили и скрывали свое горе. Старый князь не хотел надеяться: он решил, что князь Андрей убит, и не смотря на то, что он послал чиновника в Австрию розыскивать след сына, он заказал ему в Москве памятник, который намерен был поставить в своем саду, и всем говорил, что сын его убит. Он старался не изменяя вести прежний образ жизни, но силы изменяли ему: он меньше ходил, меньше ел, меньше спал, и с каждым днем делался слабее. Княжна Марья надеялась. Она молилась за брата, как за живого и каждую минуту ждала известия о его возвращении.


– Ma bonne amie, [Мой добрый друг,] – сказала маленькая княгиня утром 19 го марта после завтрака, и губка ее с усиками поднялась по старой привычке; но как и во всех не только улыбках, но звуках речей, даже походках в этом доме со дня получения страшного известия была печаль, то и теперь улыбка маленькой княгини, поддавшейся общему настроению, хотя и не знавшей его причины, – была такая, что она еще более напоминала об общей печали.
– Ma bonne amie, je crains que le fruschtique (comme dit Фока – повар) de ce matin ne m'aie pas fait du mal. [Дружочек, боюсь, чтоб от нынешнего фриштика (как называет его повар Фока) мне не было дурно.]
– А что с тобой, моя душа? Ты бледна. Ах, ты очень бледна, – испуганно сказала княжна Марья, своими тяжелыми, мягкими шагами подбегая к невестке.
– Ваше сиятельство, не послать ли за Марьей Богдановной? – сказала одна из бывших тут горничных. (Марья Богдановна была акушерка из уездного города, жившая в Лысых Горах уже другую неделю.)
– И в самом деле, – подхватила княжна Марья, – может быть, точно. Я пойду. Courage, mon ange! [Не бойся, мой ангел.] Она поцеловала Лизу и хотела выйти из комнаты.
– Ах, нет, нет! – И кроме бледности, на лице маленькой княгини выразился детский страх неотвратимого физического страдания.
– Non, c'est l'estomac… dites que c'est l'estomac, dites, Marie, dites…, [Нет это желудок… скажи, Маша, что это желудок…] – и княгиня заплакала детски страдальчески, капризно и даже несколько притворно, ломая свои маленькие ручки. Княжна выбежала из комнаты за Марьей Богдановной.
– Mon Dieu! Mon Dieu! [Боже мой! Боже мой!] Oh! – слышала она сзади себя.
Потирая полные, небольшие, белые руки, ей навстречу, с значительно спокойным лицом, уже шла акушерка.
– Марья Богдановна! Кажется началось, – сказала княжна Марья, испуганно раскрытыми глазами глядя на бабушку.
– Ну и слава Богу, княжна, – не прибавляя шага, сказала Марья Богдановна. – Вам девицам про это знать не следует.
– Но как же из Москвы доктор еще не приехал? – сказала княжна. (По желанию Лизы и князя Андрея к сроку было послано в Москву за акушером, и его ждали каждую минуту.)
– Ничего, княжна, не беспокойтесь, – сказала Марья Богдановна, – и без доктора всё хорошо будет.
Через пять минут княжна из своей комнаты услыхала, что несут что то тяжелое. Она выглянула – официанты несли для чего то в спальню кожаный диван, стоявший в кабинете князя Андрея. На лицах несших людей было что то торжественное и тихое.
Княжна Марья сидела одна в своей комнате, прислушиваясь к звукам дома, изредка отворяя дверь, когда проходили мимо, и приглядываясь к тому, что происходило в коридоре. Несколько женщин тихими шагами проходили туда и оттуда, оглядывались на княжну и отворачивались от нее. Она не смела спрашивать, затворяла дверь, возвращалась к себе, и то садилась в свое кресло, то бралась за молитвенник, то становилась на колена пред киотом. К несчастию и удивлению своему, она чувствовала, что молитва не утишала ее волнения. Вдруг дверь ее комнаты тихо отворилась и на пороге ее показалась повязанная платком ее старая няня Прасковья Савишна, почти никогда, вследствие запрещения князя,не входившая к ней в комнату.
– С тобой, Машенька, пришла посидеть, – сказала няня, – да вот княжовы свечи венчальные перед угодником зажечь принесла, мой ангел, – сказала она вздохнув.
– Ах как я рада, няня.
– Бог милостив, голубка. – Няня зажгла перед киотом обвитые золотом свечи и с чулком села у двери. Княжна Марья взяла книгу и стала читать. Только когда слышались шаги или голоса, княжна испуганно, вопросительно, а няня успокоительно смотрели друг на друга. Во всех концах дома было разлито и владело всеми то же чувство, которое испытывала княжна Марья, сидя в своей комнате. По поверью, что чем меньше людей знает о страданиях родильницы, тем меньше она страдает, все старались притвориться незнающими; никто не говорил об этом, но во всех людях, кроме обычной степенности и почтительности хороших манер, царствовавших в доме князя, видна была одна какая то общая забота, смягченность сердца и сознание чего то великого, непостижимого, совершающегося в эту минуту.
В большой девичьей не слышно было смеха. В официантской все люди сидели и молчали, на готове чего то. На дворне жгли лучины и свечи и не спали. Старый князь, ступая на пятку, ходил по кабинету и послал Тихона к Марье Богдановне спросить: что? – Только скажи: князь приказал спросить что? и приди скажи, что она скажет.
– Доложи князю, что роды начались, – сказала Марья Богдановна, значительно посмотрев на посланного. Тихон пошел и доложил князю.
– Хорошо, – сказал князь, затворяя за собою дверь, и Тихон не слыхал более ни малейшего звука в кабинете. Немного погодя, Тихон вошел в кабинет, как будто для того, чтобы поправить свечи. Увидав, что князь лежал на диване, Тихон посмотрел на князя, на его расстроенное лицо, покачал головой, молча приблизился к нему и, поцеловав его в плечо, вышел, не поправив свечей и не сказав, зачем он приходил. Таинство торжественнейшее в мире продолжало совершаться. Прошел вечер, наступила ночь. И чувство ожидания и смягчения сердечного перед непостижимым не падало, а возвышалось. Никто не спал.

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


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

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

Через три дня отпевали маленькую княгиню, и, прощаясь с нею, князь Андрей взошел на ступени гроба. И в гробу было то же лицо, хотя и с закрытыми глазами. «Ах, что вы со мной сделали?» всё говорило оно, и князь Андрей почувствовал, что в душе его оторвалось что то, что он виноват в вине, которую ему не поправить и не забыть. Он не мог плакать. Старик тоже вошел и поцеловал ее восковую ручку, спокойно и высоко лежащую на другой, и ему ее лицо сказало: «Ах, что и за что вы это со мной сделали?» И старик сердито отвернулся, увидав это лицо.