摘要:首先使用把都存到一個文件里原來是為了處理流的異步數(shù)據(jù)引入的當前同步過程下不需要匹配規(guī)則于是經(jīng)過幾分鐘的執(zhí)行我找回了我的代碼參考鏈接的維護和
上個周末遇到了一個這樣的場景
場景node_modules src - ...files test - test.js package.json
睡前本來準備上傳到github倉庫
git init
git add -A
發(fā)現(xiàn)忘記添加.gitignore,把node_modules文件都add進去了
于是手賤輸入了git reset --hard
然后發(fā)現(xiàn)...目錄里的東西全部沒了(只剩下.git/文件架),
當時我的內(nèi)心
心急如焚懊悔不已的我,經(jīng)過查閱相關(guān)資料,還是找到了一些拯救代碼的方法
由于每次git命令進行操作時git都會對相關(guān)文件進行快照,并通過一定形式把信息保存再.git/目錄下。
由于此前我使用過git add -A命令,因此當文件被放進暫存區(qū)時,快照信息對象就已經(jīng)保存了,而實用git reset --hard之后,這些對象就變成了懸空文件對象(dangling blob)。
我們可以實用git fsck命令顯示他們
git fsck:用于驗證當前git倉庫數(shù)據(jù)的有效性和一致性,能夠顯示那些"丟失"的commit、blob(文件)、tree等。
我們可以通過以下命令
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")
我們得到一大堆blob的hash ID
unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3 unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03 ...
接下來使用git show就能顯示這些對象的內(nèi)容了,例如git show 907b308
自動還原但是由于我曾經(jīng)添加的文件實在太多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流的異步數(shù)據(jù)引入的,當前同步過程下不需要 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){ // ... 匹配規(guī)則 }
于是經(jīng)過幾分鐘的執(zhí)行,我找回了我的代碼
Undo git reset --hard with uncommitted files in the staging area
Recovering Git repository from objects only
Git的維護(git gc和git fsck)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/38052.html
摘要:很多原因可能會導致我們想刪掉遠程服務(wù)器上提交的版本。下面主要說一下刪除的命令行。然后通過命令提交到遠程庫。這里一定要注意注意再注意注意提交到遠程庫之后,的代碼會直接從遠程庫里面刪除。,代表的是最新版本的上一個版本,以此類推。 額,怎么開頭呢,從文章的定位開始吧。這篇文章的目的就是定位給完全的小白,像我這樣,對于互聯(lián)網(wǎng)知識不了解的人,但是特別渴望學習,小白文章小白文章小白文章!重要的事情...
摘要:掌握了命令行,使用圖形化工具如探囊取物。管理的文件狀態(tài)已修改已暫存已提交。由于我們使用了命令,但并未創(chuàng)建新的分支,所以創(chuàng)建了一個匿名分支。省略遠程分支名表示將本地分支推送到與之存在追蹤關(guān)系的遠程分支通常同名。概述此篇博文意在讓新手快速上手 Git,滿足工作中的基本需求,而非梳理細節(jié)。后續(xù)會再開一個系列,來探討 Git 細節(jié)問題。一、Git 的安裝這部分網(wǎng)站上資料非常多,根據(jù)自己的系統(tǒng)版本查找...
閱讀 2906·2023-04-26 01:01
閱讀 3682·2021-11-23 09:51
閱讀 2514·2021-11-22 14:44
閱讀 3542·2021-09-23 11:57
閱讀 2826·2021-09-22 14:58
閱讀 5866·2021-09-10 11:25
閱讀 2100·2019-08-30 13:11
閱讀 1589·2019-08-30 12:59