Git實戰技巧:恢復被強制push -f失蹤的代碼


前言

Git是一個易學難精的分布式版本控制系統,被我們碼農常用於代碼的管理。如果你還不了解Git,建議先通過廖雪峰的Git教程進行了解,再來看本文,因為本文以使用技巧為主,不會在基礎名詞上做過多解釋。

廖雪峰的Git教程:

https://www.liaoxuefeng.com/wiki/896043488029600/896067008724000

恢復被強制推送push失蹤的代碼

在常規的開發流程中,難免有時因為各種原因(例如需要使用git rebase)會需要使用到git push -f,也就是強制推送,該命令會覆蓋遠程分支。

但如果操作不當,會容易把小伙伴的之前提交的commit給覆蓋掉,不要慌,這並不代表你小伙伴的commit已經永遠找不回來了,大部分情況下,他們還是可以被找回的。

git reflog 可以查看所有分支的所有操作記錄(包括(包括commit和reset的操作),包括已經被刪除的commit記錄,git log則不能查看已經刪除了的commit記錄

雖然有reflog這跟救命稻草,但由於Git會定時gc(回收),清理掉reflog,所以被人覆蓋后不要等待太久才進行恢復操作,不然可能就真的找不回了。

操作方法

  1. 備份當前工作區的數據

你可以使用git stash等命令備份下現在正在寫的代碼

  1. 在命令行輸入git reflog/git log -g

顯示所有歷史操作,找到你需要的提交(包括已經被刪除的commit記錄,git log則不能察看已經刪除了的commit記錄)

2.1 強制回退到當時被刪除的commit

git reset --hard <SHA1>

2.2 或者直接

git cherry-pick <SHA1>

直接把當時版本的工作拿回來。不過如果有沖突的話還要處理沖突。

  1. 強推上遠程分支
git push -f origin <branch>

如果引起commit丟失的原因並沒有記錄在reflog 中,比如運行了rm -Rf .git/logs/, 因為 reflog 數據是保存在 .git/logs/ 目錄下的,這樣就沒有 reflog 了。

可以使用 git fsck 工具,該工具會檢查倉庫的數據完整性。如果指定 --full 選項,該命令顯示所有未被其他對象引用 (指向) 的所有對象:

然后,用相同的方法就可以恢復它,即創建一個指向該 SHA 的分支。

是不是對於強推git push -f不再慌了呢?

關注我

我是一名后端開發工程師。

主要關注后端開發,數據安全,爬蟲,物聯網,邊緣計算等方向,歡迎交流。

個人公眾號:后端技術漫談

公眾號:后端技術漫談.jpg

如果文章對你有幫助,不妨收藏,投幣,轉發,在看起來~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM