場景:
- 階段檔案更改
- 對檔案進行更多更改
- 階段檔案更改
現在我很遺憾我上演了最后的更改,并希望回到檔案最初上演的方式。本質上,我想回滾最后一個階段的操作。
請注意,沒有提交任何內容,所有更改都只是暫存。
是否可以?
uj5u.com熱心網友回復:
這是可能的。這甚至不難。向 repo 添加一些東西將它添加到 repo,Git 不會清除任何最近有用的東西,除非人們非常明確地告訴它這樣做,但沒有人這樣做。
不過,我的第一次嘗試是看看是否git reset --patch -- the.file會這樣做。這使您可以將索引副本中的更改塊重置為您簽出的已提交副本中的更改塊;如果您正在取消暫存某些沒有覆寫您之前暫存的行并且現在想要回傳的內容,那么您就可以了。
此外,任何優秀的 Git 插件,以及任何中規中矩的程式員的編輯器都會有一個,可以在您的編輯器界面中正確執行此操作,我知道 vim 的逃犯和 emacs 的 magit,它們讓您可以在分階段的內容中編輯和整理大塊頭如果它們只是另一個檔案,并將提交的內容中的內容提取到您想要的任何位置。
但是,如果您的新更改觸及了您想要回傳的行中的內容,那么您想要回傳的內容不在您的作業樹或索引或提交的內容中。
為此,并且始終可以選擇在 repo 中進行一些輕微的探索。
添加的內容保留在.git/objects/??,型別標記和壓縮一些,直到 Git 重新打包,而且我記得 Git 默認情況下根本不會打包未參考的專案,它讓它們松散地散布,直到它們至少被未參考為止幾周,然后在下一次垃圾運行時將它們清理干凈。
find .git/objects/?? -type f -exec ls -t {} | awk -F/ '{print $3$4}'
將列出你的 repo 中的所有松散物件 id,這都是你在本地做的事情的結果,最近的。把它縮減成你關心的東西,
find .git/objects/?? -type f -exec ls -t {} \
| awk -F/ '{print $3$4}' | git cat-file --batch-check \
| awk '$2=="blob" && n <50'
將顯示您添加的最后 50 個 blob 的 ID、型別和大小。該串列中的頂部幾乎肯定是 oops,下一個大小相同的 blob 很可能是您之前添加的,git show看起來很可能的 id,直到您找到您想要的。然后,
git update-index --cacheinfo 100644,$thatid,that.file
(或 100755 如果它是一個可執行檔案)使索引入口點位于該內容而不是您的 oops。
uj5u.com熱心網友回復:
當您暫存檔案時,它會被寫入索引。再次登臺時,它會寫入索引,覆寫較早的版本。就是這樣。它消失了。
請參閱Git 中 HEAD、作業樹和索引之間的區別是什么?用于解釋索引以及它如何與 Git 世界的其他部分相適應。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/373766.html
標籤:混帐
上一篇:如何使用PowerShell查找特定檔案的git日志或提交歷史記錄
下一篇:如何使用gitlog--pretty=format:"...."獲取參考名稱?%d顯示refs,但都是相同的顏色
