是否有可能要求git diff在其diff输出中包括未跟踪的文件,或者我最好的选择是使用git添加新创建的文件和我编辑过的现有文件,然后使用:
git diff --cached
?
是否有可能要求git diff在其diff输出中包括未跟踪的文件,或者我最好的选择是使用git添加新创建的文件和我编辑过的现有文件,然后使用:
git diff --cached
?
当前回答
不是100%的重点,但如果出于某种原因,你不想把你的文件添加到索引中,这是另一个选择:
如果文件是未跟踪的,显然diff是整个文件,所以你可以用less查看它们:
less $(git ls-files --others --exclude-standard)
在它们之间导航:n和:p为下一个和前一个..
从评论更新:如果你需要一个补丁格式,你也可以结合git diff:
git ls-files --others --exclude-standard -z | xargs -0 -n 1 git --no-pager diff /dev/null | less
在这种情况下,还可以将输出重定向到文件或使用其他diff命令。
其他回答
假设您没有本地提交,
git diff origin/master
我相信您可以通过简单地提供两个文件的路径来区分索引文件和未跟踪文件中的文件。
git diff --no-index tracked_file untracked_file
使用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 add my_file.txt
git diff --cached my_file.txt
git reset my_file.txt
最后一步是可选的,它将使文件保持之前的状态(未跟踪)
如果你正在创建一个补丁也有用:
git diff --cached my_file.txt > my_file-patch.patch
对于一个文件:
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 }