Size: 7779
Comment:
|
← Revision 10 as of 2012-08-13 20:19:28 ⇥
Size: 10250
Comment: исправил свою ошибку в форматировании
|
Deletions are marked like this. | Additions are marked like this. |
Line 2: | Line 2: |
''(Это страница 4 из 9 серии [[Tutorial|учебников]]. Предыдущая часть - RussianTutorialHistory, следующая часть -RussianTutorialShareChange)'' | |
Line 3: | Line 4: |
''(Это страница 4 из 9 серии [:Tutorial:учебников]. Предыдущая часть - [:RussianTutorialHistory], следующая часть [:RussianTutorialShareChange])'' | Начав с RussianTutorialHistory, теперь мы внутри репозитория `my-hello`, клонированного на странице RussianTutorialClone. |
Line 5: | Line 6: |
Carrying forward from RussianTutorialHistory, we are inside our `my-hello` repository that we cloned in RussianTutorialClone. | При работе с Mercurial рекомендуется изолировать связанные изменения в раздельном [[Repository|репозитории]] (смотри [[WorkingPractices|Лучшие практики]]). Это предотвращает смешивание независимого кода и упрощает тестирование персональных частей работы отдельно друг от друга. Давайте начнём, следуя этой рекомендации. |
Line 7: | Line 8: |
A good Mercurial development practice is to isolate related changes in a separate [:Repository:repository] (see also [:WorkingPractices]). This prevents unrelated code from getting mixed up, and makes it easier to test individual chunks of work one by one. Let's start out by following that model. Наша цель проста - заставить программу "hello, world" ("Привет, мир") выводить другую строчку. Для начала мы создаем новый репозитарий `my-hello-new-output` [:Clone:клонированием] `my-hello` для нашего небольшого проекта (используем Mercurial 1.0): |
Наша цель проста - заставить программу "hello, world" ("Привет, мир") выводить другую строчку. Для начала мы создаем новый репозитарий `my-hello-new-output` [[Clone|клонированием]] `my-hello` для нашего небольшого проекта (используем Mercurial 1.0): |
Line 16: | Line 15: |
Заметьте, что мы дали нашему новому репозитарию имя, описывающее его назначение. Сделать клон репозитария в Mercurial - это "дешевая" операция. Мы быстро накопим много слегка отличающихся репозитариев. Если мы не будем давать репозитариям описательных имён, то вскоре потеряем возможность отличить один от другого (see RepositoryNaming). | |
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: |
Пора внести изменения в новый репозиторий. Перейдём в [[WorkingDirectory|рабочий каталог]] репозитория и отредактируем исходник нашим любимым редактором: |
Line 25: | Line 23: |
Line 46: | Line 43: |
Line 59: | Line 55: |
Сделав это, выходим из редактора. Всё готово - можно создавать [[ChangeSet|changeset]]. | |
Line 60: | Line 57: |
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? В таком случае мы воспользуемся командой `status`. |
Line 70: | Line 63: |
Вывод краток, но префикс `M` говорит нам, что файл `hello.c` был модифицирован, и наши исправления готовы войти в changeset. | |
Line 71: | Line 65: |
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. |
Вместо скучного `hg status` мы можем вводить забавный `hg st` - Mercurial позволяет сокращать команды, пока введённые символы однозначно определяют команду. |
Line 81: | Line 71: |
We may also examine the actual changes we have made to the files using the `diff` command: |
Мы также можем просмотреть реальные изменения в файлах, используя команду `diff`: |
Line 97: | Line 86: |
<!> 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 105: | Line 91: |
`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 115: | Line 99: |
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 125: | Line 107: |
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 134: | Line 112: |
При этом запустится редактор, отображая несколько загадочных строк текста. | |
Line 135: | Line 114: |
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:'' Редактор по умолчанию можно изменить, задав значение переменной окружения `EDITOR` или [[HGEDITOR]]. |
Line 140: | Line 117: |
Line 147: | Line 123: |
Первая строка пуста, а дальше следуют строки, идентифицирующие пользователя, имя ветки (branch) и файлы, входящие в changeset. | |
Line 148: | Line 125: |
The first line is empty and the lines that follow identify the user, branch name and the files that will go into this 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]]). |
Line 150: | Line 127: |
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: |
Что бы зафиксировать(:Commit) changeset, мы должны его описать (см. ChangeSetComments). Введём что-нибудь такое: |
Line 162: | Line 137: |
Далее сохраняем текст, выходим из редактора и, если всё хорошо, команда `commit` завершится и ничего не напечатает. | |
Line 163: | Line 139: |
Next, we save the text and quit the editor, and, if all goes well, the `commit` command will exit and prints no output. | <!> Если вы выйдете из редактора, не сохранив или не введя текст, `commit` прервётся, так что в этот момент Вы ещё можете передумать. |
Line 165: | Line 141: |
<!> 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? |
Что же нам сейчас ответит команда {{{status}}}? |
Line 172: | Line 146: |
Ничего! Наши изменения были зафиксированы в changeset'е, поэтому нет измененных файлов, нуждающихся в фиксации. Наш [[Tip|tip]] совпадает с содержимым рабочего каталога. | |
Line 173: | Line 148: |
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. We will see two parents in TutorialMerge): |
Команда [[Parent|parents]] показывает, что наш рабочий каталог репозитория синхронизирован (see [[Update]]) с последним зафиксированным changeset'ом. Сейчас имеется только один родитель, что всегда происходит после выполнения команды {{{commit}}}. Мы увидим двух родителей в разделе TutorialMerge. |
Line 187: | Line 158: |
Мы зафиксировали новый changeset. | |
Line 188: | Line 160: |
There it is! We've committed a new changeset. | Мы можем просмотреть изменения истории нашей работы: |
Line 190: | Line 162: |
We can now examine the change history for our new work: | |
Line 201: | Line 172: |
''Примечание:'' Поля user, date, и [[ChangeSetID|changeset]] у Вас, естественно, будут другими. | |
Line 202: | Line 174: |
''Note:'' The user, date, and [:ChangeSetID:changeset ID] will of course vary. | Как мы говорили в RussianTutorialClone, новый changeset присутствует только в этом репозитории. Это важный момент для понимания работы Mercurial. |
Line 204: | Line 176: |
As we discussed in [:RussianTutorialClone], the new changeset only exists in this repository. This is a critical part of the way Mercurial works. Как сделать изменения доступными другим пользователям, рассказано в RussianTutorialShareChange. |
Как сделать изменения доступными другим пользователям рассказано в RussianTutorialShareChange. |
Line 209: | Line 179: |
CategoryTutorial CategoryRussian |
CategoryTutorial CategoryRussian |
Учебник - Создание первого изменения
(Это страница 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.