Продолжаем разговор начатый в первой части.
Локальный репозиторий
Для примера, создаём тестовый каталог, допустим 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 и предлагает нам сделать собственный выбор по разрешению ситуации.
Выбираем правильный на наш взгляд вариант, жмём «сохранить» и слияние заканчивается. Ничего страшного. Не забываем про 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"
Теперь у нас опять одна центральная ветка.
← вспомнить начало | Продолжение следует → |
Прикольно. На серваке поднять 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