代码断舍离

未使用代码

在代码库中,尤其是祖传代码库中,我们常常能找到不少未使用代码、甚至文件。

产生

  • 写错的,自然产生的
  • 重构时残留的历史代码
  • 重构后未删除原来的文件
  • 复制粘贴的残留代码

恶果

  • 没注释的直接干扰代码理解
  • 注释了也占位置,影响正常代码阅读
  • 影响全局搜索,可能全局搜索出来还在用的只有一两条,剩下的都是未使用的代码
  • 如果全局搜到了根本没引用的陈年文件,你可能还会傻乎乎地浪费时间把它改了
  • 最重要的是,这些代码 99% 以后都不会再用上了,但是你却总觉得会有用上的一天

注意,在多人合作的代码库里,以上问题会被成倍放大。

清除

lint 工具会提示代码中未使用变量,灰了就删了吧。

重构时历史代码不需要保留,至少不需要一直保留。经过靠谱测试的代码上线后一段时间都没问题的话,历史代码就可以删掉了。

之所以要快删,是因为短期内不删掉的话,时间久了也会忘记他保留的原因,导致永远都不敢删除,这十分致命。

我在这鼓吹放胆删除也肯定是有原因的,这些被删掉的代码,如果有一天真要用上,要找回来,那方法也有的是。

找回代码

最传统的方法可以用 git 命令行查找。

sh 复制代码
git log -G "keywords"

git log 其实可以根据关键词筛选 diff 到内容,所以只要记得某个变量名就可以用 git log 搜索相关提交。

当然这个方法还是有点麻烦,如果你用的是个靠谱的 IDE,你可以很方便地看到一个文件的修改记录。

例如在 VSCode 中,左侧的 TIMELINE 就是你的文件时光机。

可以注意到,除了 git 的 commit 记录,本地保存都会被备份,而且记录时间非常长,我翻了一下一个老项目,看到几个月前的本地修改都仍然保留着。

也因为这个记录机制,即使你不小心把文件删了(例如 git 没有提交,手贱直接把修改放弃了),VSCode 也能帮你找回来,Ctrl + shift + p 然后输入 Local History: Find Entry to Restore 即可。

分支丢失

虽然有一点跑题,但是找回代码说了,就顺便说说怎么找回分支吧。毕竟也罕见地存在着分支没 push 还被手贱删掉的情况。

git 是一个很安全的系统,只要你 commit 了,不整什么骚操作的话提交是总能找回来的。

短期内丢失的分支(默认好像是 90 天内),可以通过 reflog 找回来。

sh 复制代码
# 输入
git reflog

# 输出
6294b5b (HEAD -> main, origin/main, origin/HEAD) HEAD@{0}: checkout: moving from test-reflog to main
5c64ce5 HEAD@{1}: checkout: moving from main to test-reflog

5c64ce5 是原来 test-reflog 分支的 SHA,然后我们直接 checkout 过去就能找到原来分支的内容了。

sh 复制代码
# 输入
git checkout 5c64ce5

# 输出
Note: switching to '5c64ce5'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 5c64ce5 test: reflog

你也可以在 Fork 中通过图形界面 直接观察到 reflog 保留的数据,下图可以看到两次 rebase 残留的记录。

就先写到这了,对代码断舍离,清爽的代码库,你和你的团队都值得拥有。

原文链接

相关推荐
街尾杂货店&17 小时前
CSS - transition 过渡属性及使用方法(示例代码)
前端·css
CH_X_M17 小时前
为什么在AI对话中选择用sse而不是web socket?
前端
chxii17 小时前
Spring Boot 响应给客户端的常见返回类型
java·spring boot·后端
韩立学长17 小时前
【开题答辩实录分享】以《植物爱好者交流平台的设计与实现》为例进行答辩实录分享
spring boot·后端·mysql
Wzx19801217 小时前
go基础语法练习
开发语言·后端·golang
Mintopia17 小时前
🧠 量子计算对AIGC的潜在影响:Web技术的未来可能性
前端·javascript·aigc
街尾杂货店&17 小时前
css - word-spacing 属性(指定段字之间的间距大小)属性定义及使用说明
前端·css
忧郁的蛋~17 小时前
.NET异步编程中内存泄漏的终极解决方案
开发语言·前端·javascript·.net
sp4218 小时前
漫谈 Java 轻量级的模板技术:从字符串替换到复杂模板
java·后端
2301_7951672018 小时前
玩转Rust高级应用. ToOwned trait 提供的是一种更“泛化”的Clone 的功能,Clone一般是从&T类型变量创造一个新的T类型变量
开发语言·后端·rust