惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

大猫的无限游戏
大猫的无限游戏
月光博客
月光博客
博客园 - Franky
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿
博客园 - 司徒正美
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
B
Blog RSS Feed
阮一峰的网络日志
阮一峰的网络日志
宝玉的分享
宝玉的分享
V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
博客园_首页
S
SegmentFault 最新的问题
A
About on SuperTechFans
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
H
Help Net Security
MongoDB | Blog
MongoDB | Blog

OhYee 博客

小鹏辅助驾驶测评|OhYee 博客 小鹏非支持手机开启自动解锁|OhYee 博客 使用函数计算实现 301 重定向|OhYee 博客 针对 HTML 内容使用 Ant Design 图片弹框|OhYee 博客 博客进程泄露及僵尸进程解决|OhYee 博客 蓝易云服务器体验|OhYee 博客 SSH 调起本地 VSCode|OhYee 博客 【2022 秋招内推】阿里云后端研发工程师|OhYee 博客 使用函数计算获取 IP 地址信息|OhYee 博客 正确获取客户端 IP/HTTP Header 也可能重复|OhYee 博客 评测 Oculus Quest2 及 BigScreen|OhYee 博客 NextJS 热重载保留状态|OhYee 博客 如何优雅地贴 gist 代码|OhYee 博客 Linux 精细化文件权限|OhYee 博客 VSCode 容器开发环境|OhYee 博客 Clash 的不兼容更新排查|OhYee 博客 Zeek 导出 PCAP|OhYee 博客 记一次 ssh 配置问题|OhYee 博客 Git Commit 规范化工具|OhYee 博客 谈谈《星之卡比-探索发现》|OhYee 博客 VSCode 快捷键绑定 Shell 命令|OhYee 博客 ASN.1 语法及 X.509 证书格式解析解析|OhYee 博客 腾讯企业邮箱忽略 MX 记录发信|OhYee 博客 Chrome/Edge 标签组插件|OhYee 博客 【应届内推】阿里云后端研发工程师|OhYee 博客 损坏的 Typecho 备份处理为 JSON|OhYee 博客 VS Code VIM 插件高效使用|OhYee 博客 SSH 正反向代理|OhYee 博客 Let's Encrypt 根证书过期引发的问题|OhYee 博客 OpenWRT 忽略内核依赖|OhYee 博客
乌尔德女神作战计划——Git 历史修改|OhYee 博客
2021-02-08 · via OhYee 博客

由于误操作,需要把已经被删除的记录附加到当前的所有提交前面

这是一篇最后编辑于 5 年前 的文章,其内容可能与目前实际情况差异较大,请注意甄别

乌尔德女神作战计划——Git 历史修改

原本博客前端是有代码自动生成的,在一次进行 git 仓库镜像同步的时候,不小心把所有分支覆盖了。导致之前的的记录都没了(虽然并不影响啥)。
不过处于好奇,还是尝试恢复了一下,中间又误操作把顺序恢复反了。不过最终还是可以完美还原的


相关梗出自《命运石之门》,实验修改过去D-Mail作战计划(Operation URD)。乌尔德是北欧神话中诺伦三女神之一,掌管过去的时间。

寻找过去的世界线

如果世界线没有被当作垃圾回收,那么使用git reflog可以看到所有世界线(即使已经属于被遗弃的孤立世界线)

git reflog 记录git reflog 记录

通过该命令,可以查看到首次新的提交从2ff1061ef开始。那么从上往下,分别checkout到对应的节点查看历史即可

经过几次尝试,发现g'g为最后一次拉取的记录,因此还原从这里开始。

将该记录重新保留出来,用来操作
使用git checkout -b ref,新建ref分支指向当前位置(a062d8218)

合并世界线

使用git rebase可以合并两个分支的内容

这里使用git rebase gh-pages ref实际上这么做合并反了,不过为了后面的内容,先这么写)

合并后,会发现 git 的记录是先新版本(2021 年 2 月)再老版本(2020 年 2 月 ~ 2021 年 1 月),显然这不符合时间顺序。
因此,需要修改 git 的记录

逆转时间,重塑历史

万物皆可rebase,我们可以修改从头开始的所有 git 记录

通常,如果只需要修改 HEAD 前几条,使用git rebase -i HEAD~3,如果要修改到特定提交则是git rebase -i abcde

但是根记录是不会被计入这里的,如果我们直接选取当前最早的提交2ff1061ef,那么会实际上是处于2ff1061ef提交后的状态,而这个提交实际上也是需要修改的。

要修改所有提交,使用git rebase -i --root,这样就可以在交互界面里看到所有内容,把最上面的几行(最老的提交——新版本的记录),剪切到最下面几行(最新的提交)处。
这样,提交后就实现了对提交记录的修改

由于文件 diff 关系变化,所以这里实际上是重新模拟文件提交一次,由于是重新提交,所以哈希值会变化且时间可能会很慢,并且部分关键节点可能会要求二次确认。

重新确认提交内容重新确认提交内容

考虑到需要大量的重新提交,可以使用循环脚本实现

for ((i=0;i<100;i++)); do git add . && git rebase --continue; done

至此,时间女神被成功欺骗,我们重塑了历史

强制推回对应分支即可

参考资料