Whatever you want to do in your local environment is not overkill. If you want to have 100 local branches, that's totally up to you, and if that turns out to be overkill (probably), then you can scale back appropriately.
The "problems with fast-forwarding" are a matter of taste. The default behavior of Git is to fast-forward instead of merge if the two branches have not diverged. Like the author, I also don't like this, but I would not call it a "problem". As a workaround, I perform merges like this:
# merge branch without fast forward and commit
git merge --no-ff --no-commit branchname
# code review
git diff
# commit the merge
git commit -m 'merged: branchname'
I use the alias rev = merge --no-ff --no-commit
to simplify the merge step to git rev branchname
(named "rev" as in "review", as in "code review").
To view a log of only the merge commits, use another alias: revlog = log --first-parent
Since I use a separate branch for every feature, this way I can see the large steps in the evolution of project, like a change log.
For your 2nd question, I think you're looking for these commands:
# view the branches that have been merged already
git branch --merged
# view the branches that have NOT been merged yet
git branch --no-merged
I don't know Tortoise, but gitk
is pretty nice, if I remember correctly it's included with Git Bash.