Mercurial: первые впечатления (часть 2)

Продолжаем разговор начатый в первой части.

Локальный репозиторий

Для примера, создаём тестовый каталог, допустим hg, а в нём папку с тестовым проектом, пусть будет my.
Теперь создадим там репозиторий: hg init.

C:\>cd hg\my

C:\hg\my>hg init

C:\hg\my>dir

21.02.2010  19:13    <DIR>          .
21.02.2010  19:13    <DIR>          ..
21.02.2010  19:13    <DIR>          .hg

Появившийся каталог .hg это и есть наша локальная репа. Не бойтесь, в отличии от SVN, он останется один и не будет лезть во все подкаталоги.

Дальше всё, как в SVN: создали файл, добавили в систему контроля (add), закомитили.

C:\hg\my>echo This is one > one.txt

C:\hg\my>hg add
adding one.txt

C:\hg\my>hg commit --message="one"

Создали ещё файл, посмотрели на состояние системы, добавили, закомитили.

C:\hg\my>echo This is two > two.txt

C:\hg\my>hg stat
? two.txt

C:\hg\my>hg add
adding two.txt

C:\hg\my>hg commit --message="two"

Глядим логи:

C:\hg\my>hg log
changeset:   1:7bbba2454deb
tag:         tip
user:        go <>
date:        Sun Feb 21 19:21:22 2010 +0300
summary:     two

changeset:   0:e97c0aeaea03
user:        go <>
date:        Sun Feb 21 19:19:18 2010 +0300
summary:     one

user, data, summary понятно что. tag:tip указывает сейчас на последний коммит. changeset — аналог «ревизии». 1:7bbba2454deb — локальный и глобальный идентификатор этой ревизии. С локальными всё понятно, это как обычно: 0, 1, 2 ….

Попробуем по номеру вернутся на шаг назад:

C:\hg\my>dir

21.02.2010  19:18                14 one.txt
21.02.2010  19:21                14 two.txt

C:\hg\my>hg update 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved

C:\hg\my>dir

21.02.2010  19:18                14 one.txt

«Обновились» до ревизии с локальным номером 0 (файл two.txt исчёз). Но так, как теперь у нас репозиторий не один, а есть у каждого разработчика, локальные номера 0,1,2 есть в каждом из них и везде указывают на разное. Поэтому, для чёткого указания ревизии и нужен этот «7bbba2454deb». Впрочем, указывать его целиком не обязательно, хватит первых нескольких символов, достаточных для точной идентификации среди других ревизий:

C:\hg\my>hg update 7bb
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

C:\hg\my>dir

21.02.2010  19:18                14 one.txt
21.02.2010  19:31                14 two.txt

Ветки

И вот мы программируем, программируем и уже напрограммировали целых 2 файла — one.txt и two.txt. И тут решаем написать для нашего супер-проекта форум. Да, да, форум. Написание форума дело длительное и параллельно с ней нам нужно будет делать другие вещи. Мы хотим чтобы:

  • По мере написания форума, пока он ещё сырой, основная ветка разработки не была замусорена им.
  • Комиты, относящиеся к форуму, не перемешивались с другими — сразу было бы видно, это разработка форума, а это чего-то другого.

Совершенно очевидно, нам нужна отдельная ветка. В SVN для этого нам нужна определённая структура каталогов (trunk, branches, tags), куча телодвижений по копированию и настройкам и, конечно, геморроидальный merge в самом конце.

В мерке нам этого ничего не надо. Просто говорим — теперь это ветка «forum» и разрабатываем в ней дальше.

C:\hg\my>hg branch forum
marked working directory as branch forum

C:\hg\my>mkdir forum

C:\hg\my>echo This is forum > forum\1.txt

C:\hg\my>echo forum add >> one.txt

C:\hg\my>hg add
adding forum\1.txt

C:\hg\my>hg commit --message="forum start"

В любой момент можем посмотреть список веток и узнать в какой находимся:

C:\hg\my>hg branches
forum                          2:1f1ef6e8d374
default                        1:7bbba2454deb (inactive)

C:\hg\my>hg branch
forum

Ну и, конечно, вернуться в главную (default) и продолжить разработку других фич:

C:\hg\my>dir

21.02.2010  19:46       <DIR>    forum
21.02.2010  19:47                26 one.txt
21.02.2010  19:31                14 two.txt

C:\hg\my>hg update default
1 files updated, 0 files merged, 1 files removed, 0 files unresolved

C:\hg\my>dir
21.02.2010  19:51                14 one.txt
21.02.2010  19:31                14 two.txt

C:\hg\my>echo default >> one.txt

C:\hg\my>hg add

C:\hg\my>hg commit --message="default commit"
created new head

Оба-на! Все изменения (папка forum, новая строка в one.txt) исчезли, и наш рабочий каталог привёлся к тому виду, в котором пребывал до ветвления.

А давайте ещё сделаем «викторину»! Ответвим ветку «quiz» и будем там работать:

C:\hg\my>hg branch quiz
marked working directory as branch quiz

C:\hg\my>mkdir quiz

C:\hg\my>echo This is quiz > quiz/index.txt

C:\hg\my>hg add
adding quiz\index.txt

C:\hg\my>hg commit --message="quiz"

Нет, давайте теперь вернёмся к форуму и сделаем ему админку. Вещь тоже сложная, поэтому ответвим от «forum» подветку «admin».

C:\hg\my>hg update forum
2 files updated, 0 files merged, 1 files removed, 0 files unresolved

C:\hg\my>hg branch admin
marked working directory as branch admin

C:\hg\my>mkdir forum\admin

C:\hg\my>echo This is admin of forum > forum\admin\index.txt

C:\hg\my>hg add
adding forum\admin\index.txt

C:\hg\my>hg commit --message="admin of forum"

Сделаем ещё что-нибудь на самом форуме и в центральной ветке.

C:\hg\my>hg update forum
0 files updated, 0 files merged, 1 files removed, 0 files unresolved

C:\hg\my>echo forum add > forum/add.txt

C:\hg\my>hg add
adding forum\add.txt

C:\hg\my>hg commit --message="forum work"
created new head

C:\hg\my>hg update default
1 files updated, 0 files merged, 2 files removed, 0 files unresolved

C:\hg\my>echo def > def.txt

C:\hg\my>hg add
adding def.txt

C:\hg\my>hg commit --message="def"
created new head
Ветки
Что-то мы наделали, самим не разобраться.

Воспользуемся наконец какой-нибудь графической приблудой. В контекстном меню нашего рабочего каталога (c:\hg\my) выбираем Hg Repository Explorer и, вуаля, вот оно наше дерево: основная ветка, quiz, forum и от forum отходит admin.

Ну что же, на мой взгляд наш форум с викториной достигли идеала и их можно слить в основную ветку.


C:\hg\my>dir

21.02.2010  20:01                 6 def.txt
21.02.2010  20:01                24 one.txt
21.02.2010  19:31                14 two.txt
               3 файлов             44 байт
               3 папок  36 765 618 176 байт свободно

C:\hg\my>hg merge quiz
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

C:\hg\my>dir

21.02.2010  20:01                 6 def.txt
21.02.2010  20:01                24 one.txt
21.02.2010  22:38    <DIR>          quiz
21.02.2010  19:31                14 two.txt

Просто hg merge ветка и всё. И вот уже quiz слилась с default. Не забудем это закомитить.

C:\hg\my>hg add

C:\hg\my>hg commit --message="quiz merge"

Что там с нашими ветками?

C:\hg\my>hg branches
default                        8:6cf115955db6
forum                          6:a20b8659775e
admin                          5:a37f5e63c2dc
quiz                           4:1d911b93ec9f (inactive)

Они все на месте, только quiz стала inactive. А в графическом виде?
Ветки

Продолжаем слив :). Идём в ветку forum и вливаем в неё admin.

C:\hg\my>hg update forum
3 files updated, 0 files merged, 2 files removed, 0 files unresolved

C:\hg\my>hg merge admin
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

C:\hg\my>hg add

C:\hg\my>hg commit --message="merge admin to forum"

Теперь у нас осталось две ветки (forum слева, так как мы находимся сейчас в ней):
Ветки

Осталось перейти в default и влить в неё forum:

C:\hg\my>hg update default
3 files updated, 0 files merged, 3 files removed, 0 files unresolved

C:\hg\my>hg merge forum
merging one.txt
...

Опа, не всё так просто. У нас конфликт в файле one.txt! Так как у нас поставлен GUI, то выскакивает KDiff3 и предлагает нам сделать собственный выбор по разрешению ситуации.

diff

Выбираем правильный на наш взгляд вариант, жмём «сохранить» и слияние заканчивается. Ничего страшного. Не забываем про commit.

...
3 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

C:\hg\my>hg add

C:\hg\my>hg commit --message="merge forum"

Теперь у нас опять одна центральная ветка.

Ветки

← вспомнить начало Продолжение следует →

6 комментариев »

  • Прикольно. На серваке поднять web- или ssh-версию?

    adw0rd, 23.02.2010, 20:58

  • Вот не знаю пока )
    Думаю лучше ssh.

    vasa_c, 24.02.2010, 9:27

  • Ебусь уже пару часов пытаясь удалить созданные head-ы потому как они были не удачны, а в командной строке хер проссыш что сейчас будет компилироваться.

    Max, 23.11.2010, 8:34

  • Max, да с головами там бывают заморочки, особенно по-началу

    vasa_c, 23.11.2010, 11:09

  • Классно расписано, сразу же возникла картина происходящего и продержалась до финишного commit’a
    Насчет голов, мне, кажется, нужно понимать что это под-проект основного проекта, а не модуль основного проекта, без которого он функционировать не может.

    SiMBa, 22.12.2010, 9:55

  • Охуенно! Наконец-то понял, как примерно работать с ветками,а то я на кажду фичу делал клон )))

    Dmitry, 29.09.2012, 14:49

Leave a comment