文章 #060

git commit -m "1"——你的项目历史正在被一个字符毁掉

一个人写的时候可以偷懒。但项目一旦认真起来,每一个"1"都是在给未来的自己挖坑——不是Git在惩罚你,是三个月后的你在诅咒现在的你。

从GitHub入门讲起

如果你看过本站的文章 #16 从零开始注册GitHub并克隆仓库,那你的Git之旅应该已经上路了——你学会了git clone把项目拉下来,学会了git add .把改动的文件扔进去,学会了git commit -m "信息",然后git push推上去。

一切顺利。直到某个时刻,你发现每次都要写"信息"太麻烦了。于是你开始写"1"。

$ git commit -m "1"
$ git push

代码能提交,能推送,GitHub上也能看到。看起来一切正常。而且确实——在某个特定的时间窗口内,它就是正常的。

但这篇文章不是来跟你说"1"有多好用的。这篇文章是来告诉你,它为什么从根上就是烂的。

首先把话说清楚:短期写"1"没什么大不了的

很多Git教程一上来就摆架子说"commit message必须用规范格式"、"不符合Conventional Commits的都是垃圾"——没必要,真的。如果满足以下全部条件:

  • 你一个人写,没有协作者
  • 项目还不稳定,一天改很多次
  • 你记得每个改动,脑子比git log好用

那你写"1"完全OK。这时候项目还在原型阶段,最核心的任务是让东西跑起来。没人会在原型期去翻commit log找历史。

这就是所谓的"短期容忍区"。在这个区间内,commit message的质地根本不重要,因为唯一的读者就是你自己,而你当时全记得。

💡 这里的关键在于:"短期"和"长期"的界限在哪?
答案很简单——当你开始需要回头看的那一刻,"短期"就结束了。这个时刻可能是你第一次git log想找一个旧功能,也可能是你第一次把代码发给别人看。

但当你开始认真做项目,"1"就是灾难

长期项目的本质是:你一定会忘记自己写过什么。人脑不是数据库,三个月后的你回头看自己写的代码,和看一个陌生人写的东西基本没区别。而commit log就是你留给未来的自己的唯一指引。

现在来看一下,用"1"写commit log会发生什么:

1. git log 变成了天书

$ git log --oneline
a1b2c3d 1
d4e5f6g 1
g7h8i9j 1
j0k1l2m 1
m3n4o5p 1
p6q7r8s 1

全是"1"。你能分出哪个加了新功能,哪个修了bug,哪个只是改了README里的一个标点?不能。你只能一个一个commit去翻diff。

如果有12个commit全是"1"——恭喜你,你得看12次diff才能找到你想要的那次改动。而如果项目有100个commit……我建议你直接重写。

2. git bisect 直接报废

git bisect是Git里最漂亮的调试工具之一:通过二分查找,帮你精准定位哪个commit引入了某个bug。但它的前提是——每一个commit都有一个清晰的标签,让你知道它在bisect的二分过程中该不该标记为good。

如果每个commit都是"1",bisect工具本身还能用,但你的体验会变成:

$ git bisect good
# 这是好的吗?这个"1"改了啥来着……
$ git show --stat
# 哦,改了登录页面……等下,bug是不是登录相关来着?

你每次都要手动git show来看这个"1"到底改了什么东西。本来几秒钟的bisect过程,被硬生生拖成几分钟的"猜谜游戏"。

3. 三个月后的你,是最熟悉的陌生人

这是最致命的问题。你现在觉得"反正我都记得"——但三个月后你绝对不记得。你甚至连"1"这个commit是在哪一天写的都记不清。

你的项目在成长。从10个文件到50个文件,从500行到5000行。到了某个节点,你突然需要一个两周前写的函数,但你不确定它在哪个文件里——你翻开git log:

$ git log --oneline
a1b2c3d 1 # 是这个吗?
d4e5f6g 1 # 还是这个?
g7h8i9j 1 # 或者这个??

每一个"1"都是一扇上锁的门。你要一把一把钥匙去试。运气好试到第三把,运气不好——十把钥匙全试完也没找到,最后还是用grep -r全文搜索找代码。

那Git的版本控制意义在哪里?你明明有一个完整的历史记录,却因为每个commit都叫同一个名字,让这个记录变成了废物。

一个不能用来搜索的commit log,就像一个没有目录的图书馆。书都在,但你找不到——等于没有。

好,那什么样的commit才是好的?

其实根本不用背什么Conventional Commits规范。在你学会那些花里胡哨的格式之前,先做到一条最基本的:

让你的commit message有意义。

就这么简单。"有意义"的意思是:别人(包括三个月后的你)看到这条信息,不用点开diff就知道这次commit干了什么。

❌ 反面教材

1
2
a
x
fix
update
asdf
111
.

✅ 合格标准

修复登录按钮在移动端不可点击
添加用户头像上传功能
删除过时的API路由
重构数据库查询为异步
更新README安装说明

看到区别了吗?右侧每一条你都知道它在做什么,左侧你完全不知道。这就是"有意义"和"没意义"的差距。

再进一步,如果你想让log更好用,可以加一点简单的约定:

$ git commit -m "feat: 添加用户登录功能" # 新功能
$ git commit -m "fix: 修复登录按钮不可点击" # 修bug
$ git commit -m "refactor: 提取validateEmail" # 重构
$ git commit -m "docs: 更新README" # 文档

这种做法叫"Conventional Commits",但它不是强制规范——它只是把你已经在做的事情加上一个分类前缀,让log立刻变得可筛选、可搜索、一目了然。

合作场景:"1"等于在谋杀团队效率

如果上面的内容还只是"个人开发者不痛不痒"的问题,那么多人协作时写"1"就是在犯罪了。

想象一下:你的队友A刚刚提交了一个commit,message写的是"1"。你想知道他改了什么地方——你只能去看diff。如果他也忘了,你们俩还得打开PR页面从头看到尾。

再来想象:你在review队友B的PR,里面5个commit分别是"1"、"2"、"3"、"fix"、"a"。你需要搞清楚每个commit改了什么,逐一对比。一个本来10分钟能搞定的review,硬生生拖了半小时。

在团队里,commit message就是你和队友之间的快照。你省掉的那几个字,乘以团队人数,就是浪费的总时间。

总结:一条线

总结一下,这条线其实很清楚:

  • 个人原型开发:写"1"可以。项目不稳定、改动频繁、根本没人看历史——这个阶段commit message的优先级是0。
  • 认真开发 / 团队协作:必须写有意义的信息。这个"信息"不需要是长篇大论,一句话说清楚"干了什么"就够了。

commit message不是写给Git看的。是写给未来的自己(和你的队友)看的。

Git 本身不关心你写了什么

你可以写"1",可以写"a",可以写"111",甚至可以写空字符串。
Git照常工作——它只负责记录快照。

不一样。你需要理解历史。
三个月后的你翻开 log,看到的是一片"1"——
那不是Git的错。
是你自己选择毁掉了自己的项目历史。

# git commit -m "一个有意义的描述"
# 这不是规范,这是尊重——尊重未来的自己

「我现在懂了——不是Git在惩罚我写'1',是三个月后的我在诅咒现在的我。」
广告位招租 - 联系站长