Любая source control система (TFS, SVN, Git и т.д.) умеет работать с такими вещами, как branch (ветка) и tag (метка). Ветки нужны для разработки каких-то фич, исправления багов и т.д., что бы в это время не ломать уже работающий код. Тэги, в свою очередь, нужны для заморозки какой-то версии кода без возможности последующих исправлений. Грязные хаки вроде залезть в базу данных source control чтобы поменять файл с каким-то тэгом я не рассматриваю по понятным причинам.
В моем случае, изменения в код с каким-то тэгом было связано с задачей сборки новой версии Openstack essex-2 под Red Hat Enterprise Linux (RHEL). Алгоритм работы был, примерно такой:
- забираем исходники Openstack’а: $ git clone https://github.com/openstack/nova.git
- переключаемся на нужный тэг: $ git checkout essex-2
- делаем необходимые изменения в коде и пытаемся запушить в новый бранч: $ git push myrepo essex-2.
После данных действий, в моем репозитории, к удивлению, вместо нового бранча с нужными изменениями появился тэг essex-2, который был идентичен такому тэгу с официального репозитория Openstack’а. Чтение Pro Git расставило все на свои места и стало ясно почему так случилось.
Далее, для выполнения нужных мне действий понадобилось выполнить команды:
- $ git checkout -b branchname tag
- $ git push myrepo essex-2
Что эквивалентно такому:
- $ git branch branchname tag
- $ git checkout branchname
- $ git push myrepo essex-2
Надеюсь что мой пост не помешает правильному использованию тэгов.