速读#
这篇不是 Git 命令大全,而是记录我什么时候开始把“能回去”当成写代码的安全感来源。最重要的习惯是改之前先有可回退点,.gitignore 和第一条 commit 同时出现,密钥和环境文件别进库。
因为一晚上白干才学会#
开始写代码之后,最先撞上的往往不是语法报错,而是:改了半天想回滚,文件已经被覆盖了。
最痛的一次:改了一晚上,中途几次「顺手优化了一下别的地方」,最后想退回能跑的版本——那个版本从来没存过。
那次之后多了一条判断:改代码之前,先确认能回去。
提交不是负担,是安全绳。每次 commit 都记录已跟踪文件的一份可命名快照,让比较、定位和回退有依据;它不会保存 .gitignore 排除的文件、数据库和机器配置,本地 commit 也不是异机备份。需要抵抗磁盘损坏,还得把确认过的提交推到受控远端,并单独备份代码之外的数据。
肌肉记忆#
git status --shortgit diffgit add main.py # 新文件显式添加;已跟踪文件可用 git add -p 按块选择git diff --cached # 提交前再看一次暂存区git commit -m "feat: 初始化项目"git push -u origin main真正该形成肌肉记忆的是“先看状态和差异,再暂存,再复核提交内容”。git add . 很快,但脏工作区里容易把调试文件和无关改动一起带上;新文件按路径添加,已跟踪文件再用 git add -p 按块拆开。push -u 只在已配置远端、首次推送当前分支时需要,CI/CD 也通常在推送后才开始。
提交信息也别糊弄。「动词 + 干了什么」就够,但要写实——存档点的名字是给未来翻 git log --oneline 的自己看的,一排「update」等于没写。
提交的粒度同理:一次尽量表达一个可独立解释的变更。混合提交并非只能整块撤销,Git 仍能按文件或改动块恢复,但冲突和审阅成本都会上升;存档点越聚焦,回退、二分定位和 cherry-pick 越容易。 那晚白干的另一半教训就在这里:几处“顺手优化”和主线改动搅在一起,后来连我自己也说不清哪些必须保留。
.gitignore 别拖到「以后补」#
虚拟环境、编译产物和本地密钥文件不该进库。.gitignore 能减少误暂存,但只对未跟踪文件生效:文件一旦被 Git 跟踪,后来再加忽略规则也不会自动移出;git add -f 同样能绕过它。提交前查看 git diff --cached 才是最后一道人工确认,仓库里放的是去掉真实值的 .env.example。
.gitignore 和第一条 commit 同一时间点写。
配置密钥这一面,从第一天就该和变更面一起想——临时的就是永久的。
还有一条规矩要提前想好:密钥真提交并推送后,先按泄露处理,立刻撤销或轮换,再清理历史和当前文件。历史重写能减少后续暴露,却收不回已经被克隆、缓存或进入 fork 的副本;不能把“仓库里搜不到了”当成旧密钥重新安全。
分支:我到现在偏保守#
分支是指向某个提交的轻量指针,让试验可以独立演进。merge 创建合并关系并保留分叉历史;rebase 把提交重放到新基线,历史更线性,但提交 ID 会改变。自己尚未推送的分支可以 rebase 整理,共享分支不随意改写,这是我真正需要先守住的边界。
诚实写当时的判断:
- 一个人维护、主线不自动部署的小项目,可以直接提交
- 真要试新东西,新建分支,合并用最朴素的方式
- 没追求「高级分支策略」——这个规模用不上,强行用是给自己埋理解缺口
如果 main 一推送就部署生产,即便只有一个人,我也会用短分支和构建检查挡一下,因为这时分支保护的是线上,而不是协作人数。
该不该上某套分支策略:这个规模下它是在帮我,还是在制造没必要的复杂度?规模到了,复杂度会来找你;没到之前,简单就是对的。
如果重新来一次#
- 第一条命令:
git init - 先学:
git status、git diff、git log --oneline,弄清工作区、暂存区和提交历史 .gitignore与第一条 commit 同时写
常查的几条#
| 命令 | 作用 |
|---|---|
git status | 当前状态 |
git log --oneline | 简洁历史 |
git diff | 看改了什么 |
git diff --cached | 看即将提交什么 |
git restore --staged <file> | 取消暂存,不丢工作区改动 |
git revert <commit> | 用新提交撤销已共享的提交 |
git reset --soft HEAD~1 | 仅整理未共享的最近提交,保留改动与暂存状态 |
git restore <file> 会覆盖未提交改动,reset 会移动分支指针,执行前都要先看状态并确认目标;不确定时先复制补丁或做临时 commit,比凭印象敲撤销命令便宜。Git 教会我的不是命令表,而是把“怕改错”变成“有证据地改”:被提交过的代码大多有路可回,未跟踪、未提交和外部数据仍要另行保护。
