2013-04-25 60 views
1

我在git上提交了一個文件,它有幾個變化,但與舊文件沒有完全不同。 git並沒有挑出變化,而是做了一次大的刪除;整個文件和一個大插入;新文件。這是一個錯誤,顯然有很大的不變部分,例如該文件從一些「使用」語句開始,其中沒有任何變化。更正整個文件的Git替換

這很煩人,因爲這意味着我會失去所有的「責備」歷史。

有沒有辦法讓git重做diff?我能做些什麼來造成這種情況?發生這種情況時,我正在合併另一個分支。

+3

您確定這些行中沒有空白或行結束更改嗎? git diff --ignore-space-change是什麼意思? – 2013-04-25 13:34:20

+2

肯定會在文件內尋找不可見的字符變化(或類似轉換爲空格的製表符 – 2013-04-25 13:36:52

+0

Aha!由於某些原因合併了一些不同的行結尾已經在文件中結束了,Visual Studio發現它並建議我規範化...所以 – Stefan 2013-04-25 13:40:01

回答

0

Git不存儲差異,它只是爲每次提交存儲一個文件樹的版本。由git show創建的差異不是存儲在Git內部數據庫中的。

在你的情況,你可以看到該文件已被重命名,如果你使用的git diff

-M[<n>], --find-renames[=<n>] 
     Detect renames. If n is specified, it is a threshold on the similarity index (i.e. amount of addition/deletions compared to the file’s size). 
     For example, -M90% means git should consider a delete/add pair to be a rename if more than 90% of the file hasn’t changed. 

-M選項應該爲你做的伎倆。

+0

我的理解是,這隻適用於某一點,當提交被存儲時,它們原本是作爲完整的快照存儲的,然而,git經常運行壓縮算法並創建包文件,一旦發生這種情況,可能歷史提交將被存儲爲增量,而最新版本的快照將被原封不動地存儲。它們也會被添加爲完整的快照,直到packfile例程再次運行。 – 2013-04-25 14:31:40

+0

@JosephDeCarlo,是的,但我瘦了krcomblen正在討論語義,從這個觀點來看,Git只能處理快照。 – kostix 2013-04-25 14:42:51

+0

@kostix ahhh ...好點。當我讀到rcomblen的答案時,這讓我質疑我是如何知道它的工作原理的,所以我查了一遍,重新閱讀了這一章。一旦我證實我的記憶是正確的,我想我只是爲了清晰起見而發佈它。 – 2013-04-25 14:47:45