В чем разница между тегом hg и закладкой hg? - PullRequest
65 голосов
/ 22 марта 2011

В чем разница между тегом и закладкой в Mercurial?Кажется, я не могу найти никакого объяснения того, как они различаются.

Ответы [ 4 ]

33 голосов
/ 22 марта 2011

Давайте рассмотрим ваш репозиторий как « выберите ваши собственные книги приключений », с разных точек зрения.

  • A тег похож на штампчто редактор поместил вашу рукопись, чтобы сказать: «Хорошо, мы сохраним след вашей текущей работы на случай, если случится дерьмо».
  • A с именем филиала будетглава.Вы должны выбрать в какой-то момент, какую главу вам придется написать, и они останутся там.Некоторые сливаются назад, другие заканчиваются (извините, вы умерли).
  • A закладка - это, ну, в общем, закладка.Он следует за вами, пока вы читаете (фиксируете) книгу.Это помогает вам отслеживать «то, что вы читали в то время», так что вы можете удалить их, переместить в другую «главу».Когда вы делитесь книгой (push), вы обычно не делитесь своими закладками, если вы явно не хотите этого делать.Поэтому вы обычно используете их в анонимных ветвях , потому что их жизненный цикл короче, чем в именованных ветвях.
24 голосов
/ 19 апреля 2012

На самом деле есть пять концепций, с которыми можно играть:

  • теги
  • локальные теги
  • закладки
  • облегченные ветви
  • именованные ветви

Легкие ветви - это то, что происходит, если вы просто используете Mercurial.История вашего хранилища разветвляется, а иногда и сливается, когда вы меняете вещи и перемещаетесь по своей истории.

Другие четыре способа - это аннотирование легких ветвей и наборов изменений, которые их составляют.

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

локальные теги и закладки намного больше похожи на то, что git называет тегами и ветвями.Они являются метаданными, а не смешиваются с версионными объектами.Таким образом, они не представлены как часть истории хранилища.Они имеют тенденцию быть локальными для вашего репозитория и не будут распространяться, если вы не распространяете их преднамеренно.

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


Как я на самом деле использую эти вещи на практике.

Я работаю над одним общим репозиториемоколо 20 человек.Я делаю много экспериментов и облегченных веток в своем собственном частном репозитории, которые никогда не попадают в наш главный центральный репозиторий.Иногда, когда эксперимент завершается, я изменяю основную строку и помещаю набор изменений в центральный репозиторий, откуда он попадает на компьютер других пользователей.

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

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

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

Я сам почти никогда не делаю нелокальные теги или именованные ветви (кроме случая, и я уничтожаю их, если я это делаю).Но наши люди выпускают.Наши выпущенные основные версии имеют свои собственные именованные ветви от основной линии, а второстепенные версии имеют теги на этих ветвях.Это гарантирует, что эти важные ветви и теги выглядят одинаково для всех.

Опять же, я не знаю, так ли это, как предполагается использовать Mercurial, но, похоже, это модель, которая хорошо работает для нашего размеракоманды.

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

23 голосов
/ 22 марта 2011

Закладки используются, когда вы хотите мнемонику (foo_feature), которая указывает на изменение идентификатора коммита в процессе вашей работы. Они более легкие, чем обычные ветки Mercurial, и чем-то похожи на то, как работают git-ветки.

Теги обычно указывают на фиксированные идентификаторы коммитов. Их можно переназначить вручную, но это не рекомендуется.

12 голосов
/ 22 марта 2011

Самая большая разница в том, что закладка автоматически перемещается вперед при фиксации.Вот пример:

hg init
..edit a file..
hg commit -m 'my commit' # creates revision 0
hg tag -r 0 mytag     # creates revision 1
hg bookmark -r 0 mybookmark   # doesn't create a revision
hg update 0   # get back to r0
..edit a file..
hg commit -m 'another commit'  # creates revision 2

В этот момент mytag все еще указывает на ревизию 0, а mybookmark теперь указывает на ревизию 2. Кроме того, тегирование создало набор изменений, а закладка - нет.

Также, конечно, закладка создала ревизию

...