Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么'git diff'自动完成的是分支而不是文件_Git_Bash_Autocomplete - Fatal编程技术网

为什么'git diff'自动完成的是分支而不是文件

为什么'git diff'自动完成的是分支而不是文件,git,bash,autocomplete,Git,Bash,Autocomplete,在SO而非webapps StackExchange中发布此内容,因为我知道它属于git,但我不确定它是否也涉及GitHub 假设我的机器上有一个repofoo,位于/home/user/foo,这是我当前的工作目录,我在repo中有一个文件:/home/user/foo/main.sh 我正在处理master分支(虽然我不确定我在哪个分支上有什么关系),我对main.sh做了一些更改。我只想查看对此文件所做的更改,因此我输入: $ git diff ma<tab> $git di

在SO而非webapps StackExchange中发布此内容,因为我知道它属于
git
,但我不确定它是否也涉及
GitHub

假设我的机器上有一个repo
foo
,位于
/home/user/foo
,这是我当前的工作目录,我在repo中有一个文件:
/home/user/foo/main.sh

我正在处理
master
分支(虽然我不确定我在哪个分支上有什么关系),我对
main.sh
做了一些更改。我只想查看对此文件所做的更改,因此我输入:

$ git diff ma<tab>
$git diff ma

为什么这会自动完成到
master
而不是
main.sh
?实际上,更合理地说,我认为它根本不应该自动完成,因为只有两个字母
ma
,它是不明确的。我查看了
git diff
手册页上的描述,但我没有看到任何关于一个优先于另一个的内容

git diff的手册页包含以下内容:

git diff[--选项][-][路径…]

因此,如果您要查找文件/路径的git diff,则应该遵循
--
(双连字符)。您会发现,如果执行
git diff--ma
,它将自动完成为文件名,而不是分支

git diff $branch
git diff -- $filePath

与GitHub完全无关。与Git的连接有点脆弱:所有bash自动完成都是在bash本身中完成的。由编写自动完成的人决定如何实现它。根据下面的xbonez回答,他们似乎使用了
--
来决定是将下一个参数作为分支名称(这是一个有效的提交选择器)还是路径名称。对了,明白了。是的,我在手册上看到了。我猜答案是,即使
git diff$filePath
不正确,
git
也“知道”您当时的意思(如果没有具有相同前缀的分支),因此它会自动完成文件。