Сохранение ветви по умолчанию, когда первый коммит находится в другой ветви - PullRequest
2 голосов
/ 17 января 2012

Мы реализуем поток разработки, в котором у каждой новой функции есть своя ветвь, которая после завершения объединяется с веткой по умолчанию. Проблема в том, что самый первый коммит в новом репо происходит в первой функциональной ветке. Когда она нажата, ветвь функции становится стандартной. Не существует ветки с именем «default», так как с этой веткой не связано никаких наборов изменений. Очевидно, что это проблема, когда приходит время объединить ветвь функции с (несуществующей) веткой по умолчанию.

Единственное решение, которое мне приходит в голову, - это сделать первый коммит по умолчанию в качестве соглашения при каждом запуске нового проекта, чтобы у нас была ветвь с именем "default", которая является родителем всех других ветвей. Есть ли более чистый способ сделать это, который не требует фиктивной фиксации (например, что-то, что говорит "зафиксировать пустую ревизию по умолчанию")?

Ответы [ 2 ]

3 голосов
/ 17 января 2012

Хотя Mercurial позволит вам работать без ветки default, это не рекомендуется. Наша вики-страница говорит:

Не используйте имя, отличное от имени по умолчанию, для вашей основной ветки разработки

Основная ветка Mercurial называется "default" и аналогична "trunk" в SVN, "HEAD" в CVS и "master" в Git. Это ветвь, проверенная новыми клонами. Если вы попытаетесь использовать какое-то другое имя для своей «основной» ветви, пользователи получат более или менее случайную ветвь, когда они клонируют и фиксируют вещи в неправильном месте, что обычно нежелательно.

Так что вы должны попытаться сделать ветку default вашей основной веткой разработки.

Если вы хотите работать в ветвях функций "все время", то я рекомендую вам все же сделать пару коммитов в ветке default при запуске проекта. Большинству проектов нужна общая настройка, поэтому я не думаю, что это будет странно или странно.

2 голосов
/ 17 января 2012

Я вижу две возможности (принимая во внимание ответ Мартина, когда вам рекомендуется оставить default в качестве основной ветки разработки).

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

Другой вариант, если вы уже зафиксировали другую именованную ветку, - это обновить набор изменений null (очищает ваш рабочий каталог), затем merge внутрь.Это создает ветку с именем "default".

Сначала мы сделаем некоторую работу над веткой разработки:

C:\tmp\test>hg init .
C:\tmp\test>hg branch devbranch
marked working directory as branch devbranch

C:\tmp\test>echo something > out.txt
C:\tmp\test>hg add .
adding out.txt

C:\tmp\test>hg commit -m "some work"
C:\tmp\test>hg log
changeset:   0:4631a4a10552
branch:      devbranch
tag:         tip
summary:     some work

Здесь у нас есть один коммит в нашей ветке devbranch.Когда работа завершена (что, к счастью, в данном случае, так и есть), мы хотим объединить работу обратно в нашу (несуществующую) ветвь default.Поэтому мы обновляем до null перед выполнением слияния:

C:\tmp\test>hg update null
0 files updated, 0 files merged, 1 files removed, 0 files unresolved

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

C:\tmp\test>hg commit -m "merged"
C:\tmp\test>hg log
changeset:   1:55e879b67c69
tag:         tip
parent:      -1:000000000000
parent:      0:4631a4a10552
summary:     merged

changeset:   0:4631a4a10552
branch:      devbranch
summary:     some work

C:\tmp\test>hg branches
default                        1:55e879b67c69
devbranch                      0:4631a4a10552 (inactive)

Как видите, ветвь default создается с первым набором изменений в этой ветке, имеющим двух родителей, -1 и 0.После этого вы просто обновите кончик ветки default, когда захотите объединиться - hg update null будет выполнено только в первый раз.

...