Here is a GUI to help visualize the tree.
With regards to branching methodologies, I'm working on a project right now where we are using branches. Our procedure works like this:
- Development towards future revisions of the software happens on the main trunc.
- Once we get to a point where we will release a new revision, we branch off a "BUGFIX" branch. Any fixes that need to happen prior to the next revision happen on the BUGFIX branch.
- Periodically, the BUGFIX branch is incrementally merged back onto the main development branch.
- Occasionally, we will have a special project that needs deployed prior to the next release, but shouldn't be mixed with BUGFIX code just yet. That code branches off of the BUGFIX and then merges back in when it is done.
- We've also developed the convention of maintaining a TAGS text file in the root directory of whatever part of the repository we branching. We keep it up to date with a description of what each tag is. We tag all releases, branches, and merges.