What you need to realize, coming from CVS, is that you no longer create directories when setting up a tag or a branch.
You no longer have to explicitly structure your repository with:
branches
myFirstBranch
myProject
mySubDirs
mySecondBranch
...
tags
myFirstTag
myProject
mySubDirs
mySecondTag
...
That structure comes from the fact CVS is a revision system and not a version system (see Source control vs. Revision Control?).
That means branches and tags are amulated through directory copies.
Your question makes senses if you are used to checkout a tag, and start working in it.
Which you shouldn't ;) A tag is supposed to represent an immutable content, used only to access it with the guarantee to get the same content every time.
In Git, the history of revisions is a series of commits, forming a graph.
A branch is one path of that graph
x--x--x--x--x # one branch
\
--y----y # another branch
1.1
^
|
# a tag pointing to a commit
- If you checkout a tag, you will need to create a branch to start working from it.
- If you checkout a branch, you will directly see the latest commit it('HEAD') of that branch.
See Jakub Narębski's answer for all the technicalities, but frankly, at this point, you do not need (yet) all the details ;)
The main point is: a tag being a simple pointer to a commit, you will never be able to modify its content. You need a branch.
In your case, each developer working on a specific feature:
- should create their own branch in their respective repository
- track branches from their colleague's repositories (the one working on the same feature)
- pulling/pushing in order to share your work with your peers.
Instead of tracking directly the branches of your colleagues, you could track only the branch of one "official" central repository to which everyone pushes his/her work in order to integrate and share everyone's work for this particular feature.