为什么git会说“Pull is not possible because you have unmerged files”?

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

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

641800 次浏览

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

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

目前发生的情况是,您有一组特定的文件,您之前已经尝试合并这些文件,但它们引发了合并冲突。 理想情况下,如果有人得到合并冲突,他们应该手动解决它们,并使用git add file.name && git commit -m "removed merge conflicts"提交更改。 现在,另一个用户已经在他们的存储库中更新了有问题的文件,并将他们的更改推到公共上游回购 碰巧的是,你上次提交的合并冲突(可能)没有解决,所以你的文件没有被合并,因此文件的U(unmerged)标志。 所以现在,当你执行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

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

< p > 遥控器:A <- B <- C < < br > local: A <- B* < br > (*表示你有几个修改过但没有提交的文件)

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

< p > 选择一:抛弃这些更改 < br > 你可以对每个未合并的文件使用git checkout,也可以使用git reset --hard HEAD将分支中的所有文件重置为HEAD。顺便说一下,你们当地分行的HEAD是B,不带星号。如果选择此选项,图表将变为:

< p > 遥控器:A <- B <- C < < br > local: A <- B

现在,当您拖动时,您可以用来自master的更改快进您的分支。拉完之后,你的树枝看起来就像主人一样:

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

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

< p > & lt; & lt; & lt; & lt; & lt; & lt; & lt;头< br > //你的代码版本
= = = = = = = < br > //远程版本的代码
. // > > > > > > > < / p >

Git为您提供了两个版本的代码。HEAD标记中包含的代码是来自当前本地分支的版本。另一个版本是来自遥控器的东西。一旦你选择了一个版本的代码(并删除了其他代码和标记),你可以通过输入git add将每个文件添加到你的登台区域。最后一步是通过输入带有适当消息的git commit -m来提交结果。此时,我们的图表看起来是这样的:

< p > 遥控器:A <- B <- C < < br > local: A <- B <- C'

这里我把我们刚刚做的提交标记为C',因为它与远程上的提交C不同。现在,如果你尝试拉,你会得到一个非快进错误。Git不能在你的分支上播放远程中的更改,因为你的分支和远程都已经从共同的祖先提交b中分离出来了。在这一点上,如果你想拉,你可以在远程上执行另一个git mergegit rebase你的分支。

掌握Git需要能够理解和操作单向链表。我希望这个解释能引导您正确地思考如何使用Git。

有一个简单的解决办法。但要做到这一点,你首先需要学习以下内容

vimdiff

为了消除冲突,您可以使用

git mergetool

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

当合并发生冲突时,您可以打开单个文件。你会得到 “& lt; & lt; & lt; & lt; & lt; & lt; & lt;或者>>>>>>>"符号。这些是指您的更改和远程显示的更改。 您可以手动编辑所需的部分。 之后,保存文件,然后做: Git添加

合并冲突将得到解决。

如果你不想合并这些变化,并且仍然想要更新你的本地,那么运行:

git reset --hard HEAD

这将重置您的本地与HEAD,然后拉动您的远程使用git拉。

如果你已经在本地提交了你的合并(但还没有推送到远程),并且想要还原它:

git reset --hard HEAD~1

如果你想下拉一个远程分支在本地运行(比如为了检查或测试),当你$ 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)

我也有同样的问题 在我的例子中,步骤如下-

  1. 删除了所有以< em > U (unmerged)符号开始的文件。作为- - - - - -

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

$ git pull origin master
  1. 检查状态

 $ git status

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

< p > Unmerged路径:< br > (使用"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. 在head上提交更改

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

$ git push origin master

哪个回合可以用这个图像解决- enter image description here < / p >

只需执行以下命令:

git reset --hard

以下步骤:

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)
< p >谢谢, Sarbasish < / p >

如果你不想让你的本地分支发生任何变化,我认为这是最好的方法

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