Push and Pull almost always from the cli. But one of the things I find tools like Sourcetree useful for is selecting which changes (hunks, files or selected lines) to stage for commit, which is in my opinion much easier than with the CLI only.
I never understood why people feel the need do this. If you are working on a bug or feature, why put unrelated changes in that branch? It only creates confusion and probably messes up your tests too. And for what? It seems like a chaotic way of working to me.
You know what, typing it out I can totally see why people do it the other way. A matter of personal preference probably.
Once it's done I will split the changes into commits that make logical sense, for someone wondering how the new code changes the behaviour of the existing code.