【问题标题】:Why does git say "Pull is not possible because you have unmerged files"?为什么 git 会说“无法拉取,因为您有未合并的文件”?
【发布时间】:2021-04-02 18:36:04
【问题描述】:

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

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

【问题讨论】:

  • 就我而言,我只使用了这些命令“git add”。然后是 "git commit -m "Test",最后是 "git push"。错误已删除
  • 您只需要添加“$ git add ”...更新将提交或恢复的内容(丢弃工作目录中的更改)然后提交“$ git commit”,然后“ $git push" 以结束合并。
  • 如果有帮助:我注意到只是在执行“git add”。然后提交没有用。我必须按名称添加单个文件,然后提交并拉/推。

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


【解决方案1】:

目前发生的情况是,您有一组文件,您之前尝试过合并这些文件,但它们引发了合并冲突。 理想情况下,如果遇到合并冲突,他应该手动解决它们,并使用git add file.name &amp;&amp; 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

【讨论】:

  • 为了完整起见,我将添加@Pawan 的答案以使用“git mergetool”来解决冲突。倒数第二个步骤可能不太实用(“解决合并...[通过设置]...其内容为:[某些文本]”)。
  • 或者,您可以使用@user261 的建议进行合并。无论哪种方式,我认为添加一个关于如何在实际意义上合并的步骤将完成这个答案。
  • 当您有简单的冲突要修复单个文件时,此答案非常有效。例如,一两行不同的代码。如果您有多个文件被大量修改,这是一个困难的修复。但这让我们意识到,使用 Git 时,您应该经常提交以避免困难的冲突。
【解决方案2】:

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

远程:A
本地:A
(*表示您有多个文件已修改但未提交。)

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

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

远程:A
本地:A

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

本地:A

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

// 你的代码版本
=======
// 遥控器的代码版本
>>>>>>>

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

远程:A
本地:A

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

掌握 Git 需要能够理解和操作单向链表。我希望这个解释能让你在正确的方向上思考如何使用 Git。

【讨论】:

    【解决方案3】:

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

    git reset --hard HEAD  
    

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

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

    git reset --hard HEAD~1 
    

    【讨论】:

      【解决方案4】:

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

      vimdiff
      

      要消除冲突,您可以使用

      git mergetool
      

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

      【讨论】:

      • 我会说 vimdiff 是 not 必需的(您可以使用您选择的任何合并/差异工具,例如 WinMerge 或 OSX 的内置 FileMerge 等) .话虽如此,这是对@mu 答案的一个很好的补充。
      【解决方案5】:

      如果您想拉下远程分支以在本地运行(例如出于审查或测试目的),并且当您 $ 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)
      

      【讨论】:

        【解决方案6】:

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

        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
        • 请注意,我不是 OP。 “合并文件”是不恰当的术语。严格来说,你合并的是提交,而不是文件。
        • 啊是的,这是真的,我的道歉。我试图给出一个简单的答案
        • 好吧,如果您在合并提交时发生冲突,那么是的,您将有冲突的、未合并的文件,您需要合并它们。
        【解决方案7】:

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

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

        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)
        您有未合并的路径。
        (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
        

        这张图片可以解决哪个转弯问题 -

        【讨论】:

          【解决方案8】:

          要遵循的步骤:

          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)
          

          谢谢, 萨巴什

          【讨论】:

            【解决方案9】:

            如果您不想更改任何本地分支,我认为这是最好的方法

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

            【讨论】:

              【解决方案10】:

              当发生合并冲突时,您可以打开单个文件。你会得到 “>>>>>>>”符号。这些是指您的更改以及远程上存在的更改。 您可以手动编辑所需的部分。 之后保存文件,然后执行: 混帐添加

              合并冲突将得到解决。

              【讨论】:

                【解决方案11】:

                只需运行以下命令:

                git reset --hard
                

                【讨论】:

                • 您应该解释一下该命令的作用,因为有些人如果尝试发现它删除了他们当前的所有本地更改,将会非常失望:/
                • 如果您只是将更改复制到外部临时源,则此方法有效。如果您只有几个文件,例如项目的配置文件,那是完美的。执行命令,然后恢复您的更改。为我工作!
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2020-10-25
                • 2011-12-24
                • 1970-01-01
                • 2018-06-17
                • 1970-01-01
                相关资源
                最近更新 更多