我在進(jìn)行一個(gè) Git 的常用操作 - rebase 時(shí),遇到了一個(gè)致命錯(cuò)誤,導(dǎo)致開發(fā)分支上的commit丟失?;艔埖耐瑫r(shí),由于相信 Git 提供了保險(xiǎn)措施,我找到了恢復(fù)丟失的 commit 的方法。這里記錄一下。
我進(jìn)行的這個(gè) rebase 操作是 Git 分支管理中很常見的一個(gè)操作:
我在一個(gè)分支上做一個(gè) feature 的開發(fā),這個(gè)分支叫做:dev。另外有 master 分支與預(yù)發(fā)布的分支同步。當(dāng)有一個(gè)功能需要快速開發(fā)并上線時(shí),我會(huì)切換到 master 分支進(jìn)行代碼編寫并合并到預(yù)發(fā)布分支,然后切換回當(dāng)前的開發(fā)分支:dev。切過去之后需要將 master 的最新修改合并到 dev ,使用 git rebase master 來實(shí)現(xiàn)。當(dāng) rebase 時(shí)遇到?jīng)_突,需要將這些沖突的地方手動(dòng) fix, 并且 git add 然后 git rebase –continue。但是假如最后一步 沒有用 continue, 而是用了 git rebase –skip,那就完蛋了,所有開發(fā)分支上未合并到 master 的 commit 統(tǒng)統(tǒng)丟失。
下面開始嗑藥:
Git 并不會(huì)真的將那些已刪除的commits從它的數(shù)據(jù)中刪除,所以我的那些被不小心刪除的commits仍舊保存在 Git 的數(shù)據(jù)文件中,在某個(gè)地方,我只需要把它們找出來。
首先,需要查看 .git/logs/refs 目錄, 在它下面會(huì)看到兩個(gè)目錄 heads 和 remotes。我們需要進(jìn)入 .git/logs/refs/heads, 因?yàn)?remotes 保存的是 remote branch 的信息。在 .git/logs/refs/heads/ 目錄下會(huì)看到一些和分支同名的文件。找到我操作的分支: dev, 打開查看其中內(nèi)容。
此文件中保存了我在此分支上的操作記錄,也包括了我最近的那次rebase,從操作前head 對應(yīng)的 commit 的 sha1 到 rebase 之后 head 對應(yīng)的 commit 的 sha1 。 那接下來的操作就變得十分簡單:
$ git checkout -b dev-recovery id
這個(gè)操作會(huì)以我rebase之前的head為base新建一個(gè) branch,這個(gè)branch就包含了我所有丟失的commits。這樣丟失的數(shù)據(jù)就找回來了。
注:后來聽同事介紹,下面還有種藥,待驗(yàn)證。
git reflog
git reset --hard id