为什么git说" Pull是不可能的,因为你有未合并的文件"?

时间:2014-10-15 07:28:00

标签: git git-pull merge-conflict-resolution git-fetch

当我尝试在终端中拉入项目目录时,我看到以下错误:

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

为什么git会说"Pull is not possible because you have unmerged files",我该如何解决?

11 个答案:

答案 0 :(得分:174)

目前发生的是,您有一组特定的文件,您之前尝试过这些文件,但它们会引发合并冲突。 理想情况下,如果发生合并冲突,他应手动解决它们,并使用git add file.name && git commit -m "removed merge conflicts"提交更改。 现在,另一个用户已经在他的存储库中更新了有问题的文件,并将他的更改推送到了公共上游存储库。

碰巧,你的合并冲突(可能)最后一次提交没有解决,所以你的文件没有合并,因此Uunmerged)标志文件。 所以现在,当你执行git pull时,git会抛出错误,因为你有一些版本的文件,但没有正确解析。

要解决此问题,您必须先解决有问题的合并冲突,然后添加并提交更改,然后才能执行git pull

问题的复制和解决问题:

# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test

首先,让我们创建存储库结构

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

现在我们处于repo_clone状态,如果你执行了git pull,它会引发冲突

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.

如果我们忽略克隆中的冲突,并在原始仓库中进行更多提交,

repo_clone $ cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

然后我们做git pull,我们得到

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

请注意,file现在处于未合并状态,如果我们执行git status,我们可以清楚地看到相同的内容:

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

因此,要解决此问题,我们首先需要解决之前忽略的合并冲突

repo_clone $ vi file

并将其内容设置为

text2
text1
text1

然后添加并提交更改

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts

答案 1 :(得分:34)

当您的工作目录不干净时,您正尝试向本地分支添加一个新提交。结果,Git拒绝做拉。请考虑以下图表以更好地可视化场景:

  

远程:A&lt; -B&lt; -C&lt; -D
  本地:A&lt; -B *
  (*表示您有几个已修改但未提交的文件。)

处理这种情况有两种选择。您可以放弃文件中的更改,也可以保留它们。

选项一:丢掉更改
您可以为每个未合并的文件使用git checkout,也可以使用git reset --hard HEAD将分支中的所有文件重置为HEAD。顺便说一句,你当地分公司的HEAD是B,没有星号。如果选择此选项,图表将变为:

  

远程:A&lt; -B&lt; -C&lt; -D
  本地:A&lt; -B

现在,当您拉动时,您可以使用master中的更改快进您的分支。拉动后,你的分支看起来像主人:

  

local:A&lt; -B&lt; - C&lt; -D

选项二:保留更改
如果要保留更改,首先需要解决每个文件中的任何合并冲突。您可以在IDE中打开每个文件,并查找以下符号:

  

&LT;&LT;&LT;&LT;&LT;&LT;&LT;头部   //您的代码版本
  =======
  //代码的远程版本
  &GT;&GT;&GT;&GT;&GT;&GT;&GT;

Git向您展示了两个版本的代码。 HEAD标记中包含的代码是当前本地分支的版本。另一个版本来自遥控器。一旦选择了代码版本(并删除了其他代码以及标记),您可以通过键入git add将每个文件添加到临时区域。最后一步是通过使用适当的消息键入git commit -m来提交结果。此时,我们的图表如下所示:

  

远程:A&lt; -B&lt; -C&lt; -D
  本地:A&lt; -B&lt; - C&#39;

在这里,我将我们刚刚提交的提交标记为C&#39;因为它与远程提交C不同。现在,如果你试图拉,你会得到一个非快进错误。 Git无法在您的分支上播放远程更改,因为您的分支和远程分支都与公共祖先提交B分歧。此时,如果您想要提取,则可以执行另一个git merge或{{ 1}}你的分支在遥控器上。

掌握Git需要能够理解和操纵单向链表。我希望这个解释可以帮助你思考使用Git的正确方向。

答案 2 :(得分:25)

这是一个简单的解决方案。但为此,您首先需要学习以下内容

vimdiff

要删除混淆,您可以使用

git mergetool

上面的命令基本上为每个冲突的文件打开本地文件,混合文件,远程文件(总共3个文件)。本地&amp;远程文件仅供您参考,使用它们可以选择在混合文件中包含(或不包含)的内容。然后保存并退出文件。

答案 3 :(得分:6)

如果你想下拉一个远程分支在本地运行(比如用于审查或测试),当你$ 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) 出现本地合并冲突时:

 func calculateAmountPanels(){

    let fpanelsHigh = Float(panelsHigh)
    let fpanelsWidth = Float(panelsWidth)

    if panelsHighTextField != nil && panelsWideTextField != nil {
        resHightLabel.stringValue = "N/A"
        resWidthLabel.stringValue = "N/A"
        lblScreenHight.stringValue = "N/A"
        lblScreenWidth.stringValue = "N/A"
        lblScreenArea.stringValue = "N/A"
        lblAmountPanels.stringValue = "N/A"
    }
    else {


    ammountPanels = (fpanelsWidth! * fpanelsHigh!)

    printText()

}
}

答案 4 :(得分:5)

你有一些本地需要合并的文件才能拉出来。您可以签出文件,然后拉动以覆盖您的本地文件。

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master

答案 5 :(得分:4)

要遵循的步骤:

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)

谢谢, 粗话

答案 6 :(得分:3)

如果您不想合并更改并仍想更新本地,请转到命令。

git reset HEAD —hard

这将使用HEAD重置您的本地,然后使用git pull拉取您的遥控器!

答案 7 :(得分:2)

如果您不希望对本地分支机构进行任何更改,我认为这是最好的方法

git clean -df
git reset --hard
git checkout REMOTE_BRANCH_NAME
git pull origin REMOTE_BRANCH_NAME

答案 8 :(得分:1)

我也有同样的问题 就我而言,步骤如下 -

  1. 删除了所有以 U (未合并)符号开头的文件。 as-
  2. U   project/app/pages/file1/file.ts
    U   project/www/assets/file1/file-name.html
    
    1. 从主程序中提取代码
    2. $ git pull origin master
      
      1. 检查状态
      2.  $ git status
        

        这是它出现的信息 并分别有2个和1个不同的提交    (use "git pull" to merge the remote branch into yours)
        你有未合并的路径    (fix conflicts and run "git commit")

        未合并的路径:
          (使用&#34; git add ...&#34;标记分辨率)

        both modified:   project/app/pages/file1/file.ts
        both modified:   project/www/assets/file1/file-name.html
        
        1. 添加了所有新更改 -
        2.     $ git add project/app/pages/file1/file.ts
          project/www/assets/file1/file-name.html
          
          1. 提交改变 -
          2. $ git commit -am "resolved conflict of the app."
            
            1. 推送代码 -
            2. $ git push origin master
              

              使用此图片可以解决哪个问题 - enter image description here

答案 9 :(得分:0)

发生合并冲突时,您可以打开单个文件。你会得到 &#34;&LT;&LT;&LT;&LT;&LT;&LT;&LT;或&gt;&gt;&gt;&gt;&gt;&gt;&gt;&#34;符号。这些是指您的更改以及远程更改。 您可以手动编辑所需的部件。 之后保存文件然后执行: git add

合并冲突将得到解决。

答案 10 :(得分:-1)

只需运行此命令:

git reset --hard