我如何 运行 'git diff some/long/file/name' 而不输入完整路径?

How can I run 'git diff some/long/file/name' without typing the full path?

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

$ git status
M README.txt
M some/long/file/name
$ git diff some/long/file/name

有什么方法可以快速 typing/use_shortcat 长文件名而不用复制文件名(这个操作需要使用鼠标,而且不像打字那么快)? 可能类似于 git diff ,其中 是状态列表中第二个更改的文件...?

仅:

git diff

或者:

git diff --cached

然后用键盘滚动。

This tool (SCM Breeze)可以做你需要的,具体看这部分文档

For example, if ga was your alias for git add, instead of typing something like:

$ ga assets/git_breeze/config* assets/git_breeze/install.sh You can

type this instead:

$ ga $e2 $e3 $e11 

But SCM Breeze aliases ga to the git_add_shortcuts function, which is smart enough to expand integers and ranges, so all you need to type is:

$ ga 2 3 11

我认为它比我在上面的评论中链接到的post

中的解决方案更符合您的需求

无需安装单独工具即可完成此操作的另一种方法是剥离 git 状态的输出,并通过 sed 将其通过管道传输,然后返回到 git diff。这是一个很长的命令,所以你可以把它放在你的 .bashrc 中并给它起别名。例如,将其放入我的 .bashrc:

 myfunction() {
 git status --porcelain | sed -n " s/^...//p' | xargs git diff
 }
 alias gd=myfunction

然后我可以做

>> git status
M main.cpp
M tipsy.cpp
M other.cpp
>> gd 2

并且输出是第二个文件的 git diff。

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

您也可以按照 this answer 中的建议使用 * 占位符。 通常你不必像这样输入文件的全名

git diff -- **/name

考虑到姓名的一小部分,例如"na",在修改文件列表中是唯一的,你也可以这样做:

git diff -- *na*

这样您就不必计算条目数来找出您想要比较的数字。

我找到了另一种方法(但是 "SCM Breeze" 很棒,是我的主要工具):我正在使用 https://github.com/junegunn/fzf 别名的模糊搜索:

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