How to force “git pull” to overwrite a local branch?

Latest Update: 2018-02-21 by Joe

In development with Git, when you are following updates on a remote branch (e.g. the master branch on origin, you will get a conflict between your local master branch and remote’s master.

Yes, it’s annoying. This article is about how to solve the problem by forcing the “git pull” execution.

Conflict between a local branch and a remote branch

“git pull” is the most useful Git command when you’re merging any update made on the remote’s master that the local branch is maybe following. So, it’s always frustrating to see an error message like this:

$ git pull 
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 3), reused 0 (delta 0)
Unpacking objects: 100% (5/5), done.
From bitbucket.org:my-team/my-repository
   273bd1a..ca527ec  master       -> origin/master
Auto-merging index.php
CONFLICT (content): Merge conflict in index.php
Automatic merge failed; fix conflicts and then commit the result.

Conflict.. , that word has never been comfortable for me, or maybe it’s not for any developer.

When you see this message, maybe you’ll think: “All I need to do is, just make the local master up to date.  Overwrite the local with the remote’s master”.

Now, you will start to think about a way of forcing git pull.

How to FORCE “git pull”?

The questions is, “is it possible to FORCE the execution of git pull?”

OK, here’s the answer first: Yes, it is. But there’s not an option like “git pul --force”. So, check out the command below. Be sure you are on your local master branch before the execution.

# 1) Fetch commits on "origin", and update all your remote tracking reference
$ git fetch origin 

# 2) Force the local master to "origin/master"
$ git reset --hard origin/master

As you see, this is not a command with “git pull” at all. However, I bet it’ll do what exactly you want to do,  “git pull --force”, that is.

What exactly is going on?

Again, there’s no command options like “git pull --force”. But the command shown above does almost the same thing. Here’s a little bit of the elaboration.

What exactly does “git pull” do?

Well, getting back from the digression, as you see in the above figure, “git pull” is a short hand of “git fetch” and “git merge”. and this is exactly what’s executed when you run “git pull origin master”

// 1) Fetch the master from origin
git fetch origin master

// 2) merge it into you local master.
git merge FETCH_HEAD

(1) git fetch updates the remote tracking branch. and (2) is the merge of the remote tracking branch into the local branch.

JFYI, FETCH_HEAD is the reference to the commits that have been fetched when you have run “git fetch”. You can find it at .git/FETCH_HEAD. There’s should be some set of commit SHA1 and ref names written in a text file.

In the above case, what’s actually merged in “origin/master”.

How to force git pull

The remote tracking branch updated by “git fetch”

If you’re not so familiar with the term “remote tracking branch”, maybe you might want to know more about it.

A remote tracking branch is a “reference” to a branch on a remote repository. Since a remote tracking branch is just like a mirrored version of a branch that exists on a remote repository, it’s not something you edit or work on. It’s just used as a reference. So they are basically treated differently than your local branches.

If you have pushed a local branch to a remote (or fetched a branch from a remote, ) you should have a remote tracking branch that is tracking the remote’s branch with the same branch anme.

Command to list remote tracking branches

Try the command to check it:

$ git branch -avv

// Output
* master 70e55da [origin/master] Merge branch 'feature/new-func'
  remotes/origin/master 70e55da Merge branch 'feature/new-func'

The option of “-a” is to show all the local branches including the remote tracking branches. The option of “-vv” is just useful because it shows not only local branches, but the corresponding upstream branch for each local branch.

Or you can also do like this. This is more thorough.

$git remote show origin

* remote origin
  Fetch URL: git@bitbucket.org:username/www-creators.git
  Push  URL: git@bitbucket.org:username/www-creators.git
  HEAD branch: master
  Remote branches:
    master           tracked
    prod               tracked
  Local branches configured for 'git pull':
    master           merges with remote master
    prod               merges with remote prod
  Local refs configured for 'git push':
    master           pushes to master           (fast-forwardable)
    prod               pushes to prod               (up to date)

References

Here are useful links about git pull force:

OK, this is about it.

Enjoy your project. Take care.