== Учебник - Создание первого изменения == ''(Это страница 4 из 9 серии [[Tutorial|учебников]]. Предыдущая часть - RussianTutorialHistory, следующая часть -RussianTutorialShareChange)'' Начав с RussianTutorialHistory, теперь мы внутри репозитория `my-hello`, клонированного на странице RussianTutorialClone. При работе с Mercurial рекомендуется изолировать связанные изменения в раздельном [[Repository|репозитории]] (смотри [[WorkingPractices|Лучшие практики]]). Это предотвращает смешивание независимого кода и упрощает тестирование персональных частей работы отдельно друг от друга. Давайте начнём, следуя этой рекомендации. Наша цель проста - заставить программу "hello, world" ("Привет, мир") выводить другую строчку. Для начала мы создаем новый репозитарий `my-hello-new-output` [[Clone|клонированием]] `my-hello` для нашего небольшого проекта (используем Mercurial 1.0): {{{ $ hg clone my-hello my-hello-new-output updating working directory 2 files updated, 0 files merged, 0 files removed, 0 files unresolved }}} Заметьте, что мы дали нашему новому репозитарию имя, описывающее его назначение. Сделать клон репозитария в Mercurial - это "дешевая" операция. Мы быстро накопим много слегка отличающихся репозитариев. Если мы не будем давать репозитариям описательных имён, то вскоре потеряем возможность отличить один от другого (see RepositoryNaming). Пора внести изменения в новый репозиторий. Перейдём в [[WorkingDirectory|рабочий каталог]] репозитория и отредактируем исходник нашим любимым редактором: {{{ $ cd my-hello-new-output $ vi hello.c }}} Первоначальное содержимое `hello.c` выглядело так: {{{#!cplusplus numbers=off /* * hello.c * * Placed in the public domain by Bryan O'Sullivan * * This program is not covered by patents in the United States or other * countries. */ #include int main(int argc, char **argv) { printf("hello, world!\n"); return 0; } }}} Отредактируем функцию {{{main}}}. Теперь она выводит еще одну строку: {{{#!cplusplus numbers=off (...) int main(int argc, char **argv) { printf("hello, world!\n"); printf("sure am glad I'm using Mercurial!\n"); return 0; } }}} Сделав это, выходим из редактора. Всё готово - можно создавать [[ChangeSet|changeset]]. Но что, если мы отвлеклись и забыли, какие изменения мы собирались внести в changeset? В таком случае мы воспользуемся командой `status`. {{{ $ hg status M hello.c }}} Вывод краток, но префикс `M` говорит нам, что файл `hello.c` был модифицирован, и наши исправления готовы войти в changeset. Вместо скучного `hg status` мы можем вводить забавный `hg st` - Mercurial позволяет сокращать команды, пока введённые символы однозначно определяют команду. {{{ $ hg st M hello.c }}} Мы также можем просмотреть реальные изменения в файлах, используя команду `diff`: {{{ $ hg diff diff -r 82e55d328c8c hello.c --- a/hello.c Fri Aug 26 01:21:28 2005 -0700 +++ b/hello.c Mon May 05 00:27:56 2008 +0200 @@ -12,5 +12,6 @@ int main(int argc, char **argv) { printf("hello, world!\n"); + printf("sure am glad I'm using Mercurial!\n"); return 0; } }}} Если мы хотим отменить наши изменения и начать заново, мы можем использовать команду `revert` для восстановления `hello.c` в немодифицированное состояние (или использовать опцию `--all` чтобы откатить все файлы). Только убедитесь, что точно знаете, что при этом произойдёт (см. [[Revert]]). {{{ $ hg revert hello.c }}} `revert` переименует модифицированный файл `hello.c` в `hello.c.orig` и восстановит `hello.c` в немодифицированное состояние. `status` now lists `hello.c.orig` as not tracked (prefix "?"). {{{ $ hg st ? hello.c.orig }}} Если мы снова передумали и хотим использовать наши отменённые изменения, просто удаляем немодифицированный `hello.c` и переименовываем модифицированный `hello.c.orig` в `hello.c` {{{ $ rm hello.c $ mv hello.c.orig hello.c $ hg st M hello.c }}} Процесс создания changeset'а называется [[Commit]] и выполняется командой `commit`. У команды `commit` есть замечательное сокращение: `ci` ("check in"), так что мы можем пользоваться ею так: {{{ $ hg ci }}} При этом запустится редактор, отображая несколько загадочных строк текста. ''Note:'' Редактор по умолчанию можно изменить, задав значение переменной окружения `EDITOR` или [[HGEDITOR]]. {{{ HG: Enter commit message. Lines beginning with 'HG:' are removed. HG: -- HG: user: mpm@selenic.com HG: branch 'default' HG: changed hello.c }}} Первая строка пуста, а дальше следуют строки, идентифицирующие пользователя, имя ветки (branch) и файлы, входящие в changeset. Ветка по умолчанию называется "default" (см. NamedBranches). Значение для "user" извлекается из конфигурационного файла {{{~/.hgrc}}} - ключ "username" раздела "ui" (см. [[http://www.selenic.com/mercurial/hgrc.5.html#ui|hgrc(5)]]). При необходимости имя пользователя можно указать в командной строке опцией `-u` (см. {{{hg help ci}}} или [[http://www.selenic.com/mercurial/hg.1.html#commit|hg.1.html#commit]]). Что бы зафиксировать(:Commit) changeset, мы должны его описать (см. ChangeSetComments). Введём что-нибудь такое: {{{ Express great joy at existence of Mercurial HG: Enter commit message. Lines beginning with 'HG:' are removed. HG: -- HG: user: mpm@selenic.com HG: branch 'default' HG: changed hello.c }}} Далее сохраняем текст, выходим из редактора и, если всё хорошо, команда `commit` завершится и ничего не напечатает. Если вы выйдете из редактора, не сохранив или не введя текст, `commit` прервётся, так что в этот момент Вы ещё можете передумать. Что же нам сейчас ответит команда {{{status}}}? {{{ $ hg st }}} Ничего! Наши изменения были зафиксированы в changeset'е, поэтому нет измененных файлов, нуждающихся в фиксации. Наш [[Tip|tip]] совпадает с содержимым рабочего каталога. Команда [[Parent|parents]] показывает, что наш рабочий каталог репозитория синхронизирован (see [[Update]]) с последним зафиксированным changeset'ом. Сейчас имеется только один родитель, что всегда происходит после выполнения команды {{{commit}}}. Мы увидим двух родителей в разделе TutorialMerge. {{{ $ hg par changeset: 2:86794f718fb1 tag: tip user: mpm@selenic.com date: Mon May 05 01:20:46 2008 +0200 summary: Express great joy at existence of Mercurial }}} Мы зафиксировали новый changeset. Мы можем просмотреть изменения истории нашей работы: {{{ $ hg log changeset: 2:86794f718fb1 tag: tip user: mpm@selenic.com date: Mon May 05 01:20:46 2008 +0200 summary: Express great joy at existence of Mercurial (...) }}} ''Примечание:'' Поля user, date, и [[ChangeSetID|changeset]] у Вас, естественно, будут другими. Как мы говорили в RussianTutorialClone, новый changeset присутствует только в этом репозитории. Это важный момент для понимания работы Mercurial. Как сделать изменения доступными другим пользователям рассказано в RussianTutorialShareChange. ---- CategoryTutorial CategoryRussian