When I try to pull in my project directory in the terminal, I see the following error:
[email protected]:~/Sites/branch1$ git pull origin master U app/config/app.php U app/config/database.php U app/routes.php Pull is not possible because you have unmerged files. Please, fix them up in the work tree, and then use 'git add/rm <file>' as appropriate to mark resolution, or use 'git commit -a'.
Why does git say
"Pull is not possible because you have unmerged files", and how can I resolve it?
What is currently happening is, that you have a certain set of files, which you have tried merging earlier, but they threw up merge conflicts.
Ideally, if one gets a merge conflict, he should resolve them manually, and commit the changes using
git add file.name && git commit -m "removed merge conflicts".
Now, another user has updated the files in question on his repository, and has pushed his changes to the common upstream repo.
It so happens, that your merge conflicts from (probably) the last commit were not not resolved, so your files are not merged all right, and hence the
unmerged) flag for the files.
So now, when you do a
git pull, git is throwing up the error, because you have some version of the file, which is not correctly resolved.
To resolve this, you will have to resolve the merge conflicts in question, and add and commit the changes, before you can do a
Sample reproduction and resolution of the issue:
# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test
# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params` Desktop $ cd test
First, let us create the repository structure
test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg" repo $ cd .. && git clone repo repo_clone && cd repo_clone repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone
Now we are in repo_clone, and if you do a
git pull, it will throw up conflicts
repo_clone $ git pull origin master remote: Counting objects: 5, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From /home/anshulgoyal/Desktop/test/test/repo * branch master -> FETCH_HEAD 24d5b2e..1a1aa70 master -> origin/master Auto-merging file CONFLICT (content): Merge conflict in file Automatic merge failed; fix conflicts and then commit the result.
If we ignore the conflicts in the clone, and make more commits in the original repo now,
repo_clone $ cd ../repo repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone
And then we do a
git pull, we get
repo_clone $ git pull U file Pull is not possible because you have unmerged files. Please, fix them up in the work tree, and then use 'git add/rm <file>' as appropriate to mark resolution, or use 'git commit -a'.
Note that the
file now is in an unmerged state and if we do a
git status, we can clearly see the same:
repo_clone $ git status On branch master Your branch and 'origin/master' have diverged, and have 1 and 1 different commit each, respectively. (use "git pull" to merge the remote branch into yours) You have unmerged paths. (fix conflicts and run "git commit") Unmerged paths: (use "git add <file>..." to mark resolution) both modified: file
So, to resolve this, we first need to resolve the merge conflict we ignored earlier
repo_clone $ vi file
and set its contents to
text2 text1 text1
and then add it and commit the changes
repo_clone $ git add file && git commit -m "resolved merge conflicts" [master 39c3ba1] resolved merge conflicts
You are attempting to add one more new commits into your local branch while your working directory is not clean. As a result, Git is refusing to do the pull. Consider the following diagrams to better visualize the scenario:
remote: A <- B <- C <- D
local: A <- B*
(*indicates that you have several files which have been modified but not committed.)
There are two options for dealing with this situation. You can either discard the changes in your files, or retain them.
Option one: Throw away the changes
You can either use
git checkout for each unmerged file, or you can use
git reset --hard HEAD to reset all files in your branch to HEAD. By the way, HEAD in your local branch is B, without an asterisk. If you choose this option, the diagram becomes:
remote: A <- B <- C <- D
local: A <- B
Now when you pull, you can fast-forward your branch with the changes from master. After pulling, you branch would look like master:
local: A <- B <- C <- D
Option two: Retain the changes
If you want to keep the changes, you will first want to resolve any merge conflicts in each of the files. You can open each file in your IDE and look for the following symbols:
// your version of the code
// the remote’s version of the code
Git is presenting you with two versions of code. The code contained within the HEAD markers is the version from your current local branch. The other version is what is coming from the remote. Once you have chosen a version of the code (and removed the other code along with the markers), you can add each file to your staging area by typing
git add. The final step is to commit your result by typing
git commit -m with an appropriate message. At this point, our diagram looks like this:
remote: A <- B <- C <- D
local: A <- B <- C’
Here I have labelled the commit we just made as C’ because it is different from the commit C on the remote. Now, if you try to pull you will get a non-fast forward error. Git cannot play the changes in remote on your branch, because both your branch and the remote have diverged from the common ancestor commit B. At this point, if you want to pull you can either do another
git merge, or
git rebase your branch on the remote.
Getting a mastery of Git requires being able to understand and manipulate uni-directional linked lists. I hope this explanation will get you thinking in the right direction about using Git.
If you dont want to merge the changes and still want to update your local then run:
git reset --hard HEAD
This will reset your local with HEAD and then pull your remote using git pull.
If you’ve already committed your merge locally (but haven’t pushed to remote yet), and want to revert it as well:
git reset --hard HEAD~1
Theres a simple solution to it. But for that you will first need to learn the following
To remove conficts, you can use
The above command basically opens local file, mixed file, remote file (3 files in total), for each conflicted file. The local & remote files are just for your reference, and using them you can choose what to include (or not) in the mixed file. And just save and quit the file.
If you want to pull down a remote branch to run locally (say for reviewing or testing purposes), and when you
$ git pull you get local merge conflicts:
$ git checkout REMOTE-BRANCH $ git pull (you get local merge conflicts) $ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD) $ git pull (now get remote branch updates without local conflicts)
You have some files locally that need to be merged before you can pull. You could checkout the files and then pull to overwrite your local files.
git checkout app/config/app.php app/config/database.php app/routes.php git pull origin master
There was same issue with me
In my case, steps are as below-
- Removed all file which was being start with U (unmerged) symbol. as-
U project/app/pages/file1/file.ts U project/www/assets/file1/file-name.html
- Pull code from master
$ git pull origin master
- Checked for status
$ git status
Here is the message which It appeared-
and have 2 and 1 different commit each, respectively.
(use "git pull" to merge the remote branch into yours)
You have unmerged paths.
(fix conflicts and run "git commit")
(use “git add …” to mark resolution)
both modified: project/app/pages/file1/file.ts both modified: project/www/assets/file1/file-name.html
- Added all new changes –
$ git add project/app/pages/file1/file.ts project/www/assets/file1/file-name.html
- Commit changes on head-
$ git commit -am "resolved conflict of the app."
- Pushed the code –
$ git push origin master
Steps to follow :
step-1 : git reset --hard HEAD (if you want to reset it to head) step-2 : git checkout Master step-3 : git branch -D <branch Name> (Remote Branch name where you want to get pull) step-4 : git checkout <branch name> step-5 : git pull. (now you will not get any error)
If you dont want any of your local branch changes i think this is the best approach
git clean -df git reset --hard git checkout REMOTE_BRANCH_NAME git pull origin REMOTE_BRANCH_NAME
When a merge conflict occurs , you can open individual file. You will get “<<<<<<< or >>>>>>>” symbols. These refer to your changes and the changes present on remote. You can manually edit the part that is requires. after that save the file and then do : git add
The merge conflicts will be resolved.
Just run this command:
git reset --hard