Differences between revisions 3 and 7 (spanning 4 versions)
Revision 3 as of 2009-04-25 15:30:26
Size: 8067
Editor: SergeySign
Comment:
Revision 7 as of 2011-08-23 03:16:26
Size: 10061
Editor: 31
Comment:
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
''(Это страница 4 из 9 серии [:Tutorial:учебников]. Предыдущая часть - [:RussianTutorialHistory], следующая часть [:RussianTutorialShareChange])'' ''(Это страница 4 из 9 серии [[Tutorial|учебников]]. Предыдущая часть - [[RussianTutorialHistory]], следующая часть [[RussianTutorialShareChange]])''
Line 7: Line 7:
При работе с Mercurial рекомендуется изолировать связанные изменения в раздельном [:Repository:репозитории] (смотри [:WorkingPractices:Лучшие практики]). Это предотвращает смешивание независимого кода и упрощает тестирование персональных частей работы отдельно друг от друга. Давайте начнём следуя этой рекомендации.

Наша цель проста - заставить программу "hello, world" ("Привет, мир") выводить другую строчку. Для начала мы создаем новый репозитарий `my-hello-new-output` [:Clone:клонированием] `my-hello` для нашего небольшого проекта (используем Mercurial 1.0):
При работе с Mercurial рекомендуется изолировать связанные изменения в раздельном [[Repository|репозитории]] (смотри [[WorkingPractices|Лучшие практики]]). Это предотвращает смешивание независимого кода и упрощает тестирование персональных частей работы отдельно друг от друга. Давайте начнём следуя этой рекомендации.

Наша цель проста - заставить программу "hello, world" ("Привет, мир") выводить другую строчку. Для начала мы создаем новый репозитарий `my-hello-new-output` [[Clone|клонированием]] `my-hello` для нашего небольшого проекта (используем Mercurial 1.0):
Line 17: Line 17:
Notice that we have given our new repository a descriptive name, basically identifying the purpose of the repository. Since making a clone of a repository in Mercurial is cheap, we will quickly accumulate many slightly different repositories. If we do not give these repositories descriptive names, we will rapidly lose the ability to tell them apart (see RepositoryNaming).

Now it's time to make a change in the new repository. Let's go into the repository's [:WorkingDirectory:working directory], which is simply our name for the directory where all the files are, and modify the source code with our favorite editor:
Заметьте, что мы дали нашему новому репозитарию имя описывающее его назначение. Сделать клон репозитария в Mercurial это "дешевая" операция. Мы быстро накопим много слегка оличающихся репозитариев. Если мы не будем давать репозитариям описательных имён, то вскоре потеряем возможность оличить один от друго (see RepositoryNaming).

Пора внести изменения в новый репозиторий. Перейдём в [[WorkingDirectory|рабочий каталог]] репозитория и отредактируем исходник нашим любимым редактором:
Line 60: Line 60:
Once we're done, we quit out of our favorite editor, and we're done. That's it. The edit
is now ready for us to create a [:ChangeSet:changeset].

But what if we're interrupted, and we've forgotten what changes are going to make it into
the changeset once we create it? For this, we use the `status` command.
Сделав это, выходим из редактора. Вот и готово. Можно содавать [[ChangeSet|changeset]].

Но что если мы отвлеклись и забыли какие изменения мы собирались внести в changeset? В таком случае мы воспользуемся командой `status`.
Line 71: Line 69:
The output is terse, but prefix `M` is simply telling us that `hello.c` has been modified,
so our change is ready to go into a changeset.

Instead of the long-winded `hg status` we can alternatively just type `hg st`, as Mercurial
allows us to abbreviate commands as long as the entered character sequence is not ambiguous.
Вывод краток, но префикс `M` говорит нам что `hello.c` был модифицирован,
и наши исправления готовы войти в changeset.

Вместо скучного `hg status` мы можем вводить `hg st`, Mercurial
позволяет сокращать команды пока введённые символы не двусмысленны.
Line 82: Line 80:
We may also examine the actual changes we have made to the files using the `diff` command: Мы также можем просмотреть реальные изменения в файлах используя команду `diff`:
Line 98: Line 96:
<!> In case we wish to discard our changes and start over, we may use the `revert` command to
restore `hello.c` to its unmodified state (or use the `--all` option to revert all files). Just make sure you
know this is what you really want (see [:Revert]).
<!> Если мы хотим отменить наши изменения и начать заново, мы можем использовать команду `revert` для
восстановления `hello.c` в немодифицированное состояние (или использовать опцию `--all` что бы откатить все файлы). Только убедитесь что знаете чего хотите (см. [[Revert]]).
Line 106: Line 103:
`revert` renames the modified file `hello.c` to `hello.c.orig` and restores `hello.c` to its unmodified
state.
`revert` переименует модифицированный файл `hello.c` в `hello.c.orig` и восстановит `hello.c` в немодифицированное состояние.
Line 116: Line 112:
If we change our mind again and want to reuse the modification we have made, we just remove the
unmodified state of `hello.c` and rename the modified `hello.c.orig` to `hello.c`
Если мы снова передумали и хотим использовать наши отменённые изменения, мы просто удаляем
немодифицированный `hello.c` и переименовываем модифицированный `hello.c.orig` в `hello.c`
Line 126: Line 122:
The act of creating a changeset is called [:Commit:committing] it.
We perform a commit using the `commit` command.
The `commit` command has a nice short alias: `ci` ("check in"),
so we can use that:
Создание changeset'а называется [[Commit]] и выполняется командой `commit`.
У команды `commit` есть замечательное сокращение: `ci` ("check in"),
так что мы можем пользоваться ею так:
Line 135: Line 130:
This drops us into an editor, and presents us with a few cryptic lines of text.

''Note:'' The default editor is `vi`. This can be changed using the `EDITOR` or [:HGEDITOR] environment variables.
При этом запустится редактор, отображая несколько загадочных строк текста.

''Note:'' Возможно редактор по умолчанию это `vi`. Это можно изменить задав значение переменной окружения `EDITOR` или [[HGEDITOR]].
Line 148: Line 143:
The first line is empty and the lines that follow identify the user, branch name and the files that will go into this changeset.

The default branch name is "default" (see NamedBranches). The default value for "user" is taken from the {{{~/.hgrc}}} configuration file from value "username" of section "ui" (see [http://www.selenic.com/mercurial/hgrc.5.html#ui hgrc(5)]). Alternatively, it can also be specified on the command line with option -u (see `hg help ci` or [http://www.selenic.com/mercurial/hg.1.html#commit hg.1.html#commit]).

To commit the changeset, we must describe the reason for it (see [:ChangeSetComments]). Let's type something like this:
Первая строка пуста и дальше следуют строчки идентифицирующие пользователя, имя ветки (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, мы должны его описать (see [[ChangeSetComments]]). Введём что-нибудь такое:
Line 163: Line 158:
Next, we save the text and quit the editor, and, if all goes well, the `commit` command will exit and prints no output.

<!> If you quit the editor without saving the text or enter no text, `commit` will abort the operation, so you may change your mind before committing.

Let's see what the {{{status}}} command will tell us now?

{{{
$ hg st
}}}

Nothing! Our change has been committed to a changeset, so there's no modified file in need of a commit. Our [:Tip:tip] now matches our working directory contents.

The [:Parent:parents] command shows us that our repository's working directory is now synced (see [:Update]) to
the newly committed changeset (here we have only one parent revision, which is always the case after a
Далее мы сохраняем текст, выходим из редактора и, если всё хорошо, команда `commit` завершится и ничего не напечатает.

<!> Если вы вайдете из редактора не сохранив или не введя текст, `commit` прервётся, так что в этот момент Вы ещё можете передумать.

Что же нам сейчас ответит команда {{{status}}}?

{{{
$ hg st
}}}

Ничего! Наши изменения были зафиксированы в changeset'е, поэтому нет измененных файлов, нуждающихся в фиксации. Наш [[Tip|tip]] совпадает с содержимым рабочего каталога.

Команда [[Parent|parents]] что наш рабочий каталог репозитория синхронизирован (see [[Update]]) с
недавно зафиксированным changeset'ом (here we have only one parent revision, which is always the case after a
Line 188: Line 183:
There it is! We've committed a new changeset.

We can now examine the change history for our new work:
Мы зафиксировали новый changeset.

Мы можем просмотреть изменения истории нашей работы:
Line 202: Line 197:
''Note:'' The user, date, and [:ChangeSetID:changeset ID] will of course vary.

As we discussed in [:RussianTutorialClone], the new changeset only exists in this repository. This is a critical part of the way Mercurial works.
''Note:'' Поля user, date, и [[ChangeSetID|changeset]] у вас естественно будут другими.

Как мы говорили в [[RussianTutorialClone]], новый changeset присутствует только в этом репозитории. Это важный момент в методах работы с Mercurial.
Line 210: Line 205:
CategoryRussian CategoryRussian CategoryTutorial

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

(Это страница 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: Возможно редактор по умолчанию это vi. Это можно изменить задав значение переменной окружения 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, мы должны его описать (see 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'ом (here we have only one parent revision, which is always the case after a commit. We will see two parents in 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

(...)

Note: Поля user, date, и changeset у вас естественно будут другими.

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

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


CategoryTutorial CategoryRussian CategoryTutorial

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