老程序员的 Git 避坑手册:这 10 个命令,我当年要是早知道就好了

张开发
2026/4/10 3:24:29 15 分钟阅读

分享文章

老程序员的 Git 避坑手册:这 10 个命令,我当年要是早知道就好了
老程序员的 Git 避坑手册这 10 个命令我当年要是早知道就好了阅读时间约 10 分钟适合人群Git 新手、被 Git 搞崩过代码的倒霉蛋、以及正在用鼠标点 SourceTree 的懒人作者心情一边敲键盘一边想起被git push --force支配的恐惧前言我是如何在一个周五下午把整个团队的代码库搞成一坨的那是 2015 年的一个下午我信心满满地执行了一条命令gitpush origin main--force然后安静了。群里安静了。老板的消息来了“小李你刚才干嘛了”从那一天起我发誓要把 Git 学明白。这篇文章就是我用无数次翻车经历换来的 10 个 Git 硬核技巧。不是Hello Git教程是真正能救命的那种。一、git reflog后悔药真的有场景你执行了git reset --hard整个分支的提交全没了人也傻了。很多新手以为这下完了开始在脑海中演练离职流程。但其实 Git 偷偷记了本gitreflog输出大概长这样a1b2c3d HEAD{0}: reset: moving to HEAD~3 d4e5f6g HEAD{1}: commit: 修复了登录bug h7i8j9k HEAD{2}: commit: 加了个功能虽然不知道有没有用找到你想恢复的那个 hash然后gitcheckout-b救命分支 d4e5f6g老鸟提醒reflog默认保留 90 天记录。所以别拖太久90 天后真的凉凉。二、git stash上厕所前先藏好代码场景正写着代码产品经理突然冲进来喊“线上有个紧急 bug”你的代码写到一半既不能提交烂摊子又不能不管要切分支。新手做法删代码 → 切分支 → 修 bug → 再把代码手打回来。痛苦面具.jpg老司机做法gitstash# 把现在的烂摊子藏起来gitcheckout fix/urgent-bug# ... 修 bug提交部署被夸 ...gitcheckout feature/my-workgitstash pop# 把烂摊子翻出来继续干还能给 stash 起名字方便多个烂摊子管理gitstash save登录页面写到一半别删gitstash list# 查看所有藏起来的代码老鸟提醒stash pop和stash apply的区别——前者用完就扔后者用完还留着。我一般用pop极简主义。三、git commit --amend打完补丁再发车场景刚git commit完发现 commit message 写的是asdfjkl;或者少提交了一个文件。正常操作是再提一个 commit然后 log 里就出现了这样的记录fix bug fix bug again fix bug for real this time ok now its really fixed why is this still broken优雅操作# 漏了一个文件gitadd忘记的文件.jsgitcommit--amend--no-edit# 悄悄塞进上一个 commit什么都没发生# commit message 写错了gitcommit--amend-mfeat: 完成用户登录功能⚠️重要警告amend会改写历史。如果这个 commit 已经 push 到远端了你再 amend 再 force push你的同事会想打人。这是经验之谈不多说。四、交互式git rebase整容手术让 commit 好看起来场景你开发一个功能写了 20 个 commit全是这种add file modify debug debug again wtf ok fixed typo forgot semicolon上 PR 之前你总不能把这堆垃圾推给 reviewer 看吧用交互式 rebase 整容gitrebase-iHEAD~8# 最近 8 个 commit 进手术室会弹出一个编辑器你可以指令作用pick保留这个 commitsquash/s和上一个 commit 合并reword/r修改 commit messagedrop/d直接删掉这个 commit把那堆 debug/typo 全 squash 掉最后变成一个干净的 commitreviewer 看了直呼内行。老鸟提醒rebase 会改写历史所以只对本地分支或未 push 的分支用。在已经 push 的公共分支上 rebase你会成为团队公敌。五、git bisect二分法排查 bug比你用console.log聪明多了场景你打开项目发现某个功能挂了。但你不知道是哪个 commit 搞坏的距上次正常运行已经过去了 200 个提交…新手做法从头看每个 commit… 然后通宵…老鸟做法让 Git 自己排查。gitbisect startgitbisect bad# 当前版本是坏的gitbisect good v2.0.0# 这个版本是好的Git 会自动帮你二分每次 checkout 到中间那个 commit你只需要回答好 还是 “坏”gitbisect good# 这个版本没问题gitbisect bad# 这个版本有问题几轮之后Git 直接告诉你“就是这个 commit 搞的鬼。” 还能配合脚本全自动化连好坏都不用你手判断Git 自己跑测试。这才是真·懒人操作。六、.gitignore写早不写晚写晚哭断肠这不是命令技巧这是血的教训。新手常见的神操作把node_modules500MB提交上去了把含密码的.env文件推到 GitHub 了把整个.idea文件夹JetBrains 配置污染了团队仓库标准做法项目第一天就建好.gitignore。推荐直接用生成工具gitignore.io选你的技术栈一键生成。已经误提交的文件补救方法# 从 Git 追踪中移除但本地文件保留gitrm--cached误提交的文件.envecho*.env.gitignoregitcommit-mchore: 移除敏感文件从今天起好好做人⚠️但是如果.env已经 push 到公共仓库了立刻去改密码git rm只是让文件消失在当前历史记录里还查得到。想彻底抹掉需要git filter-branch或BFG Repo Cleaner那是另一个故事了。七、git cherry-pick只摘你想要的那朵花场景同事在feature分支上修了一个你急需的 bug但他的分支乱得一塌糊涂你不想合并整个分支只想要那一个 commit。gitcherry-pick a1b2c3d# 只把这个 commit 摘到当前分支也可以一次摘一段gitcherry-pick a1b2c3d..f6g7h8i# 摘从 a 到 f 之间的所有 commit使用场景hotfix 要同时上多个版本分支时cherry-pick 比手动改代码优雅 100 倍。八、git log的正确打开方式你现在用的git log可能长这样一坨文字commit a1b2c3d4e5f6... Author: 张三 zhangsanexample.com Date: Mon Apr 7 10:23:11 2026 0800 修改了一些东西看一屏只能看到 3 条效率堪比 IE6。换成这个gitlog--oneline--graph--decorate--all输出变成* a1b2c3d (HEAD - main) feat: 完成支付模块 * d4e5f6g fix: 修复金额计算错误 | * h7i8j9k (feature/refactor) refactor: 重构数据层 |/ * j0k1l2m chore: 更新依赖直观、好看、一眼看清分支结构。嫌每次打太长加个别名一劳永逸gitconfig--globalalias.lglog --oneline --graph --decorate --all# 以后直接用gitlg九、用好git diffcode review 不再瞎眼很多人git diff只用来看改了什么其实它能做更多gitdiffHEAD~3# 和 3 个 commit 前比gitdiffmain..feature# 两个分支之间的差异gitdiff--stat# 只看改了哪些文件不看具体内容省眼睛gitdiff--word-diff# 单词级别的 diff改了哪个词一目了然--word-diff特别适合看文档或配置文件的改动比行级 diff 精准多了。十、git hook让机器替你把关别指望人场景每次 push 之前都要手动跑 lint、跑测试有时候忘了有时候懒了然后 CI 挂了被 review 打回来很丢人。解决方案用pre-commithookpush 之前自动检查。在项目根目录.git/hooks/pre-commit创建文件#!/bin/shecho 正在跑 lint请稍等...npmrun lintif[$?-ne0];thenecho❌ Lint 没过不让你提交exit1fiecho✅ 检查通过放行记得给执行权限chmodx .git/hooks/pre-commit 推荐用husky来管理 hook配置更方便还能提交到仓库让团队共享。npx husky-init npm install然后按文档配。总结技巧解决什么问题git reflog代码消失了救命用git stash切分支前临时保存现场git commit --amend补救刚提交的失误git rebase -i清理 commit 历史让 PR 好看git bisect二分法找出引入 bug 的 commit.gitignore早建别把密码和 node_modules 推上去git cherry-pick精准摘取某个 commitgit lg别名好看的 log一眼看懂分支结构git diff --word-diff精准看改动git hook自动化把关不让问题代码提交结语Git 这个东西学会add、commit、push只是刚入门。真正用好 Git是在被它搞崩过几次之后——你会发现它其实是个非常体贴的工具只是你之前根本没读说明书。希望这篇文章能让你少踩几个坑。如果觉得有用点个赞再走你的赞是我继续写烂文章的动力 关注作者持续分享老程序员踩坑实录。下期预告《Linux 命令行那些年我以为自己懂其实根本不懂的 20 个命令》本文基于 Git 2.x 版本示例在 Linux/macOS 环境下测试。Windows 用户请自备 Git Bash 或 WSL别问我为啥 PowerShell 跑不了那又是另一个故事了。

更多文章