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”.
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.