如何在不输入完整路径的情况下运行'git diff some/long/file/name'?

Kei*_*ein 7 git git-diff command-line-interface git-status

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

$ git status
M README.txt
M some/long/file/name
$ git diff some/long/file/name
Run Code Online (Sandbox Code Playgroud)

有没有办法,快速输入/ use_shortcat为长文件名而不复制它的名称(这个动作需要使用鼠标,它不像打字那么快)?也许是这样的git diff $2,$2从状态列表中第二个改变文件的位置......?

lex*_*x82 6

您还可以按照此答案*中的建议使用占位符。通常您不必像这样输入文件的全名

git diff -- **/name
Run Code Online (Sandbox Code Playgroud)

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

git diff -- *na*
Run Code Online (Sandbox Code Playgroud)

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


tim*_*kes 5

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

 myfunction() {
 git status --porcelain | sed -n "${1} s/^...//p' | xargs git diff
 }
 alias gd=myfunction
Run Code Online (Sandbox Code Playgroud)

然后我可以做

>> git status
M main.cpp
M tipsy.cpp
M other.cpp
>> gd 2
Run Code Online (Sandbox Code Playgroud)

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

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


Tim*_*Tim 4

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

在此输入图像描述 例如,如果 ga 是 git add 的别名,则不要输入以下内容:

$ ga assets/git_breeze/config* assets/git_breeze/install.sh You can
Run Code Online (Sandbox Code Playgroud)

请输入以下内容:

$ ga $e2 $e3 $e11 
Run Code Online (Sandbox Code Playgroud)

但 SCM Breeze 将 ga 别名为 git_add_shortcuts 函数,该函数足够智能,可以扩展整数和范围,因此您需要输入的只是:

$ ga 2 3 11
Run Code Online (Sandbox Code Playgroud)

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