【问题标题】:Contradicting Git Messages: Merge and Remove矛盾的 Git 消息:合并和删除
【发布时间】:2015-03-07 17:16:17
【问题描述】:

使用 Cloud9 并遇到问题,因为 .c9 文件夹已添加到 git。试图删除它。 Git 要求我在合并到主分支之前删除一个文件。当我尝试删除它时,git 告诉我该文件不存在。

erikvdw@blog:~/workspace (master) $ git merge Post_initial_setup
error: The following untracked working tree files would be overwritten by merge:
        .c9/metadata/workspace/.gitignore
Please move or remove them before you can merge.
Aborting
erikvdw@blog:~/workspace (master) $ git rm .c9/metadata/.gitignore --cache
fatal: pathspec '.c9/metadata/.gitignore' did not match any files

【问题讨论】:

    标签: git branch cloud9-ide


    【解决方案1】:

    由于您希望忽略整个 .c9 文件夹,因此将 .gitignore 文件保留在其中没有任何意义。只需在工作空间/repo 根文件夹中更新/创建 .gitignore 文件,并添加一行以忽略 .c9 文件夹。 (我假设你已经完成了,因为 git 说你的 .c9/metadata/.gitignore 文件未被跟踪)。

    发生错误是因为您已经提交了包含 .gitignore 文件的 .c9 文件夹。现在由于更新了全局 .gitignore 文件,当前的 .c9/metadata/.gitignore 未被跟踪,但之前它被跟踪。由于您不再想保留它,我认为删除 .c9/metadata/.gitignore 文件是安全的,而不仅仅是从 git 中删除(现在它不存在,因为它未被跟踪,因此出现错误),而是从文件系统中删除,所以rm .c9/metadata/.gitignore。 (或者您可能希望将其移动到 git 存储库之外的另一个文件夹)。对要取消跟踪的其他文件重复类似的步骤。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我过去也遇到过这个问题,我试图解决:

      error: The following untracked working tree files would be overwritten by merge:
      index.php
      Please move or remove them before you can merge.
      

      有人告诉我,发生这种情况的最常见原因是您进行了本地修改,导致无法合并。

      我读过一个解决方案是重置回头部:

      git reset --hard HEAD
      

      然后再次拉动:

      git pull
      

      您也可以考虑先提交或存储您自己的更改。

      看看Git pull - error: The following untracked working tree files would be overwritten by merge: 可能会有所帮助,它给了我一个很好的基本概念。

      【讨论】:

      • git reset --hard 将无济于事(至少在没有一些额外步骤的情况下不会),因为该文件是“未跟踪的”,即 git 在执行版本控制时不会以任何方式触及它操作,包括git reset。错误的发生正是因为 git not 版本控制文件,但您已要求 git 合并 git is 版本控制文件的提交,并且文件的版本控制版本与您当前的非控制版本不同。 Git 不能(或至少不会)尝试处理这种情况。
      【解决方案3】:

      TL;DR 回答:在您确定在这种情况下“正确”的含义之前,您无法正确解决此问题。

      我不清楚您是否想要这个.c9 子目录——或者更准确地说,它的部分或全部文件——被版本控制:

      因为 .c9 文件夹已添加到 git。

      ("它是添加的",但不是 任何人,它只是神秘地出现了!:-) 显然是某人或某物添加并提交了;谁和为什么?)同时:

      .c9/metadata/workspace/.gitignore

      此文件的存在表明您确实希望此处的文件中的至少一部分(但可能不是全部)1 受版本控制。

      通常,如果您确实希望这样做,您希望相应的 .gitignore 文件也受版本控制,即,它应该是“跟踪文件”,而不是“未跟踪的文件”。这样,克隆此存储库的每个人都将获得正确的 .gitignore 文件,以避免版本控制特定文件。

      (请记住,我对这个 Cloud9 IDE 一无所知,所以我无法判断在 .c9 中进行版本控制是个好主意还是坏主意。)

      如果您确实想要跟踪部分或全部.c9 并受版本控制,包括.c9/metadata/workspace/.gitignore,那么您只需添加并提交此文件(也许部分或全部其他.c9 文件)在您自己的分支中合并其他人的分支之前,他们还添加并提交了.gitignore 文件(可能还有部分或全部其他.c9 文件)。

      如果您希望它们被跟踪和版本控制,您需要:

      1. 找出其他人(另一个分支)为什么这样做:是故意的,还是他们的错误?
      2. 决定你的策略来解决这个问题:让他们修复它,还是自己修复它?

      然后根据步骤(2)的结果采取行动。


      1“可能”一词在这里是因为通常的做法是在目录中提交一个空的.gitignore 文件,只是为了强制 git 创建目录。一个空的 .gitignore 文件告诉 git,当 git 抱怨需要添加的未跟踪文件时,它应该抱怨的文件列表(即应该忽略)是空的。

      换句话说:“请抱怨未跟踪的文件,除了这个空的名称列表”=>“请抱怨所有未跟踪的文件”。在这种情况下,.gitignore 的存在是一个red herring:它被用作一个虚拟的空文件,只是为了创建目录的副作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-21
        • 1970-01-01
        • 2016-11-24
        • 1970-01-01
        • 2022-12-04
        • 1970-01-01
        • 2018-11-12
        相关资源
        最近更新 更多