2014-09-03 68 views
5

通過查看brackets-git(用於Brackets的git擴展)的源代碼,我看到在調用git diff時,^!(插入符號)正被追加到提交哈希。見GitCli.js, line 754在調用git diff時,提交hash後做了什麼?(^!)?

function getDiffOfFileFromCommit(hash, file) { 
    return git(["diff", "--no-ext-diff", "--no-color", hash + "^!", "--", file]); 
} 

這相當於在命令行下,使用有問題的文件爲例:

$ git diff --no-ext-diff --no-color 1f9ea6e^! -- src/git/GitCli.js 

我知道^要提到的提交的父。 ^!做什麼?

+3

對於[git rev-parse](http://git-scm.com/docs/git-rev-parse)文檔中提到的所有提交方式,都有很好的指導。在這種情況下,我相信:「r1 ^!包含提交r1但排除其所有父母。」 – Charlie 2014-09-03 18:57:27

+0

從測試中,輸出似乎與調用差異並將其所有父項作爲參數完全相同。我不知道在分析多個樹時(從代碼註釋,它應該是一個錯誤)什麼git做。也許它與父母的合併基礎有一些魔力? – knittl 2014-09-03 19:59:32

回答

5

commit^!是一個範圍說明符,意思是:這個提交,但沒有其父母。 這相當於指定:commit ^parent1 ^parent2 ^parentN

對於差異這沒有任何意義(您只能比較兩棵樹) 從測試該命令似乎顯示父母的合併基礎和最後一個父母之間的差異。我認爲git(mis)解釋類似於範圍A...B的參數,這將顯示merge-base A BBgit diff parent1...parent2將產生相同的差異)之間的差異。不知道在章魚合併的情況下會發生什麼。

雖然我可能是錯的,但這些只是我從測試存儲庫中抽取的一些假設,並查看了git代碼(builtin/diff.c)。

+1

事實上,它的記錄在這裏:http://git-scm.com/docs/git-rev-parse – maartencls 2014-09-03 20:16:12

+0

「r1^@符號表示r1的所有父母。** r1 ^!包含提交r1但排除其所有的父母。**「 – maartencls 2014-09-03 20:16:53

+0

@maartencls:是的,我知道 - 見我答案的第一句話。範圍對'git diff'沒有意義,因爲它只能用於端點。這個範圍(承諾,但沒有父母)特別是不能保證有正好兩個端點,所以混帳得到混淆 – knittl 2014-09-04 05:34:43

相關問題