Resources are versioned in order to capture a snapshot of the current state of the resources at one specific point in time. Resources in CVS are versioned by tagging them with a version label. When a resource is versioned, it means that a non-modifiable copy of it can be retrieved from the repository.
Versioning a project saves the line up of all resource versions in the project. Resources other than projects (files and folders) can be versioned. However, it is more common to version entire projects together as the resources contained in a project are often highly interdependent. Projects can be versioned from the workspace or from the branch (including HEAD) in the CVS Repositories view. The difference between these two approaches is in deciding which child resource versions should be part of the project version.
When tagging a project as a version from the Workbench, the base revisions of the files in the Workbench are tagged as belonging to that version. This is the preferred method of versioning a project because you know exactly which file revisions will be in the version. This operation is allowed if you have outgoing changes or uncommitted changes. Uncommitted changes are simply ignored and resources with outgoing changes can still have their base revisions be part of the version. Versioning a project with uncommitted or outgoing changes is handy if you have to split the project at the point where you started making changes to the resources and commit the resources to another branch.
When tagging a project as a version from a branch in the CVS Repositories view, you are versioning whatever the latest resource versions are in the branch at that moment in time. You should not version your projects from the branch if you do not know what is committed in the branch. For this reason, versioning from the Workbench is often preferable.