摘要:首先使用把都存到一個文件里原來是為了處理流的異步數據引入的當前同步過程下不需要匹配規則于是經過幾分鐘的執行我找回了我的代碼參考鏈接的維護和
上個周末遇到了一個這樣的場景
場景node_modules src - ...files test - test.js package.json
睡前本來準備上傳到github倉庫
git init
git add -A
發現忘記添加.gitignore,把node_modules文件都add進去了
于是手賤輸入了git reset --hard
然后發現...目錄里的東西全部沒了(只剩下.git/文件架),
當時我的內心
心急如焚懊悔不已的我,經過查閱相關資料,還是找到了一些拯救代碼的方法
由于每次git命令進行操作時git都會對相關文件進行快照,并通過一定形式把信息保存再.git/目錄下。
由于此前我使用過git add -A命令,因此當文件被放進暫存區時,快照信息對象就已經保存了,而實用git reset --hard之后,這些對象就變成了懸空文件對象(dangling blob)。
我們可以實用git fsck命令顯示他們
git fsck:用于驗證當前git倉庫數據的有效性和一致性,能夠顯示那些"丟失"的commit、blob(文件)、tree等。
我們可以通過以下命令
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")
我們得到一大堆blob的hash ID
unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3 unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03 ...
接下來使用git show就能顯示這些對象的內容了,例如git show 907b308
自動還原但是由于我曾經添加的文件實在太多node_modules里的文件可能有上千個,因此對逐個ID進行git show肉眼篩選是非常不科學。
因此我寫了個簡單的nodejs腳本(因為我比較熟悉),篩選還原那些我需要的文件。
首先使用git fsck把hash ID都存到一個文件里
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > allhashes
"use strict"; const fs = require("fs"); const shelljs = require("shelljs"); const through = require("through2"); let buf = fs.readFileSync("./allhashes") buf = buf.toString(); let hashes = [] buf.replace(/dangling blob (w+)/gi,function (matached, hash) { hashes.push(hash) }); let all = hashes.length; let left = all; hashes.forEach(hash=>{ let fullContent = "" let stdout = shelljs.exec("git show "+hash,{silent:true}).stdout; let input = through(); console.log((left--)+"/"+all); //TODO:through2原來是為了處理stdout流的異步數據引入的,當前同步過程下不需要 input.pipe(through((buf,_,next)=>{ fullContent = fullContent+buf.toString(); next(null,buf) },flush=>{ if (matchContent(fullContent)){ fs.writeFile("./objects/"+hash,fullContent) } flush() })) input.push(stdout); input.push(null); }) function matchContent(content){ // ... 匹配規則 }
于是經過幾分鐘的執行,我找回了我的代碼
Undo git reset --hard with uncommitted files in the staging area
Recovering Git repository from objects only
Git的維護(git gc和git fsck)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/38052.html
摘要:很多原因可能會導致我們想刪掉遠程服務器上提交的版本。下面主要說一下刪除的命令行。然后通過命令提交到遠程庫。這里一定要注意注意再注意注意提交到遠程庫之后,的代碼會直接從遠程庫里面刪除。,代表的是最新版本的上一個版本,以此類推。 額,怎么開頭呢,從文章的定位開始吧。這篇文章的目的就是定位給完全的小白,像我這樣,對于互聯網知識不了解的人,但是特別渴望學習,小白文章小白文章小白文章!重要的事情...
摘要:掌握了命令行,使用圖形化工具如探囊取物。管理的文件狀態已修改已暫存已提交。由于我們使用了命令,但并未創建新的分支,所以創建了一個匿名分支。省略遠程分支名表示將本地分支推送到與之存在追蹤關系的遠程分支通常同名。概述此篇博文意在讓新手快速上手 Git,滿足工作中的基本需求,而非梳理細節。后續會再開一個系列,來探討 Git 細節問題。一、Git 的安裝這部分網站上資料非常多,根據自己的系統版本查找...
閱讀 2921·2023-04-26 01:01
閱讀 3692·2021-11-23 09:51
閱讀 2523·2021-11-22 14:44
閱讀 3605·2021-09-23 11:57
閱讀 2841·2021-09-22 14:58
閱讀 5881·2021-09-10 11:25
閱讀 2110·2019-08-30 13:11
閱讀 1600·2019-08-30 12:59