Я всегда использовал git раньше, но я хочу внести свой вклад в python, поэтому теперь я должен изучать Mercurial, и я нахожу это очень расстраивающим.
Итак, я сделал пару небольших патчей и хотел отследить их как коммиты в моем локальном хранилище Mercurial. Видимо, есть 4 способа обработки ветвления в Mercurial . 1 и 4 показались мне совершенно нелепыми, именованные ветви кажутся тяжеловесными, и я чувствую, что не должен использовать их для быстрых исправлений 1 фиксации, поэтому я использовал закладки.
Теперь мой патч отклонен, и я хочу удалить одну из моих веток закладок из своего хранилища. ОК, в git я бы просто принудительно удалил свою ветку и забыл об этом, поэтому я удаляю свою закладку, и теперь у меня возникают следующие проблемы:
TortoiseHG и
hg log
до сих пор показывают, что commit иdefault
branch имеют 2 головы. И если я правильно понимаю, вы не можете удалить коммиты в hg без дополнительных плагинов.У Mercurial есть не только хэши, но и номера ревизий. Поскольку я добавил пару своих собственных коммитов, все извлеченные после этого коммиты имеют номера ревизий, отличные от основного центрального репо.
Я сделал это
hg update
после того, как потянул, чтобыmaster
автоматически переместить мою закладку в последний коммит, но я не смог найти способ сделать это в TortoiseHG.
Что я делаю не так? Это нормально и ожидаемо, и я должен просто игнорировать эти проблемы? Или как мне работать с моими ветками?
В Mercurial вы не создаете ветки. Каждый коммит по сути является веткой, любой коммит может иметь нескольких родителей и нескольких детей. Итак, это четыре разных способа организации одних и тех же объектов.
Вы можете дать им разные имена, вам не нужно , но это хорошая идея. В именованных ветвях нет ничего тяжелого - это просто дополнительные метаданные. Лично я предпочитаю именованные ветви чему-либо еще в любой ситуации.
Именно это и является причиной использования именованных веток вместо того, чтобы помещать все в
default
.Вы вообще не можете ничего удалить в Mercurial, и вам не следует этого делать . Вы можете использовать,
hg strip
но это не записано - вы просто отключили часть вашего локального репо. Вы не можете это подтолкнуть, и если вы извлечете из репо, в котором есть ветвь, которую вы разделили локально, она вернется.Числа ничего не значат. Вы можете игнорировать их, если они вас смущают.
Я не использовал TortoiseHG, но
hg pull -u
сделаю и то,pull
и другоеupdate
.Это нормально, многие пользователи Mercurial чувствуют то же самое по отношению к Git (включая меня).
источник
Даже когда Mercurial и Git похожи, они имеют разные дизайны, возможно, самое важное различие в дизайне заключается в том, что в Mercurial изменение истории не так гибко, как в git (потому что это не рекомендуется).
Короткий ответ : не имеет значения, если у вас есть небольшое количество изменений, вы все равно можете использовать ветку. Если вы думаете об удалении этой ветви, используйте закладку, чтобы вы могли удалить ее позже и затем удалить изменения.
Во-первых, попытка пролить немного света на некоторые вещи, которые вы упоминаете:
1 и 4 считаются ветвлением, потому что каждый раз, когда вы фиксируете, вы фактически создаете неназванную ветвь (если к тому же времени есть другой коммит в вашем исходном / благословенном репо), который технически является ветвью. В методе 4 вы создаете новую «голову», а в методе 1 - нет . Главы должны быть объединены. Я согласен, что метод 1 довольно глуп, но некоторым он нравится ... для небольших проектов, я думаю.
Что касается метода 2, дело не в том, что ветви тяжелые, а в том, что они постоянны . Вы не можете удалить ветку, если не используете что-то вроде расширения полосы. Опять же, философия дизайна Mercurial не направлена на изменение истории (но она стала лучше).
Что касается номеров ревизий , они являются просто локальной и более понятной для человека ссылкой для использования всех команд, связанных с ревизиями. Если вам нравится использовать хэши, вы все равно можете это сделать. Номера версий являются всего лишь ярлыком и игнорируются Mercurial для любых внутренних операций между различными репозиториями.
Теперь, чтобы ответить на ваши другие вопросы:
hg heads
, если вы видите 2+ головы в одной названной ветви, желательно, чтобы они были объединены. Это, вероятно, где ваша закладка .hg rollback
, но я полагаю, что это не так.hg bookmark --delete yourbookmark
Кроме того, в git у вас могут быть «частные локальные ветви», потому что вы должны явно их выдвигать, а потом можете их удалить. В Mercurial вы продвигаете все, что у вас есть , однако, если вы хотите избежать этого, вы можете использовать функцию фаз и пометить ряд ревизий как секретные . Секретные изменения не будут выдвинуты.
Наконец, вы не делаете ничего плохого , просто имейте в виду, что это просто разные инструменты, построенные с немного отличающимся мышлением, которые в значительной степени сводятся к следующему: изменение истории (git) или не изменение истории (hg). В Mercurial труднее выстрелить себе в ногу, изменяя историю (особенно с Фазами), и поэтому некоторым это нравится лучше, чем git .
источник
hg strip
. Я полагаю, что то же самое можно сказать и о децентрализованных копиях имен веток Git, за исключением того различия, что именованные ветви имеют глобальное пространство имен, а имена ветвей Git - нет. И несколько голов существуют из-за ветвей имен. Это своего рода заразительная ошибка проектирования для децентрализованного VCS.Я считаю, что с Mercurial легче всего не беспокоиться о ветвях. Я просто нахожу, где в истории я хочу редактировать и создавать коммиты по мере необходимости (анонимные ветки). Иногда закладки могут быть полезны, если мне приходится прыгать между головами в разных контекстах, но чаще всего я не беспокоюсь о них. Именованные ветви подходят для долгоживущих ветвей (ветки исправления ошибок, ветки проекта), но для исправлений с 1 или 2 фиксациями они не являются подходящим инструментом для работы.
Хитрость с анонимными ветвями состоит в том, чтобы установить их фазу на «секретный», если вы не хотите их выдвигать, т.е. если вы хотите, чтобы они были локальными. Если вы действительно хотите , чтобы подтолкнуть их, но вы не хотите больше никаких фиксаций на их основе, вы просто совершить «--close-ветвь» на них сверху , который не означает , что они больше не появляются в списке "головок и ртутный перестанет жаловаться на несколько голов в этой ветви.
источник
Я думаю, что мы можем просто использовать закладку вместо ветви; в любом случае мы будем продолжать поддерживать продукт, и объединение двух филиалов в долгосрочной перспективе будет большой головной болью.
источник