What is the difference between 'git pull' and 'git fetch'?
When you use
pull, Git tries to automatically do your work for you. It is context sensitive, so Git will merge any pulled commits into the branch you are currently working in.
pullautomatically merges the commits without letting you review them first. If you don’t closely manage your branches, you may run into frequent conflicts.
fetch, Git gathers any commits from the target branch that do not exist in your current branch and stores them in your local repository. However, it does not merge them with your current branch. This is particularly useful if you need to keep your repository up to date, but are working on something that might break if you update your files. To integrate the commits into your master branch, you use
What are the differences between
git pull and
The only difference between
git pull and
git fetch is that :
git pull pulls from a remote branch and merges it.
git fetch only fetches from the remote branch but it does not merge
i.e. git pull = git fetch + git merge ...
What is the difference between
To understand this, you first need to understand that your local git maintains not only your local repository, but it also maintains a local copy of the remote repository.
git fetch brings your local copy of the remote repository up to date. For example, if your remote repository is GitHub - you may want to fetch any changes made in the remote repository to your local copy of it the remote repository. This will allow you to perform operations such as compare or merge.
git pull on the other hand will bring down the changes in the remote repository to where you keep your own code. Typically,
git pull will do a
git fetch first to bring the local copy of the remote repository up to date, and then it will merge the changes into your own code repository and possibly your working copy.
git pull == ( git fetch + git merge)
git fetch does not changes to local branches.
If you already have a local repository with a remote set up for the desired project, you can grab all branches and tags for the existing remote using git fetch . ... Fetch does not make any changes to local branches, so you will need to merge a remote branch with a paired local branch to incorporate newly fetch changes. from github
git fetch is similar to
pull but doesn't merge. i.e. it fetches remote updates (
objects) but your local stays the same (i.e.
origin/master gets updated but
master stays the same) .
git pull pulls down from a remote and instantly merges.
git clone clones a repo.
git rebase saves stuff from your current branch that isn't in the upstream branch to a temporary area. Your branch is now the same as before you started your changes. So,
git pull -rebase will pull down the remote changes, rewind your local branch, replay your changes over the top of your current branch one by one until you're up-to-date.
git branch -a will show you exactly what’s going on with all your branches - local and remote.
This blog post was useful:
git clone and
I thought I'd update this to show how you'd actually use this in practice.
Update your local repo from the remote (but don't merge):
After downloading the updates, let's see the differences:
git diff master origin/master
If you're happy with those updates, then merge:
On step 2: For more on diffs between local and remotes, see: compare local git branch with remote branch?
On step 3: It's probably more accurate (e.g. on a fast changing repo) to do a
git rebase origin here. See @Justin Ohms comment in another answer.
It cost me a little bit to understand what was the difference, but this is a simple explanation.
master in your localhost is a branch.
When you clone a repository you fetch the entire repository to you local host. This means that at that time you have an origin/master pointer to
HEAD and master pointing to the same
when you start working and do commits you advance the master pointer to
HEAD + your commits. But the origin/master pointer is still pointing to what it was when you cloned.
So the difference will be:
- If you do a
git fetchit will just fetch all the changes in the remote repository (GitHub) and move the origin/master pointer to
HEAD. Meanwhile your local branch master will keep pointing to where it has.
- If you do a
git pull, it will do basically fetch (as explained previously) and merge any new changes to your master branch and move the pointer to
git fetch pulls down the code from the remote server to your tracking branches in your local repository. If your remote is named
origin (the default) then these branches will be within
origin/, for example
origin/mybranch-123, etc. These are not your current branches, they are local copies of those branches from the server.
git pull does a
git fetch but then also merges the code from the tracking branch into your current local version of that branch. If you're not ready for that changes yet, just
git fetch first.
I like to have some visual representation of the situation to grasp these things. Maybe other developers would like to see it too, so here's my addition. I'm not totally sure that it all is correct, so please comment if you find any mistakes.
LOCAL SYSTEM . ===================================================== ================= . ================= =================== ============= REMOTE REPOSITORY . REMOTE REPOSITORY LOCAL REPOSITORY WORKING COPY (ORIGIN) . (CACHED) for example, . mirror of the a github repo. . remote repo Can also be . multiple repo's . . . FETCH *------------------>* Your local cache of the remote is updated with the origin (or multiple external sources, that is git's distributed nature) . PULL *-------------------------------------------------------->* changes are merged directly into your local copy. when conflicts occur, you are asked for decisions. . COMMIT . *<---------------* When coming from, for example, subversion, you might think that a commit will update the origin. In git, a commit is only done to your local repo. . PUSH *<---------------------------------------* Synchronizes your changes back into the origin.
Some major advantages for having a fetched mirror of the remote are:
- Performance (scroll through all commits and messages without trying to squeeze it through the network)
- Feedback about the state of your local repo (for example, I use Atlassian's SourceTree, which will give me a bulb indicating if I'm commits ahead or behind compared to the origin. This information can be updated with a GIT FETCH).
OK, here are some information about
git pull and
git fetch, so you can understand the actual differences... in few simple words, fetch gets the latest data, but not the code changes and not going to mess with your current code, but pull get the code changes and merge it your local branch, read on to get more details about each:
It will download all refs and object and any new branches to local Repository...
Fetch branches and/or tags (collectively, "refs") from one or more other repositories, along with the objects necessary to complete their histories. Remote-tracking branches are updated (see the description of below for ways to control this behavior).
By default, any tag that points into the histories being fetched is also fetched; the effect is to fetch tags that point at branches that you are interested in. This default behavior can be changed by using the --tags or --no-tags options or by configuring remote..tagOpt. By using a refspec that fetches tags explicitly, you can fetch tags that do not point into branches you are interested in as well.
git fetch can fetch from either a single named repository or URL, or from several repositories at once if is given and there is a remotes. entry in the configuration file. (See git-config1).
When no remote is specified, by default the origin remote will be used, unless there’s an upstream branch configured for the current branch.
The names of refs that are fetched, together with the object names they point at, are written to .git/FETCH_HEAD. This information may be used by scripts or other git commands, such as git-pull.
It will apply the changes from remote to the current branch in local...
Incorporates changes from a remote repository into the current branch. In its default mode, git pull is shorthand for git fetch followed by git merge FETCH_HEAD.
More precisely, git pull runs git fetch with the given parameters and calls git merge to merge the retrieved branch heads into the current branch. With --rebase, it runs git rebase instead of git merge.
should be the name of a remote repository as passed to git-fetch1. can name an arbitrary remote ref (for example, the name of a tag) or even a collection of refs with corresponding remote-tracking branches (e.g., refs/heads/:refs/remotes/origin/), but usually it is the name of a branch in the remote repository.
Default values for and are read from the "remote" and "merge" configuration for the current branch as set by git-branch --track.
I also create the visual below to show you how
git fetch and
git pull working together...
It’s important to note that the
fetchcommand pulls the data to your local repository — it doesn’t automatically merge it with any of your work or modify what you’re currently working on. You have to merge it manually into your work when you’re ready.
If you have a branch set up to track a remote branch, you can use the
git pullcommand to automatically fetch and then merge a remote branch into your current branch. This may be an easier or more comfortable workflow for you; and by default, the
git clonecommand automatically sets up your local master branch to track the remote master branch on the server you cloned from (assuming the remote has a master branch). Running
git pullgenerally fetches data from the server you originally cloned from and automatically tries to merge it into the code you’re currently working on.
You can fetch from a remote repository, see the differences and then pull or merge.
This is an example for a remote repository called
origin and a branch called
master tracking the remote branch
git checkout master git fetch git diff origin/master git rebase origin master
Actually Git maintains a copy of your own code and the remote repository.
git fetch makes your local copy up to date by getting data from remote repository. The reason we need this is because somebody else might have made some changes to the code and you want to keep yourself updated.
git pull brings the changes in the remote repository to where you keep your own code. Normally,
git pull does this by doing a ‘git fetch’ first to bring the local copy of the remote repository up to date, and then it merges the changes into your own code repository and possibly your working copy.
If there is sufficient interest, I suppose I could update the image to add
git clone and
In speaking of pull & fetch in the above answers, I would like to share an interesting trick,
git pull --rebase
This above command is the most useful command in my git life which saved a lots of time.
Before pushing your new commits to server, try this command and it will automatically sync latest server changes (with a fetch + merge) and will place your commit at the top in git log. No need to worry about manual pull/merge.
Find details at: http://gitolite.com/git-pull--rebase
We simply say:
git pull == git fetch + git merge
If you run
git pull, you do not need to merge the data to local. If you run
git fetch, it means you must run
git merge for getting the latest code to your local machine. Otherwise, the local machine code would not be changed without merge.
So in the Git Gui, when you do fetch, you have to merge the data. Fetch itself won't make the code changes at your local. You can check that when you update the code by fetching once fetch and see; the code it won't change. Then you merge... You will see the changed code.