我可以在未跟踪的文件上使用git diff吗?

是否有可能要求git diff在其diff输出中包含未跟踪文件? 或者是我最好的选择git添加我创建的新文件和我编辑和使用的现有文件

git diff --cached


使用最近的git版本,你可以git add -N文件(或--intent-to-add ),它将零长度的blob添加到该位置的索引处。 结果是,你的“未跟踪”文件现在成为一个修改,将所有内容添加到这个零长度文件中,并显示在“git diff”输出中。

git diff

echo "this is a new file" > new.txt
git diff

git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file

可悲的是,正如你指出的,当你有一个像这样挂起文件的--intent-to-add时,你不能git stash 。 虽然如果您需要隐藏,您只需添加新文件然后储存它们。 或者您可以使用仿真解决方法:

git update-index --add --cacheinfo 
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt

(在这里设置别名是你的朋友)。


我相信你可以通过简单地将路径提供给两个文件来区分索引和未跟踪文件中的文件。

git diff --no-index tracked_file untracked_file

对于我的交互式日常检查(我始终将工作树与HEAD进行比较,并且想要在diff中包含未跟踪的文件), add -N/--intent-to-add是不可用的,因为它打破了git stash

所以这是我的git diff替换。 这不是一个特别干净的解决方案,但是因为我真的只是交互式使用它,所以我可以用黑客来做:

d() {
    if test "$#" = 0; then
        (
            git diff --color
            git ls-files --others --exclude-standard |
                while read -r i; do git diff --color -- /dev/null "$i"; done
        ) | `git config --get core.pager`
    else
        git diff "$@"
    fi
}

只要输入d就会在diff中包含未跟踪的文件(这是我在工作流程中关心的),并且d args...将像常规git diff一样运行。

笔记:

  • 我们在这里使用的事实是, git diff实际上只是个别差异级联,所以不可能从“真正差异”中告诉d输出 - 除了所有未跟踪文件最后排序的事实。
  • 这个函数唯一的问题是即使重定向,输出也是彩色的。 但我不能为此添加逻辑。
  • 我找不到任何方式通过为git diff组装一个漂亮的参数列表来获得未包含的文件。 如果有人想知道如何做到这一点,或者将来某个时候某个功能被添加到git中,请在此留言!
  • 链接地址: http://www.djcxy.com/p/57225.html

    上一篇: Can I use git diff on untracked files?

    下一篇: Git: list only "untracked" files (also, custom commands)