In the simplest terms, git pull does a git fetch followed by a git merge.
git fetch updates your remote-tracking branches under refs/remotes/<remote>/. This operation is safe to run at any time since it never changes any of your local branches under refs/heads.
git pull brings a local branch up-to-date with its remote version, while also updating your other remote-tracking branches.
From the Git documentation for git pull:
git pull runs git fetch with the given parameters and then depending on configuration options or command line flags, will call either git rebase or git merge to reconcile diverging branches.
It is helpful to keep in mind that when working on any Git respository on any particular machine, the repository contains a copy of all branches from all remotes as well as a copy of each local branch you have done some work on.
You can see this using git branch -a, which should show your local branches, including master, and all branches from all remotes.
master
feature/my-feature-branch
remotes/origin/master
remotes/origin/my-feature-branch
remotes/another-remote-machine/master
remotes/another-remote-machine/my-feature-branch
Above, I have indicated the existance of a remote origin repo as well as another remote by another name another-remote-machine.
Note you do not necessarily have to have a copy of each branch on all repositories. (Remotes and local.) It will depend on when you have synchronized things by running git pull, git push, git fetch, from the different machines/repositories involved.