手贱操作:git reset --hard sha1恢复时,把add的内容直接覆盖掉,找不到代码了。

因为只有add,git reflog无用,git fsck --lost-found 里边也找不到个啥。

ps:至今未找到.git/lost-found/other 文件夹在哪。真的奇了怪了。

恢复方法:


find .git/objects -type f 

出现以下内容

-r--r--r-- 1 sssfff 1049089     297 5月   9 14:40 .git/objects/14/6d06f321393f8516bc8706582d3eb0bba6f6aa
-r--r--r-- 1 sssfff 1049089     298 5月   9 14:40 .git/objects/18/598b6f1900f7702bf01ae8c4598487d2775e39
-r--r--r-- 1 sssfff 1049089     868 5月   9 14:40 .git/objects/1f/85b7eb25d2d99e4c6a4a03ce868bd3b574d8ed
-r--r--r-- 1 sssfff 1049089      72 5月   9 14:40 .git/objects/1c/cfe7cb022a03df2c53e54ab9bbfffb8285a5d3
-r--r--r-- 1 sssfff 1049089     238 5月   9 14:40 .git/objects/17/071e43a3d821026a9600006d42dedfc47011d0
-r--r--r-- 1 sssfff 1049089    2574 5月   7 17:23 .git/objects/08/69c5f92dbb71bb6bc12ff9850d94ce395dfee2
-r--r--r-- 1 sssfff 1049089    1623 5月   7 17:23 .git/objects/23/bfb3dd4a2de0f6f62fc819e4c15c4d25d1580d
-r--r--r-- 1 sssfff 1049089     703 5月   7 17:23 .git/objects/13/ddb318becf57f02c9946bf40fad9e8c99f42f3
-r--r--r-- 1 sssfff 1049089     237 5月   7 17:20 .git/objects/2e/33878c9b51ecc668cca496fbcc3cf85f972bc7

使用 git cat-file -p sha1 --读取内容

git cat-file -p 2e33878c9b51ecc668cca496fbcc3cf85f972bc7

sha1 的值为object后边的
/2e/33878c9b51ecc668cca496fbcc3cf85f972bc7=》2e33878c9b51ecc668cca496fbcc3cf85f972bc7

这时候就出现代码内容:

dddd test

手动去找麻烦:
此命令将所有flie sha1值都存入obj文件里

find .git/objects -type f | xargs ls -lt | sed 136q | awk '{gsub(".git/objects/", "", $9);gsub("/","",$9);print $9}' | tee obj

然后使用nodejs脚本跑一下git命令

var fs = require("fs");
let child_process = require('child_process');

const argv = process.argv

if (argv.length <= 2) {
    console.log("请指定目标地址!--->例如:node gitpull.js 'D:\\xxx\\xxxx' ")
    return
}
const githref = argv[2]

var data = fs.readFileSync('obj');
var arr = data.toString().split(/[\s\n]/);
for (let i = 0; i < arr.length - 1; i++) {
    let cmdstr = `git cat-file -p ${arr[i]} > flie-${arr[i]}`;
    
    child_process.exec(cmdstr, { cwd: githref }, function (error, stdout, stderr) {
        if (error !== null) {
            console.log('exec error: ' + error);
        } else {
            console.log(arr[i] + ' ' + stdout)
            // console.log(stdout)
        }
    });
}

console.log("程序执行完毕。");

简陋版本缺点:

所有的生成的文件都会在项目文件夹下边。

用vscode全局搜索文件找到丢失的文件,然后利用git checkout 该删除的就删除。

参考:

http://www.ai-freedom.org/2018/06/09/git_reset_hard_disaster/#comments
https://www.cnblogs.com/justyouadmin/p/11395839.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐