I'm so sorry for the awful question title, but I'll try to explain myself a bit more verbosely:
I'm using Git (but I guess the particular software doesn't really matter in this case) for my software project. As many projects, I'm planning on having various releases. When there's a release, I'd probably assign a commit a tag - for example "1.0". Time goes by, and code gets hacked, and eventually there's a release, with another tag - this time "2.0".
One day, I notice a serious bug, that's present in both releases 1.0 and 2.0, and it needs to be fixed. To make things difficult (and probably more realistic as well), I can't just fix it in the current master/trunk and assume everyone would be using that, because there are some backwards incompatibilities in 2.0 with 1.0 and people are lazy and don't want to upgrade.
So, what would be a good scheme to have, in order to support this kind of behavior: being able to make changes in older versions. Git seems to equate tags with releases at some level, because of the output of the git describe
command ("[latest tag]-[commits since the tag]-[current commit hash]
"). I probably can't avoid using tags altogether, then.
I can feel that a combination of tags and branches would be a good idea, but for some reason I can't wrap my head around the particulars with this one.