Encuentro que git, trabajando en árboles enteros como lo hace, se beneficia menos de la integración ideal que las herramientas de control de código fuente que están basadas en archivos o siguen un patrón de checkout-edit-commit. Por supuesto, hay casos en los que puede ser agradable hacer clic en un botón para hacer un examen de historia, pero no echo mucho de menos eso.
Lo que hay que hacer es llenar tu archivo .gitignore con las cosas que no deberían estar en un repositorio compartido. El mío generalmente contiene (entre otras cosas) lo siguiente:
*.vcproj.*.user
*.ncb
*.aps
*.suo
pero esto está fuertemente sesgado en C++ con poco o ningún uso de cualquier funcionalidad de estilo de mago de clase.
Mi patrón de uso es algo como lo siguiente.
1) Código, código, código en VS.
2) Cuando esté contento (punto intermedio sensible al código commit, cambie a git, escale los cambios y revise las diferencias. Si algo está obviamente mal, vuelve a VS y arréglalo, si no commit.
Cualquier fusión, ramificación, rebase u otro tipo de cosas elegantes de SCM es fácil de hacer en git desde la línea de comandos. VS normalmente está bastante contento con las cosas que cambian bajo él, aunque a veces puede necesitar recargar algunos proyectos si has alterado los archivos de proyecto de forma significativa.
Encuentro que la utilidad del git supera cualquier inconveniente menor de no tener una integración completa en el IDE, pero es, hasta cierto punto, una cuestión de gusto.