Учебник - Создание первого изменения

(Это страница 4 из 9 серии учебников. Предыдущая часть - RussianTutorialHistory, следующая часть -RussianTutorialShareChange)

Начав с RussianTutorialHistory, теперь мы внутри репозитория my-hello, клонированного на странице RussianTutorialClone.

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

Наша цель проста - заставить программу "hello, world" ("Привет, мир") выводить другую строчку. Для начала мы создаем новый репозитарий my-hello-new-output клонированием 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).

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

$ cd my-hello-new-output
$ vi hello.c

Первоначальное содержимое hello.c выглядело так:

/*
 * 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 <stdio.h>

int main(int argc, char **argv)
{
        printf("hello, world!\n");
        return 0;
}

Отредактируем функцию main. Теперь она выводит еще одну строку:

(...)

int main(int argc, char **argv)
{
        printf("hello, world!\n");
        printf("sure am glad I'm using Mercurial!\n");
        return 0;
}

Сделав это, выходим из редактора. Всё готово - можно создавать 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" (см. hgrc(5)). При необходимости имя пользователя можно указать в командной строке опцией -u (см. hg help ci или 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 совпадает с содержимым рабочего каталога.

Команда 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, и changeset у Вас, естественно, будут другими.

Как мы говорили в RussianTutorialClone, новый changeset присутствует только в этом репозитории. Это важный момент для понимания работы Mercurial.

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


CategoryTutorial CategoryRussian

RussianTutorialFirstChange (last edited 2012-08-13 20:19:28 by 94-153-226-116-kv)