How do I reduce that complexity? I always pull and never fetch, which helps slightly, but only slightly; pull seems to fetch other branches, so it's still possible to have my copy of a branch end up behind my remote-tracking copy of that branch. There's no command analogous to pull for "add and commit and push", so that's always a second step to possibly forget (I don't want to rely on an alias as I work on a number of different machines). Most problematic at the moment is that there's no way to tell the difference between an up-to-date branch and a non-remote-tracking branch, so I sometimes delete branches that I haven't fully pushed, because I forgot to make them remote-tracking, so they didn't show up as behind when I "git status"ed.
I've been on a team that transitioned from SVN to Perforce, the again to Git, keeping the same workflow all the way through.
It isn't the way that I prefer using git, but it works perfectly well.
That's the situation I described. We still have the problems I mentioned: sometimes we commit without pushing (particularly because we sometimes didn't set a branch to be remote-tracking and didn't realize this), and sometimes our branches are behind our copy-of-the-remote-branch because we pulled different branches (which leads to bogus merges in the history).
If your team member forgot to push and you put out new changes, that is a problem for him to resolve. If you forgot to push, and your team member put out new changes, that is a problem for you to resolve. Workflow wise, this all works the same as it does with any other centralized workflow.
If you forget to check for updates... well that is something that happens in other centralized schemes as well. You figure it out when you go to push and it fails, you correct it, then you are good to go.
Sure, but you hit the problem twice as often in git, because you have to do twice as many things.
> If you forget to check for updates... well that is something that happens in other centralized schemes as well. You figure it out when you go to push and it fails, you correct it, then you are good to go.
In SVN that doesn't show up as a merge in the history.
Well no, I don't...
If this really is a frequent problem for you, then you might want to consider adding a note to the end of git-commit's output to remind you to push, or even just aliasing git-commit to push by default. I would recommend that you instead learn how to use git, but failing that...
> "In SVN that doesn't show up as a merge in the history."
If you don't want to resolve those situations with a merge, then don't resolve those situations with a merge... Rebasing exists for a reason.
You might like "git pull --rebase"
Git allows you to follow a centralized process perfectly fine. However if you choose to not follow a centralized process, it will not force you to.
I don't track my other developers' feature branches locally unless I need to view them.
What? Of course you can. I've worked on teams that did it. You are talking total rubbish.