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

And*_*imm 244 git diff

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

git diff --cached
Run Code Online (Sandbox Code Playgroud)

ara*_*nid 246

使用最近的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
Run Code Online (Sandbox Code Playgroud)

可悲的是,正如所指出的那样,git stash当你有一个--intent-to-add像这样的待处理文件时,你不能这样做.虽然如果你需要藏匿,你只需添加新文件然后存储它们.或者您可以使用模拟解决方法:

git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您有很多新文件怎么办,有没有一种简单的方法可以将它们全部添加然后进行比较? (2认同)
  • @Vic `git add -N 。` (2认同)

Har*_*old 85

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

git diff --no-index tracked_file untracked_file
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么你要跟踪一个跟踪文件和一个不相关的未跟踪文件.***如果你只想获得未跟踪文件的diff输出,你可以只使用[`/ dev/null`] (https://en.wikipedia.org/wiki/Null_device):`git diff --no-index - /dev/null <untracked_file>`. (37认同)
  • 是的,完美答案!然后我可以使用`git diff --no-index untracked_file_1 untracked_file_2`在diffs上获得`git diff`语法着色等......漂亮. (12认同)
  • 这应该是公认的答案 - 它不需要改变git的索引; 正如原作者所说,它有其缺点 (7认同)
  • 如果您有自上次提交后创建的多个未跟踪文件,这是否有效? (3认同)
  • 或者只是`cat untracked_file_1`,或者'printf'\ e [1; 32m%s\e [0m \n'"$(cat untracked_file_1)"`如果你真的需要绿色输出.:)(虽然更严重的是,请注意命令替换将从文件中删除尾随换行符.) (3认同)
  • 这实际上并没有回答这个问题。正如@user456814 所指出的,有 _no_ 第二个文件要比较 - 没有什么可以替换 `tracked_file`。 (3认同)

Jo *_*iss 36

对于我的交互式日常gitting(我将工作树始终与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
}
Run Code Online (Sandbox Code Playgroud)

键入d将包括差异中未跟踪的文件(这是我在工作流程中关心的),并且d args...将表现得像常规git diff.

笔记:

  • 我们在这里使用的事实git diff实际上只是单个差异串联,因此不可能d从"真正的差异"中告诉输出 - 除了所有未跟踪文件最后排序的事实.
  • 此功能的唯一问题是即使重定向输出也是彩色的; 但我不能为此添加逻辑而烦恼.
  • 我找不到任何方法来通过组装一个光滑的参数列表来获取未包含的文件git diff.如果有人想出如何做到这一点,或者如果某个功能git在未来的某个时刻被添加,请在这里留言!

  • 具有讽刺意味的是,我的git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt`解决方法我建议使用旧的gits*使用`git stash`,假设你的数据库中已经有e69de29bb,例如尝试以前使用`add -N`.显然它在某种程度上并不完全等同于`git add -N`:tbh我不确定如何. (4认同)
  • 顺便说一下,你正在用`test`命令执行字符串比较而不是数字相等检查.不应该影响任何东西,但``test'$#" - eq 0`更确切地说是预期的. (2认同)
  • 是的,看起来仍然需要成对执行...但是可以将其伪造为一个“less”,这样您就不必为每个文件按“q”,并且通过删除每个文件,感觉与“git diff”完全相同-文件分页(`-P`),之后添加回来(`| less`),保留颜色(`--color=always`)并将其解释为颜色(`less -r`或`less -R`) 。总的来说就是:`do git -P diff --color=always -- /dev/null "$i"; 完成 | 少-r` (2认同)

use*_*520 23

不是百分之百,但由于没有真正令人满意的答案,这里还有另一种;)如果文件没有跟踪,显然差异是整个文件,所以你可以用更少的方式查看它们:

less $(git ls-files --others --exclude-standard)
Run Code Online (Sandbox Code Playgroud)

用它们之间的导航:n和:p用于下一个和前一个..

  • 这个答案结合 git diff 是完美的解决方案。 (3认同)
  • 你也可以运行`git diff/dev/null <untracked_tile>`并以补丁格式获取补丁而不是"只是"一个文件 (2认同)
  • @TylerCollier 需要将“-z”添加到 git 命令中,将“-0”添加到“xargs”中。尽可能使用空终止,以避免诸如包含回车符或其他奇怪字符的文件名之类的错误(和安全漏洞!)。 (2认同)

Amo*_*ari 18

git add -A
git diff HEAD
Run Code Online (Sandbox Code Playgroud)

如果需要,生成补丁,然后:

git reset HEAD
Run Code Online (Sandbox Code Playgroud)

  • 通过添加所有内容,这可能会丢失之前的工作。特别是如果一个人经常使用 `git add -p` 的情况(顺便说一下,我通常建议这样做)......这确实提供了一种做基本事情的方法,它只是......应该注意的是,它可能会产生不良副作用。 (5认同)

ala*_*ock 13

使用此命令进行暂存和非暂存时更改工作.上传时新文件有效:

$ git diff HEAD
Run Code Online (Sandbox Code Playgroud)

如果它们没有暂存,您将只看到文件差异.

  • `HEAD`是[默认值](https://git-scm.com/docs/git-diff#git-diff-emgitdiffem--options--cachedltcommitgt--ltpathgt82308203),所以这与`git相同diff`没有解决问题. (21认同)
  • 这需要从每个未跟踪的文件中进行“ git add” (3认同)
  • 这并没有回答这个问题,这个问题是关于“未跟踪”,而不是“未上演” (3认同)

Ale*_*eno 9

这对我有用:

git add my_file.txt
git diff --cached my_file.txt
git reset my_file.txt
Run Code Online (Sandbox Code Playgroud)

最后一步是可选的,它会使文件处于先前状态(未跟踪)

如果您也要创建补丁也很有用:

  git diff --cached my_file.txt > my_file-patch.patch
Run Code Online (Sandbox Code Playgroud)


rad*_*mir 6

对于一个文件:

git diff --no-index /dev/null new_file
Run Code Online (Sandbox Code Playgroud)

对于所有新文件:

for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done;
Run Code Online (Sandbox Code Playgroud)

作为别名:

alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;"
Run Code Online (Sandbox Code Playgroud)

对于所有修改和新文件合并为一个命令:

{ git --no-pager diff; gdnew }
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常棒的答案!比公认的好得多! (2认同)