Очередной блог фрилансера

коротко и полезно о веб-разработке

Menu Close

Введение в Mercurial. Основы

MercurialСегодня, я наконец-то  публикую долгожданную статью про Меркуриал, точнее про его основы. Не кривитесь и не делайте вид что вам это не интересно и не нужно, потому что система контроля версий нужна абсолютно всем веб-разработчикам, если вы, конечно, относите себя к ним. У меня уже была статья, в которой вы можете узнать, что же такое контроль версий и для чего он нужен.

Ну а если вы уже знаете что такое Меркуриал, и немного умеете с ним работать, пришло время познакомиться с ним поближе, и начнем мы сегодня с освоения командной строки и базовых команд Меркуриала. Эта статья является неполным переводом 2 главы книги Bryan O’Sullivan «Mercurial: The Definitive Guide»

Установка

Самая лучшая версия Меркуриал для Windows это TortoiseHg, предоставляющий как командную строку, так и графический пользовательский интерфейс.

Начало

Прежде чем начать, хотелось бы кое-что уточнить. Все примеры, приведенные в статье, тестировались в коммандной строке Windows, пользователи Линукса, я думаю разберутся с аналогами команд. В примерах строки начинающиеся с символа $, указывают на команды, которые нужно вводить, в все остальные строки — это результат выполнения этих команд.

Начнем с команды hg version, которая используется для проверки корректности установленного Меркуриала. Эта команда, как нетрудно догадаться выдаст информацию об установленной версии.


$ hg version
Mercurial Distributed SCM (version 1.2)Copyright (C) 2005-2008 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR

Встроенная справка

В Меркуриале есть встроенная справочная система. Она неоценима в тех случаях, когда вы застряли на попытке вспомнить, как выполнить какую-либо команду. Если вы совсем отчаялись, запустите команду hg help, она выведет список команд, вместе с описанием каждой из них. Если вы хотите узнать справку о конкретной команде (как в примере, ниже), она выведет более детальную информацию.


$ hg help init
hg init [-e CMD] [--remotecmd CMD] [DEST]create a new repository in the given directory

Initialize a new repository in the given directory. If the given
directory does not exist, it is created.

If no directory is given, the current directory is used.

It is possible to specify an ssh:// URL as the destination.
See 'hg help urls' for more information.

options:

-e --ssh specify ssh command to use
--remotecmd specify hg command to run on the remote side

use "hg -v help init" to show global options

Для еще более подробного уровня детализации (которая обычно не нужна) выполните команду hg help –v. Опция –v – сокращение от --verbose, говорит Меркуриалу выдать больше информации, чем обычно.

Работа с репозиторием

В Меркуриале все происходит внутри репозитория. Репозиторий проекта содержит все файлы, которые «принадлежат» этому проекту, вместе с историей изменений файлов проекта.

В репозитории нет ничего магического, это просто директория в вашей файловой системе, которую Меркуриал рассматривает как специальную. Вы можете переименовать или удалить репозиторий в любое время, используя командную строку или файловый менеджер.

Создание локальной копии репозитория

Копирование репозитория немного специализировано. Вы вполне можете использовать обычное файловое копирование, для создания копии репозитория, но все-таки лучше использовать встроенную команду Меркуриала. Эта команда называется hg clone, потому что она создает идентичную копию существующего репозитория.


$ hg clone http://hg.serpentine.com/tutorial/hello
destination directory: hello
requesting all changes
adding changesets
adding manifests
adding file changes
added 5 changesets with 5 changes to 2 files
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolv

Первое преимущество использования hg clone в том, что, как мы видим из вышеуказанного примера, он позволяет нам клонировать репозитории по сети. Другое преимущество в том, что он запоминает, откуда репозиторий был клонирован, что вскоре нам очень пригодится, когда мы захотим скопировать, только новые изменения из другого репозитория.

Если наше клонирование прошло успешно, мы должны получить локальную папку с именем hello. Эта папка содержит некоторые файлы.


$ dir /b
.hg
Makefile
hello.c

Эти файлы содержат одинаковый контент и историю изменений, как на сервере, так и в репозитории, который мы клонировали.

Каждый репозиторий Меркуриал является законченным, независимым и самостоятельным. Он содержит собственную копию файлов проекта и истории изменений. Как мы уже упоминали, клонированный репозиторий запоминает расположение репозитория-источника, но Меркуриал не взаимодействует с этим репозиторием, или любым другим, какой вы ему укажете.

Что это значит для нас? Это значит, что мы свободно можем экспериментировать с нашим репозиторием, уверенные в том, что никто не сможет внести изменения в наш проект.

Что хранится в репозитории?

Если внимательно рассмотреть содержимое папки репозитория, можно заметить что он содержит папку с именем .hg. Именно в ней Меркуриал хранит все метаданные репозитория.


$ cd hello
$ dir /b.hg
Makefile
hello.c

Содержимое папки .hg и все внутренние папки, принадлежат Меркуриалу. Любые другие файлы и папки в репозитории, принадлежат вам.

Введем немного терминологии; .hg директория является «настоящим» репозиторием и все файлы и папки, которые сосуществуют  с ней, называются живущими в рабочей директории. Чтобы проще запомнить разницу, запомните, что репозиторий содержит историю вашего проекта, в то время как рабочая директория содержит снимок вашего проекта на определенном этапе истории.

Введение в историю

Первое, что мы могли бы сделать с новым, незнакомым репозиторием – узнать его историю. Команда hg log позволяет нам увидеть историю изменений репозитория.


$ hg log
changeset: 4:2278160e78d4
tag: tip
user: Bryan O Sullivan
date: Sat Aug 16 22:16:53 2008 +0200
summary: Trim comments.changeset: 3:0272e0d5a517
user: Bryan O Sullivan
date: Sat Aug 16 22:08:02 2008 +0200
summary: Get make to generate the final binary from a .o file.

changeset: 2:fef857204a0c
user: Bryan O Sullivan
date: Sat Aug 16 22:05:04 2008 +0200
summary: Introduce a typo into hello.c.

changeset: 1:82e55d328c8c
user: mpm@selenic.com
date: Fri Aug 26 01:21:28 2005 -0700
summary: Create a makefile

changeset: 0:0a04b987be5a
user: mpm@selenic.com
date: Fri Aug 26 01:20:50 2005 -0700
summary: Create a standard "hello, world" program

По умолчанию эта команда печатает небольшие абзацы для каждого изменения в проекте, которые было сохранено. В терминологии Меркуриала, мы называем каждое из этих сохраненных событий changeset (набор изменений), потому что каждое из них, содержит запись об изменении нескольких файлов.

Команда hg log выводит следующие поля для каждой записи.

  • changeset: Это поле имеет формат номера, затем двоеточие, затем шестнадцатеричная строка. Это идентификатор набора изменений. Шестнадцатеричная строка это уникальный идентификатор:  эта же шестнадцатеричная строка всегда принадлежит своему набору изменений, в каждой копии этого репозитория. Номер короче и легче напечатать в отличие от шестнадцатеричной строки, но он не является уникальным: одинаковый номер в двух различных клонах репозитория может идентифицировать разные наборы изменений.
  • user:  Идентифицирует пользователя, создавшего набор изменений. Это поле свободной формы, но зачастую оно содержит имя пользователя и email-адрес.
  • summary:  Первая строка текстового сообщения, который создатель набора изменений ввел для описания изменений.
  • Некоторые наборы изменений, такие как первый, представленный в вышеуказанном списке, имеют поле tag (тэг). Тэг – это другой способ идентификации набора изменений, дающий легко запоминающееся имя. (Тэг со значением tip особый случай – он всегда указывает на самые последние изменения в репозитории).

По умолчанию вывод, напечатанный командой hg log просто краткий обзор, он упускает множество деталей.

Рисунок 2.1 представляет графическое изображение истории изменений репозитория hello. Мы будем возвращаться к этому рисунку несколько раз в этой главе, и в следующих главах также.

schema1

Просмотр конкретной ревизии

Чтобы сократить вывод hg log до одной ревизии, используете параметр –r (или –rev). Вы можете использовать либо номер ревизии, либо шестнадцатеричный идентификатор, и вы можете выводить сколько угодно ревизий.


$ hg log -r 3
changeset: 3:0272e0d5a517
user: Bryan O Sullivan
date: Sat Aug 16 22:08:02 2008 +0200
summary: Get make to generate the final binary from a .o file.$ hg log -r 0272e0d5a517
changeset: 3:0272e0d5a517
user: Bryan O Sullivan
date: Sat Aug 16 22:08:02 2008 +0200
summary: Get make to generate the final binary from a .o file.

$ hg log -r 1 -r 4
changeset: 1:82e55d328c8c
user: mpm@selenic.com
date: Fri Aug 26 01:21:28 2005 -0700
summary: Create a makefile

changeset: 4:2278160e78d4
tag: tip
user: Bryan O Sullivan
date: Sat Aug 16 22:16:53 2008 +0200
summary: Trim comments.

Если вы хотите увидеть историю нескольких ревизий, без пролистывания каждой в отдельности, можете использовать индексный диапазон; он позволяет вам реализовать запрос вида «Я хочу получить все ревизии между abc и def».


$ hg log -r 2:4
changeset: 2:fef857204a0c
user: Bryan O Sullivan
date: Sat Aug 16 22:05:04 2008 +0200
summary: Introduce a typo into hello.c.changeset: 3:0272e0d5a517
user: Bryan O Sullivan
date: Sat Aug 16 22:08:02 2008 +0200
summary: Get make to generate the final binary from a .o file.

changeset: 4:2278160e78d4
tag: tip
user: Bryan O Sullivan
date: Sat Aug 16 22:16:53 2008 +0200
summary: Trim comments.

Внесение и просмотр изменений

Теперь, когда мы достаточно знаем об истории Меркуриала, давайте сделаем некоторые изменения и рассмотрим их.

Первое, что мы сделаем – это изолируем наш эксперимент, создав для него собственный репозиторий. Будем использовать команду hg clone, но нам не нужно клонировать удаленный репозиторий. Поскольку у нас есть его локальная копия, мы просто клонируем ее. Это значительно быстрее, чем клонирование по сети.


$ cd ..
$ hg clone hello my-hello
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd my-hello

В нашем новом репозитории my-hello, есть файл hello.c, содержащий программу “hello, world”.


$ type 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!\");
return 0;
}

Давайте отредактируем его, добавив вторую строчку вывода (для этого откройте файл 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!\");
printf("hello again!\n");
return 0;
}

Команад Меркуриала hg status расскажет нам, что знает Меркуриал о файлах в репозитории


$ hg status
M hello.c

Команда hg status печатает только строку, начинающуюся с “M” для hello.c.  Если вы не сообщите ему, hg status не напечатает вывод для файлов, которые не были изменены. «М» — показывает, что Меркуриал отметил, что мы изменили файл hello.c. Нам не нужно информировать Меркуриал, что мы собираемся изменить файл, до того как начать, или о сделанных изменениях после, он сам об этом позаботиться.

Очень полезно знать, что мы изменили файл hello.c, но еще лучше было бы знать, какие изменения мы сделали. В этой задаче нам поможет команда hg diff.


$ hg diff
diff -r 2278160e78d4 hello.c
--- a/hello.c Sat Aug 16 22:16:53 2008 +0200
+++ b/hello.c Tue May 05 06:55:53 2009 +0000
@@ -8,5 +8,6 @@
int main(int argc, char **argv)
{
printf("hello, world!\");
+ printf("hello again!\n");
return 0;
}

Запись изменений

Мы можем изменять файлы, делать и тестировать изменения, и использовать hg status и hg diff, для просмотра изменений, пока не будет удовлетворены результатом работы и перейдем к созданию точки остановки, в которой мы хотим сохранить нашу работу в новый набор изменений.

Команда hg commit позволяет нам создать новый набор изменений, обычно это называется «создание коммита».

Настойка имени пользователя

Когда вы запустите hg commit первый раз, команда не обязательно выполнится успешно. Меркуриал записывает ваше имя и адрес, для каждого изменения, которые вы записываете, так что в будущем всегда будет известно, кто делал эти изменения. Меркуриал пытается автоматически определить имя пользователя, записывающего изменения, пробуя каждый из представленных ниже методов:

  1. Если вы указали опцию –u и следующее за ней имя пользователя, запуская команду hg commit, это всегда самый высокий приоритет.
  2. Если вы установили переменную окружения HGUSER, это проверяется следующим по списку.
  3. Если вы создали файл в домашней папке, с именем .hgrc, со строкой username, это будет проверено следующим.
  4. Если вы установили переменную окружения EMAIL, это следующий пункт проверки.
  5. Меркуриал опрашивает вашу систему, чтобы найти имя локального пользователя и имя хоста, и строит имя пользователя из этих компонентов. Поэтому, в результате обычно получается не очень удобное имя пользователя, вы получите предупреждение, если это так.

Если не один из этих механизмов не сработал, Меркуриал выдаст сообщение об ошибке. В этом случае, он не позволит вам сделать коммит, пока вы не введете имя пользователя. Вы уже, наверное, поняли, что переменная окружения HGUSER и опция –u для команды hg commit – это способ изменить дефолтное имя пользователя. Для нормального использования, простейшим и наиболее удобным способом установки имени пользователя, является создание файла .hgrc, читайте далее, как это делается.

Создание конфигурационного файла Меркуриала

Для установки имени пользователя, воспользуетесь своим любимым редактором для создания файла .hgrc в своей домашней папке. Меркуриал будет использовать этот файл для поиска ваших персональных настроек. Первоначальное содержание вашего файла .hgrc должно выглядеть вот так:


# This is a Mercurial configuration file.
[ui]
username = Firstname Lastname

Строка “[ui]” начинает секцию конфигурационного файла. Эта секция продолжается до тех пор пока не начнется новая секция, или не кончится файл. Меркуриал игнорирует пустые строки и трактует любые текстовые строки, начинающиеся с «#» как комментарий.

Создание сообщения коммита

Когда мы создаем коммит, Меркуриал направляет нас в текстовый редактор, для ввода сообщения, которое будет описывать изменения, которые мы сделали в этом наборе изменений. Это сообщение называется сообщение коммита. Оно будет сообщать читателям о том какие изменения мы сделали и почему, и будет выводиться командой hg log, после того как мы закончим коммит.


$ hg commit

Текстовый редактор, в который нас отправляет команда hg commit, содержит одну или две пустых строки, и несколько других строк, начинающихся с «HG»:

Здесь можно писать сообщение коммитаHG: Enter commit message. Lines beginning with 'HG:' are removed.
HG: --
HG: user: Bryan O'Sullivan
HG: branch 'default'
HG: changed hello.c

Меркуриал игнорирует строки, которые начинаются с «HG», он использует их для того, чтобы сказать нам в каких файлах будут сделаны изменения.  Удаление или изменение этих строк ни к чему не приведет.

Отмена коммита

Если вы решили, что не хотите делать коммит в середине редактирования сообщения коммита, просто выйдите из текстового редактора без сохранения того, что редактировали. Никаких изменений в репозитории не произойдет.

Любуемся нашей работой

После того как мы закончим коммит, можно воспользоваться командой hg tip для просмотра набора изменений, который мы создали. Эта команда предоставляет вывод, так же как hg log, но отображается только последняя ревизия в репозитории.


$ hg tip -vp
changeset: 5:b6fed4f21233
tag: tip
user: Bryan O Sullivan
date: Tue May 05 06:55:53 2009 +0000
files: hello.c
description:
Added an extra line of outputdiff -r 2278160e78d4 -r b6fed4f21233 hello.c
--- a/hello.c Sat Aug 16 22:16:53 2008 +0200
+++ b/hello.c Tue May 05 06:55:53 2009 +0000
@@ -8,5 +8,6 @@
int main(int argc, char **argv)
{
printf("hello, world!\");
+ printf("hello again!\n");
return 0;
}

Кроме этого, команда hg tip принимает множество из опций команды hg log, так вышеуказанная опция –v (выводит детальную информацию), -p означает «печатать патч», то есть выводить контент, который был изменен.

Обмен изменениями

Мы упоминали ранее, что репозитории Меркуриала являются самостоятельными. Это значит что набор изменений, который мы создали, содержится только в нашем репозитории my-hello. Давайте рассмотрим несколько способов, которыми мы можем распространить эти изменения в другие репозитории.

Получение изменений из другого репозитория

Для начала давайте клонируем наш оригинальный репозиторий hello, не содержащий изменений, которые мы только что коммитили. Назовем наш временный репозиторий hello-pull.


$ cd ..
$ hg clone hello hello-pull
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolv

Используйте команду hg pull, чтобы перенести изменений из my-hello репозитория в   hello-pull. Однако смело затянуть неизвестные изменения в репозиторий довольно пугающая перспектива. Меркуриал предлагает для таких случаев использовать команду hg incoming, которая сообщит нам, какие изменения будут затянуты в репозиторий командой hg pull, без затягивания этих изменений.


$ cd hello-pull
$ hg incoming ../my-hello
comparing with ../my-hello
searching for changes
changeset: 5:b6fed4f21233
tag: tip
user: Bryan O Sullivan
date: Tue May 05 06:55:53 2009 +0000
summary: Added an extra line of output

Для перенесения изменений в репозиторий, достаточно просто запустить команду hg pull, опционально можно указать из какого репозитория тянуть изменения.


$ hg tip
changeset: 4:2278160e78d4
tag: tip
user: Bryan O Sullivan
date: Sat Aug 16 22:16:53 2008 +0200
summary: Trim comments.$ hg pull ../my-hello
pulling from ../my-hello
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
(run 'hg update' to get a working copy)

$ hg tip
changeset: 5:b6fed4f21233
tag: tip
user: Bryan O Sullivan
date: Tue May 05 06:55:53 2009 +0000
summary: Added an extra line of output

Как видите из вывода команды hg tip до и после, мы удачно затянули изменения в наш репозиторий. Однако, Меркуриал разделяет процесс получения изменений, и обновление рабочей директории. Существует еще один шаг, который нужно выполнить, прежде чем мы увидим наши изменения в рабочей директории.

Обновление рабочей директории

Не так давно, мы отмечали разницу между репозиторием и его рабочей директорией. Команда hg pull приносит изменений в репозиторий, но если мы проверим, то не найдем эти изменений в рабочей директории. Это все потому, что hg pull не затрагивает (по умолчанию) рабочую директорию. Вместо этого, мы используем команду hg update.


$ hg update tip
1 files updated, 0 files merged, 0 files removed, 0 files unresolv

Может показаться немного странным, то, что hg pull не обновляет рабочую директорию автоматически. Для этого существует причина: вы можете использовать hg update для обновления вашей рабочей директории в любой ревизии истории репозитория. Например, если вы откатили изменения в репозитории до старой версии, чтобы найти баг, и при этом запустите hg pull, которая автоматически обновит рабочую директорию новой ревизией, вы потеряете изменения, сделанные позже текущей ревизии.

Типовую последовательность таких операций как pull-затем-update, Меркуриал позволяет вам объединить в одну, добавлением опции –u к hg pull.

Чтобы выяснить текущую ревизию рабочей директории, используйте команду hg parents.


$ hg parents
changeset: 5:b6fed4f21233
tag: tip
user: Bryan O Sullivan
date: Tue May 05 06:55:53 2009 +0000
summary: Added an extra line of output

Если вы вернетесь к рисунку «Графическое изображение репозитория hello», вы увидите стрелки, соединяющие каждый набор изменений. Узел, из которого стрела выходит, в данном случае родитель, а узел в который стрела заходит – его ребенок. Рабочая директория точно также имеет своего родителя – это набор изменений, который рабочая директория содержит, в текущий момент.

Для обновления рабочей директории к конкретной ревизии, нужно добавить номер ревизии или ID набора изменений, к команде hg update.


$ hg update 2
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg parents
changeset: 2:fef857204a0c
user: Bryan O Sullivan
date: Sat Aug 16 22:05:04 2008 +0200
summary: Introduce a typo into hello.c.$ hg update
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg parents
changeset: 5:b6fed4f21233
tag: tip
user: Bryan O'Sullivan
date: Tue May 05 06:55:53 2009 +0000
summary: Added an extra line of output

Если вы пропустите номер точной ревизии, hg update обновит репозиторий до последней ревизии.

Заливка изменений в другой репозиторий

Меркуриал позволяет выгружать изменения в другой репозиторий, из репозитория в котором мы сейчас находимся. Как  указано в примере с hg pull, создайте временный репозиторий, для заливки наших изменений в него.


$ cd ..
$ hg clone hello hello-push
updating working directory
2 files updated, 0 files merged, 0 files removed, 0 files unresolve

Команда hg outgoing говорит нам, какие изменения будут залиты в другой репозиторий.


$ cd my-hello
$ hg outgoing ../hello-push
comparing with ../hello-push
searching for changes
changeset: 5:b6fed4f21233
tag: tip
user: Bryan O Sullivan
date: Tue May 05 06:55:53 2009 +0000
summary: Added an extra line of output

И команда hg push непосредственно производит заливку изменений.


$ hg push ../hello-push
pushing to ../hello-push
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files

Также как с hg pull, команда hg push не обновляет рабочую директорию нашего репозитория. Но в отличие от hg pull, hg push не поддерживает опцию –u, которая сразу, же обновляет рабочую директорию. Такая асимметрия не случайна:  репозиторий, в который мы заливаем изменения, может находиться на удаленном сервере, и открыт для работы нескольким пользователям. Если мы попытаемся обновить их рабочую директорию, в то время как кто-то из них работает, их работа будет нарушена.

Что случится если мы попытаемся залить и вылить изменений в репозиторий, который уже содержит эти изменения? Ничего, особо захватывающего.


$ hg push ../hello-push
pushing to ../hello-push
searching for changes
no changes found

Расположение по умолчанию

Когда мы клонируем репозиторий, Меркуриал записывает расположение клонируемого репозитория в .hg/hgrc файл нового репозитория. Если мы не указываем специальное расположение для команд hg pull и hg push, эти команды используют расположение по умолчанию. Команды hg incoming и hg outgoing, поступают точно так же.

Если вы откроете файл .hg/hgrc в текстовом редакторе, вы увидите содержание, похожее на это:


[paths]
default = http://www.selenic.com/repo/hg

Это возможно – и зачастую очень удобно – использовать расположение по умолчанию для команд hg push и hg outgoing, отличающееся от команд hg pull и hg incoming. Это можно сделать, путем добавления строки default-push, в секции [paths] файла .hg/hgrc, как показано ниже:


[paths]
default = http://www.selenic.com/repo/hg
default-push = http://hg.example.com/hg

Раздача изменений по сети

Команды, которые мы описали в предыдущих разделах не ограничиваются работой только с локальными репозиториями. Каждая из них точно также работает и в сети, просто вместо локального пути, укажите URL.


$ hg outgoing http://hg.serpentine.com/tutorial/hello
comparing with http://hg.serpentine.com/tutorial/hello
searching for changes
changeset: 5:b6fed4f21233
tag: tip
user: Bryan O Sullivan
date: Tue May 05 06:55:53 2009 +0000
summary: Added an extra line of output

В этом примере, мы можем видеть какие изменения мы можем залить в удаленный репозиторий, но он, понятное дело, не позволяет заливать изменения анонимным пользователям.


$ hg push http://hg.serpentine.com/tutorial/hello
pushing to http://hg.serpentine.com/tutorial/hello
searching for changes
ssl required

Начало нового проекта

Начать новый проект так же просто, как работать с уже существующим. Команда hg init создает новый, пустой репозиторий Меркуриал


$ hg init myproject

Мы смело можем называть myproject репозиторием Меркуриала, потому что он содержит папку .hg.


$ cd myproject
$ dir /b
.hg

Если мы хотим добавить некоторые уже существующие файлы в репозиторий, мы должны скопировать их в папку, и велеть Меркуриалу отслеживать их изменения, используя команду hg add.


$ cd ..
$ copy hello\hello.c myproject
$ hg add
adding hello.c
$ hg status
A hello.c

После того как мы убедились, что наш проект выглядит правильно, мы коммитим наши изменения.


$ hg commit -m 'Initial commit'

Требуется всего несколько минут, чтобы начать использовать Меркуриал в новом проекте. С контролем ревизий стало настолько легко работать, что мы можем использовать его как в маленьких, так и в крупных серьезных проектах.

bb4aebae-3206-4340-ac57-1cdcc530395f

Рассказать друзьям

Понравилась статья? Лучший способ сказать спасибо - поделиться ссылкой в социальных сетях: