My first advice is to not git pull. Do a git fetch followed by a git merge.
To answer your zero'th question: In fact, you are up-to-date. You have all the commits that the remote repository has. So, there is nothing left to fetch or merge1.
To answer your first question:
- git commit: commit your changes on your own branch, totally unrelated to what's going on in remote repositories.
- git fetch origin: get the contents of the remote repository (- origin), but keep them under- origin/branchbranches. Your own code is unaffected at this point.
- git merge origin/master: merge- origin/masterwhich is the- masterbranch of the remote repository- origin(which you fetched just now) with your current branch.
- git push origin: push back the commit and the merge to the remote repository
To answer your second question:
- git fetch origin: update- origin/branchbranches.
- git diff origin/master: get the difference between your current branch and the branch- origin/master.
1 Suppose this is what the commits in your repository initially look like, on branch master:
A -> B -> C -> D -> E
                    |
                    |\- master
                    |
                     \- origin/master
This is right after you cloned the repository. Now you say you have made a new commit on your local branch master:
A -> B -> C -> D -> E -> F
                    |    |
                    |     \- master
                    |
                     \- origin/master
So there are two things to observe here.
- Assuming no activity by somebody else in the remote - origin, there is nothing new to fetch. So- git fetch origin mastertells you there is nothing new.
 
- If you do - git merge origin/master, again, there is nothing to merge.- origin/masteris a prefix of- master. In other words,- masteralready contains all the commits that- origin/masterhas, so there is nothing new to merge.
 
If you had used fetch and merge instead of pull, you could easily understand which part of the double-command (pull) is the one that results in unexpected (in your opinion) behavior.
Of course, after a git push origin master, you will get:
A -> B -> C -> D -> E -> F
                         |
                         |\- master
                         |
                          \- origin/master