我可以在未跟踪的文件上使用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
中,请在此留言! 上一篇: Can I use git diff on untracked files?
下一篇: Git: list only "untracked" files (also, custom commands)