我們知道可以使用git reflog恢復資料,那麼git是怎麼實現的呢?另外,哪些資料可以恢復,哪些資料不可以恢復呢?
比如我們git reset --hard head^
將最近的一次commit丟棄,我們可以用git reflog找到丟棄commit的指標,所以我們就可以恢復。
git reflog
fb1c75a head@: reset: moving to head^
a35a7ea
然後可以根據此commit新建乙個分支用來恢復:
git branch zhc_branch a35a7ea
git會在每次head改動時,將資訊悄悄的儲存下來,儲存到**了呢?在.git/logs資料夾裡。注意這個資料夾的作用域時local的。
那麼有人可能要問,如果將.git/logs資料夾刪除,那麼是不是不能恢復資料了呢?答案是否定的,因為如果git reflog沒有了那個commit物件的指標,我們可以自己找到那個指標,不過要費一些勁兒。
git fsck可以檢查倉庫的完整性,如果加上--full選項,則會展示
所有未被其他物件引用的所有物件。所以可以使用此命令找到dangling的物件,然後從中找到一些端倪。
git fsck --full
checking object directories: 100% (256/256), done.
checking objects: 100% (6/6), done.
dangling commit a35a7ea3f7b55be91743c708d150b573116515ec
dangling commit f1277861604401d5092707d520f81a4dc1774898
可以看到有兩個dangling物件,然後根據此hash值用cat-file -p判斷是否是我們要找到的那個commit,然後恢復即可。
有人又要問了,如果把這些dangling物件都刪除,那還能恢復嗎?
比如git prune --expire now
哦,這個,如果沒有其它備份,恐怕很難了。。。
原文:hongchangfirst
hongchangfirst的主頁:
深入理解Git 一 元資料
三分鐘教你學git僅僅是教我們會用git了,但是內部的一些實現原理假設我們也知道一些的話會使我們使用起來更加順手。這個系列就是在你用了git一段時間之後,並想繼續到git的內部看一下到底而準備的。git倉庫是依據什麼知道倉庫的元資訊呢?我們首先git init,git會在資料夾下建立乙個.git的隱...
深入理解緩衝區(七)
資料緩衝區塊 位址連續的 多個快取塊的組合。記憶體中真正的資料存放區。緩衝區的組成之一。快取塊 最小的快取資料塊的快取單位。被資料快取塊包含。4.1.4.1 buf的整體結構 在src backend storage buffer buf init.c中有initbufferpool函式,描述了基本...
深入理解程序(七) 程式替換
用乙個新的程式去替換乙個程序正在排程的程式的資訊。程序執行乙個程式時,我們需要將該程式載入到記憶體中,然後再通過該程序的虛擬位址空間利用頁表對映到資料實際上存放的物理記憶體中,通過這樣的方式,就實現了程序與程式之間的關聯。如果我們此時將另乙個程式載入到記憶體中,然後修改這種對映關係 也就是修改頁表 ...