Starting with a clean slate

Whenever you need to start a new task in a codebase, I think it's important to always try to start with a clean slate.

This is having an empty staging area and no lingering or uncommitted changes from previous tasks.

I do this to avoid having contaminated commits that contain multiple changes. Each commit should be related to one change.

You can use git add -p to review, stage and commit parts of your changes, but as the uncommitted changes grow, you're less likely to do that and more likely to commit them at once with a generic commit message that offers no value when viewed in the commit log.

You're more likely to create better and more valuable commits and write better commit messages if you break them into chunks and commit the changes as you make them.

If you have extra files you don't want to commit, add them to a .gitignore file or .git/info/exclude so they're ignored.

If you have uncommitted changes that you want to hide for now but re-add later, git stash is your friend.

If you want your changes to be completely separate, maybe git worktrees are for you.