Git Use Case

CVS vs git (or hg)
CVS

Dev A: initial code for Feature X Dev A: fixed blah blah Dev B: initial code for Feature Y Dev A: implemented foobar Dev B: fixed blahblah bug Dev B: implemented qaz Dev A: finalizing changes  Dev B: blah blah Dev A: missing features in Feature X Dev B: Feature Y blah blah

The last 3 commits need to be merged manually to the stable branch. This is quite confusing if the commits involve dozens or hundreds of modified files.

git

Dev A branch

=
Dev A: initial code for Feature X Dev A: fixed blah blah Dev A: implemented foobar Dev A: finalizing changes Dev A: missing features in Feature X

Dev B branch

=
Dev B: initial code for Feature Y Dev B: fixed blahblah bug Dev B: implemented qaz Dev B: blah blah Dev B: Feature Y blah blah

master branch

=
Dev A: Feature X Dev B: Feature Y Dev A: Bug#1234: Fixes for Feature X Dev B: Bug#2468: Fixes for Feature Y Dev C: Feature Z

After the dev finishes his work on his private branch, a clean changeset (as opposed to set of files in CVS) can be committed to the master branch. A merge squash is used to combine all changes into a single changeset.

stable branch

=
Dev A: Feature X Dev A: Bug#1234: Fixes for Feature X Dev C: Feature Z

The builder can then decide which features are merged to the stable branch.