如何运行';git diff some/long/file/name';没有输入完整路径?

如何运行';git diff some/long/file/name';没有输入完整路径?,git,command-line-interface,git-diff,git-status,Git,Command Line Interface,Git Diff,Git Status,在我的工作流中,我经常运行以下命令对: $ git status M README.txt M some/long/file/name $ git diff some/long/file/name 是否有任何方法可以快速键入/在不复制长文件名的情况下对长文件名使用_shortcat(此操作需要使用鼠标,并且不像键入那么快)? 可能类似于git diff$2,其中$2是状态列表中的第二个更改文件…?仅: git diff 或: 然后用键盘滚动。可以做您需要的事情,具体请参见文档的这一部分 例

在我的工作流中,我经常运行以下命令对:

$ git status
M README.txt
M some/long/file/name
$ git diff some/long/file/name
是否有任何方法可以快速键入/在不复制长文件名的情况下对长文件名使用_shortcat(此操作需要使用鼠标,并且不像键入那么快)? 可能类似于
git diff$2
,其中
$2
是状态列表中的第二个更改文件…?

仅:

git diff
或:

然后用键盘滚动。

可以做您需要的事情,具体请参见文档的这一部分

例如,如果ga是git add的别名,而不是键入 比如:

$ ga assets/git_breeze/config* assets/git_breeze/install.sh You can
请键入以下内容:

$ ga $e2 $e3 $e11 
但是SCM Breeze将ga别名为git_添加_快捷方式 函数,它足够聪明,可以扩展整数和范围,所以 您需要键入的是:

$ ga 2 3 11

我认为它比我在上面的评论中链接到的帖子中的解决方案更适合您的需要

另一种不需要安装单独工具的方法是剥离git状态的输出,通过sed将其传输,然后返回git diff。这是一个很长的命令,因此您可以将其放入.bashrc并将其别名。例如,将其放在my.bashrc中:

 myfunction() {
 git status --porcelain | sed -n "${1} s/^...//p' | xargs git diff
 }
 alias gd=myfunction
那我就可以了

>> git status
M main.cpp
M tipsy.cpp
M other.cpp
>> gd 2
输出是第二个文件的git diff


编辑:我将两个SED合并为一个,因为有两个单独的SED是愚蠢的。

您也可以使用中建议的占位符。 通常您不必像这样键入文件的全名

git diff -- **/name
鉴于名称的一小段(例如“na”)在修改文件列表中是唯一的,您还可以执行以下操作:

git diff -- *na*
通过这种方式,您不必计算条目数来找出您想要区分的数字。

我找到了另一种方法(但“SCM Breeze”非常棒,是我的主要工具):我正在使用别名模糊搜索:

alias gfz="git status -s --porcelain  | cut -c 4- | fzf"
git diff $(gfz)

这可能是重复的不是这个问题的答案,当你编辑了很多文件OK时,它不起作用。我从一开始就不知道这一点。它帮了我一些小的改变。太棒了!那是我需要的。非常感谢你,蒂姆。谢谢你的回答,这看起来真的很有用。我一直在想类似的事情。谢谢你的回答。
alias gfz="git status -s --porcelain  | cut -c 4- | fzf"
git diff $(gfz)