1) Get yourself a decent visualisation of the commit graph.
You should see at least:
* Labels for all local branches
* Labels for all remote-tracking branches ("origin/whatever" etc)
* A label for the HEAD pointer (i.e. what is currently checked out.)
I found the Git Extensions plugin for Windows pretty helpful in this regard, though I think gitk and the Eclipse and Intellij visualisations show them, too.
"git log" with default settings does not show anything except your currently checked out branch, which can be extremely confusing.
2) When in doubt, do "git fetch".
This will synchronize the remote-tracking branches on your machine with the actual state of the remote repository. It will not include the changes into your currently checked out copy and it will not modify the remote repository in any way.
Therefore, if you are unsure if your local repository is correctly synced, calling "git fetch" is usually a good (and safe) way to be sure.
3) Be careful with "git pull".
"git pull" is basically an alias for "git fetch; git merge origin/<the branch you have checked out right now>".
However, what this means is that it will synchronize your "origin/..." branch with the remote repository, then immediately try to merge your local work with whatever changes just got downloaded from your repository.
A good analogy for this procedure is "trying to cross a road with your eyes closed": Because you have no way to inspect the changes that you are actually merging in, this can lead to unexpected conflicts and can be relatively counter-intuitive to undo.
If you are not entirely sure about the state of the remote repository, a better workflow is (in my opinion):
* Do a manual "git fetch".
* Inspect the "origin/..." branch using "git log" or a GUI and identify any relevant changes and possible conflicts.
* Do "git pull" or "git merge origin/..." when you actually want to incorporate the changes into your checked-out copy.
4) All the history rewriting stuff creates copies.
Your old commits are still around, they are just not included in any branch and therefore hidden from most GUIs. However, you can still access them by calling any git command with their commit ID.