Git pull提到我可以';找不到

Git pull提到我可以';找不到,git,git-pull,Git,Git Pull,我正试图从Git中获取错误: The following untracked working tree files would be overwritten by merge: :q Please move or remove them before you merge. 我既找不到此文件,也不知道它可能指的是什么,也不知道它为什么以: git diff显示它是一个新文件在我看来,在试图退出vi时,您键入的是:w:q而不是:wq。我不清楚为什么合并会破坏此文件,但如果它的存在确实是偶然的,则

我正试图从Git中获取错误:

The following untracked working tree files would be overwritten by merge:

:q
Please move or remove them before you merge.
我既找不到此文件,也不知道它可能指的是什么,也不知道它为什么以:


git diff显示它是一个新文件

在我看来,在试图退出vi时,您键入的是:w:q而不是:wq。我不清楚为什么合并会破坏此文件,但如果它的存在确实是偶然的,则可以安全地删除它

我不知道为什么找到它会有问题。但我不明白为什么

rm :q
(在工作树根目录中)无法解决问题,如果您确实知道这是一个垃圾文件(从注释中大大扩展;可能是一个答案,尽管原始问题中没有足够的信息来说明。)

首先,旁注:这是在Windows上吗?Windows对名称中带有冒号的文件有“问题”。(我尽可能避免使用Windows,对此我不确定,但我认为即使在那里创建这样的文件也是不可能的。)其他系统应该可以处理它,而且它不应该神秘地隐藏起来,但我将在下面探讨两种可能性

另一个旁注:
git pull
只需运行
git fetch
(从另一个git获取提交,并将它们放在
origin/master
等下的存储库中),然后是
git merge
(将您的
origin/master
中的提交合并到您自己的
master
)。我没有设置远程,所以在下面,我直接使用
git merge
,在我自己的存储库中使用一个命名的分支,而不是这些
origin/master
东西中的一个(它们很像分支,但至少不是真正的分支,因为git术语很糟糕)

查找命名奇怪的文件 你说你找不到
:q
文件,但是(a)不要提及你正在使用什么工具来查找它,(b)确实说
git diff
将一个名为
:q
的文件显示为一个新文件(同样没有引用实际的
git diff
输出,很难猜出你的意思)。这意味着您可以通过某些工具(而不是通常直接显示文件的工具)间接查看文件

作为一个实验,我创建了一个新的存储库,并在其中创建了几个虚拟文件和一个分支。在side分支中,我创建并提交了两个名为“有趣”的文件。其中一个具有四个字符的名称colon Q backspace backspace naive程序可以通过将
:Q
字符串写入显示器,然后将两个backspace写入显示器来“显示”此文件的名称,以便下一个字符覆盖冒号和小写-Q。下一个文件名可能会覆盖刚才显示的文件名。另一个“有趣的名称”文件是冒号Q space,它在屏幕上看起来像
:Q
,没有空格,因为屏幕的大部分空间都充满了空格,看起来就像空格一样。:-)

现在,这个特定系统上的
ls
命令并不是那么简单,因此运行
ls
我们得到:

$ ls
:q??    :q      README  file
屏幕上显示,但如果我运行
ls-C | expand
我会得到:

$ ls -C | expand
        :q      README  file
正如您所看到的,或者“看不见”可能是更好的措辞,名称中带有空格的文件似乎已经消失了,除了在文件列表的列中占据了一个位置。但我们知道它就在那里

通过
git status
如果现在运行
git status
,它会显示以下内容:

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    ":q\b\b"
    :q 

nothing added to commit but untracked files present (use "git add" to track)
同样,Git对backspaces做了一些巧妙的处理(ish),但是后面的空白被简单地复制到屏幕上(嗯,
Terminal
window),在那里它看起来与背景相同

从工作树中删除不需要的文件 要删除不需要的文件,我只需删除以冒号和q开头的所有文件:

$ rm :q*
$ ls
README  file
之后,
git merge sidebr
成功:

$ git merge sidebr
<git makes me enter a merge commit message>
Merge made by the 'recursive' strategy.
 ":q\b\b" | 1 +
 :q       | 1 +
 2 files changed, 2 insertions(+)
 create mode 100644 ":q\b\b"
 create mode 100644 :q 
这里发生的事情是Git专门处理以冒号开头的参数。为了解决此问题,我首先正常删除了文件:

$ rm :q*
然后让Git更新它知道的所有文件,其中当然包括这两个
:q
文件:

$ git add -u
现在,
git状态
显示:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    ":q\b\b"
    deleted:    :q 
由于您从
git merge
收到同样的投诉,一旦您实际从工作树中删除了不需要的文件,您的
git pull
git merge
会将其作为提交(而不是未跟踪)文件带回,您需要使用类似于上述两步过程的方法提交删除

完整性(无需阅读本节):为什么
git rm:q*
失败 这里有一个替代技巧,我在这里包括它以供说明。Git与名为
:q
等文件之间的问题不是空格,而是前导冒号

以冒号开头的pathspec:具有特殊含义。在缩写形式中,前导冒号:后面是零个或多个“魔术签名”字母(可选地以另一个冒号结尾:),其余的是与路径匹配的模式。“魔术签名”由ASCII符号组成,这些符号既不是字母数字、glob、regex特殊字符,也不是冒号。如果模式以不属于“魔术签名”符号集且不是冒号的字符开头,则可以省略终止“魔术签名”的可选冒号

在长格式中,前导冒号:后面是一个开括号(,一个由零个或多个“神奇单词”组成的逗号分隔列表,以及一个右括号),其余的是与路径匹配的模式

在这种特殊情况下,
:q
被视为:

  • 开始使用pathspec魔法(
    启动魔法)
  • DoNoMagic(
    q
    是字母数字,不是开括号,所以这是
    $ git add -u
    
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        deleted:    ":q\b\b"
        deleted:    :q 
    
    $ git commit -m 'remove icky colon-named files'
    [master 1e4e9f6] remove icky colon-named files
     2 files changed, 2 deletions(-)
     delete mode 100644 ":q\b\b"
     delete mode 100644 :q 
    
    git rm ./:q*