仅对第一个文件进行git diff(所有未暂存的更改)

6

如果我执行 git diff,将得到所有未暂存文件的当前更改。

有没有更简单的方法来自动执行 git diff 只针对第一个列出的文件(使用内置的标志)?

我想到的最好方法是:

function git_diff_first_unstaged_file() {
    if [[ $(git diff --name-only) ]]; then
      git diff $(git diff --name-only | sed -n '1 p')
    else
      echo "gdf: There are currently no unstaged changes."
    fi
}
alias gdf='git_diff_first_unstaged_file'

我想知道是否有一个 git diff 的标识符可以帮我做到这一点。


1
没有标志。你的方法和任何其他方法一样好(或多或少:你可以通过仅运行一个 git diff --name-only | sed -n 1p,将输出保存在变量中,然后仅在有名称时对该保存的名称运行 git diff,以使其更加高效)。 - torek
1
我认为我可以只做 git diff $(git diff --name-only | sed -n 1p),但是 if 语句也不错。无论如何,感谢确认我的理智关于标志的可能性 :) - Nico
我必须问一下...你为什么想要这个? - Schwern
1
在我将代码添加到提交之前,我喜欢使用git diff查看所有更改的文件。我可以仅使用“git diff”,但通常情况下它太多了。与其执行“git status”并查看所有未暂存但已修改的文件,我可以只执行这个命令并自动diff第一个文件。我也为“git add”创建了一个类似的命令。 - Nico
2个回答

6
除了使用`git diff --name-only`之外,您还可以使用`git ls-files --modified`列出未暂存的文件(可与`| sed -1p`一起使用以获取第一个文件)。
请注意,如果您想要为第一个文件开始暂存差异,您可以选择简单地输入:
git add -p

您将看到并能够选择性地添加第一个文件的差异(然后是第二个文件,在此时,您可以键入 q 退出交互式暂存会话)。


哇!这太棒了,我不知道有这样的交互式会话存在。谢谢! - Nico

4

根据评论中的建议,可以将以下别名添加到~/.gitconfig(或项目配置文件)中,以便仅使用第一个未暂存但已跟踪的文件进行差异比较:

[alias]
    gdf = "! git diff $(git diff --name-only | sed -n 1p)"

如果你想要与第i个未暂存但已跟踪的文件进行区别,请按照以下步骤操作:
[alias]
    gdi= "!f() { git diff $(git diff --name-only | sed -n $1p); }; f" 

git gdi 3 将展示第三个文件未暂存的更改差异(如果少于3个文件,则显示最后一个文件)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接