git进阶04_Git 工作流实战

发布时间:2026/6/30 6:50:34
git进阶04_Git 工作流实战 Git 工作流实战本章目标掌握企业日常开发中最高频的 Git 操作做到闭眼操作不出错。一、企业日常开发的标准流程1.1 每天早上到公司# 第一件事同步远程代码gitcheckout maingitpull origin main# 同步 develop如果用 Git Flowgitcheckout developgitpull origin develop# 如果你昨天的功能分支还没合并也同步一下gitcheckout feature/user-logingitrebase origin/develop# 把 develop 的最新改动变基到你的分支1.2 开发过程中的提交# 提交信息必须规范下一节详细讲gitadd具体文件# 不要用 git add .gitcommit-mfeat(auth): add login form validation1.3 下班前# 推送到远程备份 让同事能看到你的进度gitpush-uorigin feature/user-login# 如果用了 rebasegitpush --force-with-lease1.4 功能开发完成# 同步最新代码gitfetch origingitrebase origin/develop# 解决冲突如果有# ...# 推送gitpush --force-with-lease# 在 GitLab 上创建 Merge Request# 等待 Code Review → 合并 → 删除分支二、Git Commit Message 规范Conventional Commits这是企业中最重要的规范之一不遵守会被 leader 打回来。2.1 格式type(scope): subject body footer2.2 Type 类型Type说明示例feat新功能feat(auth): add login pagefix修复 Bugfix(payment): fix amount calculationdocs文档更新docs(readme): update installation guidestyle代码格式不影响逻辑style: fix indentationrefactor重构非新功能非修复refactor(user): extract validation logicperf性能优化perf(query): add database indextest测试test(auth): add login unit testschore构建/工具/依赖chore: update dependenciesciCI/CD 配置ci: add GitHub Actions workflowrevert回滚revert: revert feat(auth): add login2.3 Scope 范围表示影响范围模块/组件可选auth- 认证模块payment- 支付模块user- 用户模块api- API 层db- 数据库2.4 实际示例# 简单的gitcommit-mfeat(auth): add user login# 带 body 的gitcommit-mfix(payment): fix discount calculation The discount was not applied when using coupon codes. This was caused by missing null check in applyDiscount(). Fixes #1232.5 用 Git Hooks 自动检查推荐# 安装 commitlintnpminstall--save-dev commitlint/cli commitlint/config-conventional# 创建配置文件catcommitlint.config.jsEOF module.exports { extends: [commitlint/config-conventional], rules: { type-enum: [2, always, [ feat, fix, docs, style, refactor, perf, test, chore, ci, revert ]], subject-max-length: [2, always, 100], }, }; EOF三、git add 的正确姿势3.1 交互式暂存企业推荐# 选择性暂存最推荐gitadd-pfile# 会逐个显示代码块hunk选择# y - 暂存这个 hunk# n - 跳过# s - 拆分这个 hunk# q - 退出# 这样你可以把一个文件的改动分成多次提交3.2 常见场景# ✅ 推荐只添加需要的文件gitaddsrc/login.js src/login.css# ❌ 不推荐添加所有改动gitadd.# ⚠️ 谨慎添加所有改动跳过交互确认gitadd-A# 查看将要提交的内容gitdiff--staged3.3 撤误操作# 撤销 git add取消暂存gitreset HEADfile# 或者用新语法gitrestore--stagedfile# 丢弃工作区的修改危险不可恢复gitrestorefile# 丢弃暂存区的修改gitrestore--stagedfile四、git commit 深入4.1 好的 commit 原则一个 commit 一个逻辑单元 ✅ 好的 commit 1: feat(auth): add login form commit 2: feat(auth): add login API call commit 3: feat(auth): add login error handling ❌ 不好的 commit 1: feat(auth): add login (包含了 form API error style)4.2 修改最近一次 commit# 修改 commit messagegitcommit--amend-mfeat(auth): add login validation# 修改内容忘记 add 某个文件gitaddforgotten-file.jsgitcommit--amend--no-edit4.3 修改更早的 commit交互式 rebase# 修改最近 3 次 commitgitrebase-iHEAD~3# 编辑器会显示pick abc1234 feat(auth):addlogin form pick def5678 feat(auth):addlogin API pick ghi9012 fix(auth): fix typo# 把你想修改的那行的 pick 改成 edit 或 reword# edit 修改内容# reword 只修改 message# squash 合并到上一个 commit# drop 删除这个 commit# 例如修改第一个 commitedit abc1234 feat(auth):addlogin form pick def5678 feat(auth):addlogin API pick ghi9012 fix(auth): fix typo五、git stash — 临时存储工作场景你正在开发功能 A突然要修紧急 Bug。# 1. 保存当前工作 gitstash push-mWIP: feature A# 或者更简洁gitstash# 2. 切到 main 修 Bug gitcheckout maingitpull origin maingitcheckout-bhotfix/fix-bug# ... 修 Bug ...gitcommit-mfix: critical buggitpush origin hotfix/fix-bug# 3. 回到功能 A 继续开发 gitcheckout feature/user-login# 恢复之前的工作gitstash pop# 4. stash 操作 gitstash list# 查看所有 stashgitstash pop# 恢复并删除gitstash apply stash{1}# 恢复但不删除gitstash drop stash{0}# 删除指定 stashgitstashclear# 清空所有 stash六、git cherry-pick — 精确移植提交场景你在 feature 分支修了一个 Bug需要把这个修复也同步到 release 分支。# 先找到要移植的 commit hashgitlog--onelinefeature/user-login# 输出abc1234 fix(auth): fix login timeout# 切到目标分支gitcheckout release/v1.2.0# 精确移植这个 commitgitcherry-pick abc1234# 如果有冲突解决后gitcherry-pick--continue# 取消本次 cherry-pickgitcherry-pick--abort七、git bisect — 二分查找 Bug场景你知道某个 commit 引入了 Bug但不知道是哪个。# 启动二分查找gitbisect start# 标记当前版本是有 Bug 的gitbisect bad# 标记某个已知好的版本gitbisect good v1.0.0# Git 会自动 checkout 中间的 commit# 你测试一下然后告诉 Gitgitbisect good# 这个版本没问题# 或gitbisect bad# 这个版本有问题# 重复几次Git 会找到引入 Bug 的第一个 commit# 结束后gitbisect reset八、git log 进阶# 简洁一行显示gitlog--oneline# 带分支图gitlog--oneline--graph--all--decorate# 按时间范围gitlog--since2 weeks agogitlog--since2024-01-01--until2024-01-31# 按作者gitlog--author张三# 按文件gitlog -- src/login.js# 按内容搜索gitlog--grepfix login# 查看每次提交的改动gitlog-p# 查看统计信息gitlog--stat# 自定义格式gitlog--prettyformat:%h - %an, %ar : %s九、git diff 进阶# 工作区 vs 暂存区gitdiff# 暂存区 vs 最新提交gitdiff--staged# 两个 commit 之间的差异gitdiffabc1234 def5678# 两个分支之间的差异gitdiffmain..feature/user-login# 只看文件名gitdiff--statmain..feature/user-login# 按单词比较更精确gitdiff--word-diff十、配置企业 Git Hookspre-commit提交前检查# .husky/pre-commit如果用 husky#!/bin/shnpx lint-staged# lint-staged 配置package.json{lint-staged:{*.{js,ts}:[eslint --fix,prettier --write],*.{css,scss}:[prettier --write],*.{json,md}:[prettier --write]}}commit-msg检查 commit 信息# .husky/commit-msg#!/bin/shnpx commitlint--edit$1pre-push推送前检查# .husky/pre-push#!/bin/shnpmruntest十一、练习清单学完本章请完成以下操作用git add -p把一个文件的改动分多次提交用git stash暂存工作切换分支修 Bug再恢复用git cherry-pick移植一个 commit 到另一个分支用git rebase -i修改/合并/删除最近 3 次 commit用git log --graph --all查看完整的分支图配置 commitlint提交一个不规范的 commit 试试上一章02-企业分支管理策略下一章[04-团队协作与Code Review](04-团队协作与Code Review.md)