为什么git会说“无法拉,因为您有未合并的文件”?


195

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

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",我该如何解决?


1
就我而言,我只是使用这些命令“ git add”。然后“git的承诺-m‘测试’,并最终‘混帐推’错误删除。
Akhzar纳齐尔

您只需要添加“ $ git add <文件>” ...即可更新要提交或还原的内容(放弃工作目录中的更改),然后提交“ $ git commit”,然后单击“ $ git push”以完成合并。
find_X

如果有帮助的话:我注意到只是在做“ git add”。则提交失败。我必须按名称添加单个文件,然后提交并拉/推。
ouonomos,

Answers:


212

当前正在发生的事情是,您有一组特定的文件,您先前尝试过合并,但是它们引发了合并冲突。理想情况下,如果遇到合并冲突,他应该手动解决它们,并使用提交更改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中,如果执行a 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
为了完整起见,我将添加@Pawan的答案以使用'git mergetool'解决冲突。倒数第二个步骤可能不太实用(“解决合并...(通过设置)...其内容为:[某些文本]”)。
不可否认的是,

或者,您可以使用@ user261的建议进行合并。无论哪种方式,我认为在实际意义上增加如何合并都将完成此答案。
不可否认的是,

3
当您有简单的冲突要修复单个文件时,此答案非常有效。例如,一两行不同的代码。如果您有多个文件已被大量修改,这是一个困难的修复。但是,这使人们意识到,使用Git时,您应该经常致力于避免发生困难的冲突。
Vaughn D. Taylor

46

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

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

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

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

远程:A <-B <-C <-D
本地:A <-B

现在,当您拉动时,您可以通过master的更改快速前进分支。拉动之后,您的分支看起来像master:

本地:A <-B <-C <-D

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

<<<<<<< HEAD
//您的代码版本
=======
//远程的代码版本
>>>>>>>

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

远程:A <-B <-C <-D
本地:A <-B <-C'

在这里,我将刚刚进行的提交标记为C',因为它与远程上的提交C不同。现在,如果您尝试拉动,将出现非快进错误。Git无法在分支的远程中播放更改,因为分支和远程都偏离了共同祖先提交B。这时,如果要拉,则可以执行另一个操作git merge,也git rebase可以在远程上进行分支。

精通Git需要能够理解和操纵单向链表。我希望这种解释能使您对使用Git的正确方向进行思考。


33

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

vimdiff

要删除冲突,可以使用

git mergetool

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


2
我要说的是,Vimdiff可以要求(你可以用你的选择,比如的WinMerge,或OSX的内置FileMerge,请等任何合并/差异的工具)。话虽如此,这对@mu的回答是一个很大的补充。
不可否认的是,

32

如果您不想合并更改,但仍然想更新本地,请运行:

git reset --hard HEAD  

这将使用HEAD重置您的本地,然后使用git pull来拖动您的遥控器。

如果您已经在本地提交了合并(但尚未推送到远程),并且还希望还原它:

git reset --hard HEAD~1 

6

如果您想拉下一个远程分支以在本地运行(例如,出于审查或测试目的),并且当$ git pull您遇到本地合并冲突时:

$ 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)

5

您需要在本地合并一些文件,然后才能进行拉取。您可以签出文件,然后拉出以覆盖本地文件。

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

合并合并了两个文件的内容。当前,本地文件与远程服务器上的文件不同。合并必须在远程服务器上完成。因此,如果您暂存已编辑的文件并推送它们,则所做的更改将添加到存储库中的文件中。然后,您的文件将同步,您可以进行其他更改来提取整个项目。当我开始使用git时,我发现git帮助书很有帮助。您可以在这里找到它:git-scm.com/book/en/Getting-Started
Nick

请注意,我不是OP。“合并文件”是不正确的术语。严格来说,您合并提交,而不是文件。
jub0bs 2014年

是的,是的,我的策略。我试图给出一个简单的答案
Nick

好吧,如果您在合并提交时遇到冲突,那么可以,您将有冲突的未合并文件,并且需要将其合并。
爱德华·汤姆森2014年

3

遵循的步骤:

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)

谢谢,Sarbasish


2


我遇到相同的问题,就我而言,步骤如下-

  1. 删除了所有以U(未合并)符号开头的文件。如-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. 从主机提取代码

$ git pull origin master
  1. 检查状态

 $ git status

这是它出现的消息
,分别具有2和1个不同的提交。 您有未合并的路径。
(use "git pull" to merge the remote branch into yours)

(fix conflicts and run "git commit")

未合并的路径:(
使用“ git add ...”标记分辨率)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. 添加了所有新更改-

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. 提交更改-

$ git commit -am "resolved conflict of the app."
  1. 推送代码-

$ git push origin master

该图像可能解决了哪个回合问题- 在此处输入图片说明


1

发生合并冲突时,您可以打开单个文件。您将获得“ <<<<<<<<或>>>>>>>”符号。这些指的是您所做的更改以及遥控器上存在的更改。您可以手动编辑所需的零件。之后,保存文件,然后执行:git add

合并冲突将得到解决。


-1

只需运行以下命令:

git reset --hard

3
您应该解释该命令的作用,因为如果某些人尝试发现该命令删除了所有当前的本地更改,他们将感到非常失望:/
Joseph Budin

如果您仅将更改复制到外部临时源,则此方法有效。.如果您只有几个文件,例如项目的配置文件,那是完美的。执行命令,然后还原您的更改。为我工作!
cwiggo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.