Я бы объединил оба подхода. Всякий раз, когда вы делаете релиз, пометьте его. Теги никогда не должны изменяться, поэтому наличие тега "1.0.0" является показателем того, что вам не следует пытаться выпустить что-либо еще как 1.0.0.
В то же время, когда пришло время сделать 1.0.0, я поместил его в ветку 1.0. Итак, поток таков: ветвь ствола до 1.0, пометьте этот новый 1.0 как 1.0.0 и разверните Затем можно исправить ошибки в ветке 1.0 (чтобы избежать путаницы с разработкой, нацеленной на 1.1, которая уже может быть в транке) и объединить в транк. Каждый выпуск фиксированной версии 1.0 помечается как 1.0.x из ветви 1.0. Это в основном подход, который мы используем при работе с Perforce, и он очень похож на Subversion. (Читая ответы, я думаю, что это практически идентично рекомендации Винсента)
Что касается комментария о том, что теги являются избыточными из-за того, что у вас есть номера ревизий - это в значительной степени верно, за исключением того, что теги также определяют область действия: то есть, какие файлы в хранилище охватываются тегом. Вы можете разумно попросить кого-нибудь взглянуть на /svn/proj1/tag/1.0.0, и они сразу же посмотрят на согласованное рабочее пространство. Если вы попросите их взглянуть на ревизию X, они должны сначала взглянуть на ревизию X, чтобы увидеть, что она меняется (скажем) / svn / proj1 / trunk / Makefile, и, следовательно, сделать вывод, что / svn / proj1 / trunk / @ X - это то, что они должны смотреть. Что произойдет, если версия X коснулась файлов в proj1 и proj2? Что, конечно, зло, но, строго говоря, вы должны сказать / svn / proj1 / trunk / @ X. И где хранится список номеров ревизий? Откуда мы знаем, что 1.0.0 является ревизией X? ИМХО должно быть возможно определить это только из хранилища.
В таких системах, как Git, теги и ветви все еще в основном одно и то же (просто ссылки на базу данных объектов), но соглашение *1008* состоит в том, что ссылки на теги не меняются, а ссылки на ветки делают (и желательно с определенным ограничением на то, как они меняются). Perforce также имеет «метки», которые представляют собой способы группировки набора версий файла независимо от списка изменений; который по сути является тегом, но более запутанным: исторически мы использовали номера списков изменений (эквивалентные номерам ревизий Subversion), в которых указывалось название ветви, в которой они должны находиться, для идентификации версий. В любом случае, они почти идентичны, так что я думаю, что TMTOWTDI.