自相矛盾的 Git 条消息:合并和删除

Contradicting Git Messages: Merge and Remove

使用 Cloud9 时出现问题,因为 .c9 文件夹已添加到 git。试图删除它。 Git 要求我在合并到 master 分支之前删除一个文件。当我尝试删除它时,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

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

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: 可能会有帮助,它给了我一个很好的基本想法。

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

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

because the .c9 folder was added to git.

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

.c9/metadata/workspace/.gitignore

这个文件的存在说明你确实想要至少一些,但可能不是全部,1这里的文件受版本控制。

通常,如果您确实想要那个,您希望相应的.gitignore文件被版本控制为嗯,也就是说,它应该是 "tracked file",而不是 "untracked file"。这样每个克隆此存储库的人都将获得正确的 .gitignore 文件以避免版本控制特定文件。

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

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

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

  1. 找出其他人(另一个分支)这样做的原因:是故意的,还是他们的错误?
  2. 确定您的处理策略:让他们修复它,还是自己修复它?

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


1单词"maybe"在这里是因为通常的做法是在目录中提交一个空.gitignore文件只是为了强制git 创建目录。一个空的 .gitignore 文件告诉 git,当 git 抱怨需要添加的未跟踪文件时,它应该 而不是 抱怨——即应该忽略——是空的。

换句话说:"please do complain about untracked files, except for this empty list of names" => "please do complain about all untracked files"。在这种情况下 .gitignore 的存在是一个 red herring:它被用作虚拟空文件只是为了创建目录的副作用。

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

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

希望对您有所帮助。