Many professional git users suggest that when working with remote git repositories, one should ‘always fetch and merge instead of pull’. The basic reason for this is that although the quick description of what ‘git pull’ does is ‘fetch the remote branch that your local branch tracks against and merge it into the local branch’, inspecting the source code shows that it actually does a lot more.
How do we actually do this? The syntax of git when working with remotes can be rather confusing.
First, understand that everything git does, happens with files on your machine. Running
git branch -a will show you all the branches available to you, including a bunch that will be listed as something like
remotes/origin/branchname (for a remote server named origin). These aren’t links to the remote, like you might expect; they’re local copies of the branch as obtained from the remote - which is known to be from a remote because of the
remotes/ prefix. That
remotes/origin/branchname branch exists on your machine and can be used without connecting to the network at all, though it’ll need to be periodically updated from the network.
In normal operations the only time git will connect to the network is if you run
git fetch or
git push, including running
git fetch via
This explains the differences in syntax, which might be confusing at first. If we are working with the network, we need to specify which remote we’re working with, as a remote - not as part of a branch. So to update our remote-tracking branches from
origin, we do
git fetch origin, which will fetch all the origin branches. And if we want to push to origin, we use
git push origin branchname, not
git push origin/branchname;
origin/branchname is a remote-tracking branch on our machine, not a remote machine.
On the other hand, when merging in the fetch & merge pattern, we aren’t interacting with the network at all; we’re just using our local copies of a remote branch. So, the correct command to merge the remote
branchname branch into our local working
branchname branch is
git merge origin/branchname (while having the
branchname branch checked out); we don’t need to specify the remote as an argument because we’re not interacting with the network at all.
Hopefully, this helps give a better understanding of how git works. Happy committing!