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

git diff --cached

?


当前回答

对于一个文件:

git diff --no-index /dev/null new_file

对于所有新文件:

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

别名:

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

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

{ git --no-pager diff; gdnew }

其他回答

git add -A
git diff HEAD

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

git reset HEAD

更新:我的答案是阶段性和非阶段性的变化。不被追踪和不被追踪。查看已跟踪/未跟踪信息的可接受答案。留给子孙后代。

下面只会给你非阶段性的变化:

$ git diff

如果你想要阶段性和非阶段性的变化,在命令中添加HEAD:

$ git diff HEAD

使用git stash Hack:

# Stash unstaged changes
git stash --keep-index --include-untracked --message="pre-commit auto-stash"
git stash show --only-untracked stash@{0}
git stash pop

我需要在使用git stash(即预提交git钩子)的脚本上下文中使用这个。以下是我的完整工作示例: (在macOS Big Sur上的git v2.34.1上编写/测试)

# Stash unstaged changes
# NOTE: we always create a stash - possibly even a totally empty one.
git stash --keep-index --include-untracked --message="pre-commit auto-stash"
diffTracked=$(git diff --stat --staged stash@{0})
diffUntracked=$(git stash show --only-untracked stash@{0})
[[ $diffTracked || $diffUntracked ]] && {
  echo "Stashed diff:"
  # Ensure diffs have standard coloring:
  git diff --stat --staged stash@{0}
  git stash show --only-untracked stash@{0}
}

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

git diff --no-index tracked_file untracked_file

假设您没有本地提交,

git diff origin/master