What I do myself & highly recommend too:
Use feature branches for features
Once the feature is done, rebase it to origin/master
Then merge it into master with --no-ff
to intentionally create a merge commit.
This produces a very clean commit history - you know which commits came from a specific feature branch, and which ones were commited straight into master.
Take a look at my recent project as an example -- https://github.com/sarpik/turbo-schedule