По большому счету, коммит - это завершенная семантически, минимальная операция. К примеру, "Убрал кнопку", "Исправил опечатку", "Добавил новое поле", "Исправил ошибку такую-то". Ведь есть такая штука, как
blame, которая позволяет увидеть в любом файле построчно, кто и что менял. Кто меня - понятно, а вот "что менял" как раз и берется из сообщения коммита. То есть, коммиты должны быть маленькими, семантически законченными, сообщение должно отражать суть изменения. Тогда историю можно будет удобно использовать.
Для отдельных задач всегда делается отдельная ветка, пусть даже в ней будет один коммит. Потом эта ветка мержится в основную после code review.
Вообще, есть отличная методология работы с git - git-flow. Вот хорошая статья на хабре об этом:
Почему вы до сих пор не используете git-flow?