正如其他人所建議的,您可以使用git add -N
向該索引添加虛擬條目。跑步:
git diff <hash>
來比較給定當前的工作樹,利用現有的指數(現在有條目未跟蹤文件),以決定哪些工作樹的版本進行比較,以給定的<hash>
(<hash>
可能是提交ID,樹ID或分支名稱,或Git可以解析爲樹的任何東西)。但是,這確實惹的索引,如你所說,你:
想這樣做的最大的原子和穩健的方式
的技巧是使用,取而代之的是,臨時索引。
此處的初始提交文件爲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
默認版本比較反對HEAD
。因此,如果我們不帶參數運行它,我們會commmit 11b241c
比較索引/工作樹(因爲我們git add -A
它大多不要緊,我們是否比較指數或工作樹,在這一點:他們基本上是相同的,模.gitignore
指令)。
trap ...
行確保我們刪除臨時索引,腳本是否被^ C(信號2,SIGINT)或網絡斷開連接(信號1,SIGHUP)或QUIT(信號3,SIGQUIT)終止或TERMINATE(信號15,SIGTERM)或正常退出(0,不是信號,只是正常終止)。令人煩惱的是,Git堅持認爲該文件根本不存在,或者有一個索引文件簽名 - 一個空文件是不允許的 - 所以我們刪除臨時文件mktemp
使,這樣git add
步驟可以創建它與正確的簽名。
可能的重複[我可以在未跟蹤的文件上使用git diff?](https://stackoverflow.com/questions/855767/can-i-use-git-diff-on-untracked-files) –
那麼' git add -N。; git diff HEAD..HEAD〜1'? –
@SajibKhan:其實,事實證明,工程(所以我刪除評論)。但是對於這個特定的目的(腳本)有一個更好的方法。 – torek