我有一个旧的提交A.我现在处于提交B = HEAD!= A,并希望将我的工作目录的状态(包括未跟踪的文件)与A进行比较。
原因是当前未跟踪的文件是提交A
的一部分,因此它们不会显示出来,因此不会混乱,我想要的差异。
作为一种变通方法,我可以在差异之前手动git add <all the untracked files>
并在git reset <all the untracked files>
之后手动valueOf
。但是,有许多未跟踪的文件,我想以最大限度的原子性和健壮的方式执行此操作,因为我在脚本中执行所有这些操作。
编辑:This question也涉及对未跟踪文件的差异。但是,那里的答案需要手动添加和以后删除未跟踪的文件,我更喜欢一种解决方案,它可以更自动地以原子方式执行此操作,以防止脚本化上下文中断。接受的答案确实如此,并且确实与链接问题的答案不同。
答案 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;仅记录稍后将添加路径的事实。一个条目 路径放在没有内容的索引中。