关于工作树的git diff,包括未跟踪的文件

时间:2017-09-13 16:35:44

标签: git diff

我有一个旧的提交A.我现在处于提交B = HEAD!= A,并希望将我的工作目录的状态(包括未跟踪的文件)与A进行比较。

原因是当前未跟踪的文件是提交A的一部分,因此它们不会显示出来,因此不会混乱,我想要的差异。

作为一种变通方法,我可以在差异之前手动git add <all the untracked files>并在git reset <all the untracked files>之后手动valueOf。但是,有许多未跟踪的文件,我想以最大限度的原子性和健壮的方式执行此操作,因为我在脚本中执行所有这些操作。

编辑:This question也涉及对未跟踪文件的差异。但是,那里的答案需要手动添加和以后删除未跟踪的文件,我更喜欢一种解决方案,它可以更自动地以原子方式执行此操作,以防止脚本化上下文中断。接受的答案确实如此,并且确实与链接问题的答案不同。

2 个答案:

答案 0 :(得分:3)

正如其他人所建议的那样,您可以使用git add -N向索引添加虚拟条目。运行:

git diff <hash>
然后,

将使用现有索引(现在具有未跟踪文件的条目)将给定与当前工作树进行比较,以确定要与给定<hash>({{1}进行比较的工作树版本可以是提交ID,树ID,分支名称,或Git可以解析为树的任何东西)。但这确实搞乱了指数,正如你所说,你:

  

希望以最大限度的原子性和健壮的方式做到这一点

诀窍是使用临时索引。

此处的初始提交包含文件<hash>bar;第二次提交已删除文件foo。当前工作树已复活foo并有一个新文件,如foo所示。

git status --short

请注意,初始提交是$ git log --all --decorate --oneline --graph * 11b241c (HEAD -> master) remove foo * 8527327 initial $ git status --short A diffscript A foo ,这是我们作为参数传递给8527327的内容:

diffscript

$ ./diffscript 8527327 diff --git a/diffscript b/diffscript new file mode 100755 index 0000000..8d5c978 --- /dev/null +++ b/diffscript @@ -0,0 +1,6 @@ +#! /bin/sh +export GIT_INDEX_FILE=$(mktemp) || exit +rm -f $GIT_INDEX_FILE +trap "rm -f $GIT_INDEX_FILE" 0 1 2 3 15 +git add -A +git diff ${1:-HEAD} index 3ec370c..d319048 100644 --- a/foo +++ b/foo @@ -1 +1 @@ -I am a foo +I was foo, am now resurrected 默认为diffscript区分。因此,如果我们在没有参数的情况下运行它,我们会将commmit HEAD与index / work-tree进行比较(因为我们11b241c 无论我们是否比较索引或工作树,此时:它们本质上是相同的,模git add -A指令。)

.gitignore行确保我们删除临时索引,无论脚本是由^ C(信号2,SIGINT)终止,还是网络断开(信号1,SIGHUP)或QUIT(信号3, SIGQUIT)或TERMINATE(信号15,SIGTERM),或者只是正常退出(0,不是信号,只是正常终止)。

令人讨厌的是,Git坚持认为该文件根本不存在,或者有一个索引文件签名 - 不允许空文件 - 所以我们删除临时文件trap ... make,以便{{1}步骤可以使用正确的签名创建它。

答案 1 :(得分:1)

你可以看看:

git add --intent-to-add(与git add -N相同)

这只会在索引中追加一个空条目,而不是文件本身。使用diff命令时会出现差异。

GIT文档:

  

- 意图添加

     

除其他外,这对于显示未暂停的内容非常有用   这些文件使用git diff并使用git commit -a提交它们。&gt;仅记录稍后将添加路径的事实。一个条目   路径放在没有内容的索引中。