gitgit-pullmerge-conflict-resolutiongit-fetch

Why does git say "Pull is not possible because you have unmerged files"?


When I try to pull in my project directory in the terminal, I see the following error:

harsukh@harsukh-desktop:~/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?


Solution

  • 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, they 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 their repository, and has pushed their 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 U(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 git pull.

    Sample reproduction and resolution of the issue:

    # 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