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

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

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 

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

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

 git diff --no-index tracked_file untracked_file 

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

所以这里是我的git diffreplace。 这不是一个特别干净的解决scheme,但因为我真的只交互使用它,所以我可以用黑客来做:

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

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

笔记:

  • 我们在这里使用的事实是, git diff实际上只是单独的diffs连接,所以不可能从“真正的差异”告诉d输出 – 除了所有未跟踪文件最后sorting的事实。
  • 这个函数的唯一问题是,即使redirect,输出也是彩色的。 但我不能为此添加逻辑。
  • 我找不到任何方法来获取未包装的文件,只是为git diff组装一个漂亮的参数列表。 如果有人想知道如何做到这一点,或者将来某个时候某个function被添加到git中,请在这里留言!

使用此命令进行分段和非分段时,更改将工作。 新文件在上演时工作:

 $ git diff HEAD 

如果他们不上演,你只会看到文件的差异。

不是100%,但由于没有真正令人满意的答案,在这里还有另外一种;)如果文件未被跟踪,显然差异是整个文件,所以你可以用较less的查看它们:

 less $(git ls-files --others --exclude-standard) 

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

这对我有用:

 git add my_file.txt git diff --cached my_file.txt git reset my_file.txt 

最后一步是可选的,它将使文件保持前一状态(未跟踪)

如果你也在创build一个补丁,

  git diff --cached my_file.txt > my_file-patch.patch 

通常当我与远程位置团队合作,对于我来说很重要,我有事先知道在同一个文件中的其他团队所做的更改之前,我遵循git阶段untrack – > staged – >承诺为此,我写了一个bash脚本帮助我避免不必要的解决与远程团队的合并冲突或者使新的本地分支在主分支上进行比较合并

 #set -x branchname=`git branch | grep -F '*' | awk '{print $2}'` echo $branchname git fetch origin ${branchname} for file in `git status | grep "modified" | awk "{print $2}" ` do echo "PLEASE CHECK OUT GIT DIFF FOR "$file git difftool FETCH_HEAD $file ; done 

在上面的脚本中,我获取远程主分支(不需要它的主分支)到FETCH_HEAD他们做我的修改文件的列表,并比较修改后的文件git difftool

这里有很多由git支持的difftool,我configuration了“Meld Diff Viewer”,以便进行良好的GUI比较。

假设你没有本地提交,

 git diff origin/master