是否可以要求git diff在其diff输出中包含未跟踪的文件,或者我最好在新创建的文件和我已编辑的现有文件上使用git add,然后使用:
git diff
git add
git diff --cached
?
我相信您可以通过简单地提供两个文件的路径来区分索引文件和未跟踪文件中的文件。
git diff --no-index tracked_file untracked_file
在最新的git版本中,你可以git add -N文件(或--intent-to-add),这将在该位置的索引中添加一个零长度的blob。结果是,您的“未跟踪”文件现在变成了一个修改,将所有内容添加到这个零长度文件中,并显示在“git diff”输出中。
git add -N
--intent-to-add
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 stash
git update-index --add --cacheinfo \ 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
(在这里设置别名是你的朋友)。
对于我的交互式日常获取(我一直将工作树与HEAD进行差异,并希望在diff中包含未跟踪的文件),add -N/--intent-to-add是不可用的,因为它休息时间 git stash。
add -N/--intent-to-add
这里是我的git diff替换。这不是一个特别干净的解决方案,但因为我真的只是交互地使用它,所以我可以接受一个hack:
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。
d
d args...
注:
git
假设您没有本地提交,
git diff origin/master
不是100%的重点,但如果出于某种原因,你不想把你的文件添加到索引中,这是另一个选择:
如果文件是未跟踪的,显然diff是整个文件,所以你可以用less查看它们:
less $(git ls-files --others --exclude-standard)
用:n和:p在它们之间导航,用于下一个和前一个..
: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
如果你想要阶段性和非阶段性的变化,在命令中添加HEAD:
HEAD
$ git diff HEAD
这对我来说很管用:
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
#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支持许多difftools。我配置“Meld Diff Viewer”为良好的GUI比较。
git add -A git diff HEAD
生成补丁,如果需要,然后:
git reset HEAD
对于一个文件:
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 }
使用可以暂存新文件和区分暂存文件的想法,您可以将这两者结合起来查看差异,我发现它使用起来很简单。
添加你想要查看diff的文件。您可以选择只添加那些想要查看差异的文件。
git stash && git add . && git stash pop
区分分级
git diff --staged
如果需要重置暂存文件
git reset
综上所述,
git stash && git add . && git stash pop && git diff --staged && git reset
使用git stash破解:
# Stash unstaged changes git stash --keep-index --include-untracked --message="pre-commit auto-stash" git stash show --only-untracked stash@{0} git stash pop
# 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} }