2012-05-27 28 views
2

我有一個問題,它類似於How to undo 'git add' before commit?,但有一個重要的區別:如何撤消「git add」保留以前的階段版本? (是否該指數具有歷史?)

背景:

我快一些代碼正在生成的文件,我會完成後添加到我的存儲庫。生成這些文件的代碼是新代碼,並且在不斷變化的過程中,所以我有時會多次運行它,並進行更改。

一路上,我將生成的文件添加到索引,所以他們將爲最後的一個大提交做好準備。這也使我能夠檢查我的代碼更改是否會在輸出中創建更改,如果是這樣,那些更改是什麼。但是......我意外地在Changes to be committed部分(作爲new fileChanges not staged for commit部分(如modified)出現過的文件上意外地運行了另一個git add。我的意思是運行一個git diff,但我滑倒並重新添加它,所以現在我沒有辦法區別它(我知道),所以...

問題:

有沒有辦法撤消剛剛過去的分期手術,使得先前添加的版本仍然/同樣可以在索引,修改後的文件將再次在我的工作樹,讓我可以區別嗎?

所有這些都沒有承諾或任何事情,因爲我的目標是在完成這一小小一輪的開發時一起完成所有任務。我真的很喜歡git可以正常顯示我對新文件的更改,然後他們承諾......但是......我錯過了一個機會,現在想知道是否有辦法讓它恢復。 ?

到目前爲止,我查找的東西似乎能夠讓我回到最後一次提交(無文件)或文件的當前狀態(無論如何),但不是中間的從索引轉到以前的版本,這從來都不是提交的一部分。任何暗示,即使這是否可能(甚至是一個堅實的答案,它不是,最好有解釋爲什麼這種情況),將不勝感激。

回答

3

有沒有直接的方式來到達文件的最後階段版本。沒有索引文件的版本,這就是你應該使用提交。在將來,您可以考慮更頻繁地進行臨時提交(例如,使用commit --amend),然後至少以前的版本將存儲在您的推薦日誌中(例如git log -g)。

但是,所有文件的分階段版本都將被添加到git對象數據庫。您應該能夠通過git fsck --lost-found找到它們。這將把所有「晃來晃去」的斑點寫入.git/lost-found/other。不幸的是,他們不會以任何特定的順序,或有他們的原始文件名,但任何丟失的斑點應該在那裏。

+1

如果您可以識別添加的時間窗口,並且在添加之前「最近添加」,如果您可以區分之後的內容,那麼時間戳記對於回購對象文件可以提供幫助。 – jthill

+0

是的,我同意,始終運行git commit永遠不會傷害你。這就是git的意圖。 –

+0

謝謝。至於頻繁的提交,這隻發生在幾秒鐘的事情上,真的......我經常做相當*的提交,儘管經常做更多*,而使用--mend可能是有道理的。 --lost-found選項也可能有幫助,所以非常感謝!我已經開始了,但是這聽起來可能會讓我在當時想要的東西。謝謝。 – lindes