Git 应用与规范指南
- 一、Git 基础概念
- 1. 核心概念
- 2. 安装与配置
- 二、Git 常用命令
- 1. 基础操作命令
- 2. 分支操作命令
- 3. 高级操作命令
- 三、Git 分支命名规范
- 1. 常见分支类型
- 2. 命名规范
- 四、Git 分支管理策略
- 1. Git Flow 工作流
- 2. 其他常用工作流
- 五、代码合并与冲突解决
- 1. 代码合并方法
- 2. 冲突解决步骤
- 六、团队协作最佳实践
- 1. 提交信息规范
- 2. 日常工作流程
- 3. 代码审查流程
- 七、Git 高级功能
- 1. Git Hooks
- 2. Git 子模块
- 3. Git blame
- 八、Git 常见问题解决方案
- 1. 撤销错误提交
- 2. 找回丢失的提交
- 3. 清理未跟踪文件
- 九、Git 工具推荐
- 1. 命令行工具
- 2. GUI工具
一、Git 基础概念
Git 是一个分布式版本控制系统,用于跟踪代码变更、管理项目版本和支持团队协作。
1. 核心概念
- 仓库(Repository):包含项目所有文件和历史记录的目录
- 提交(Commit):记录文件的一组更改,包含作者、时间戳和提交信息
- 分支(Branch):独立的代码开发线路,允许并行开发
- 合并(Merge):将一个分支的更改整合到另一个分支
- 远程仓库(Remote):托管在网络上的仓库副本
- 工作区(Working Directory):本地正在编辑的文件
- 暂存区(Staging Area):准备提交的文件更改集合
- HEAD:指向当前检出分支的最新提交
2. 安装与配置
# 安装完成后配置用户信息gitconfig--globaluser.name"Your Name"gitconfig--globaluser.email"your.email@example.com"# 配置默认编辑器gitconfig--globalcore.editor"code --wait"# 使用VS Code# 查看配置gitconfig--list二、Git 常用命令
1. 基础操作命令
# 初始化新仓库(在当前目录初始化一个新的Git仓库)gitinit# 克隆现有仓库gitclone<repository-url># 示例:克隆一个GitHub仓库gitclone https://github.com/username/project.git# 查看文件状态(检查当前工作区的文件状态)gitstatus# 添加文件到暂存区gitadd<file># 添加单个文件gitadd.# 添加所有更改的文件# 示例:添加单个文件gitaddindex.html# 示例:添加所有修改的文件gitadd.# 提交更改gitcommit-m"提交信息"# 示例:提交带有描述信息的更改gitcommit-m"feat: add login page"# 查看提交历史gitlog# 查看完整的提交历史gitlog--oneline# 简洁格式查看提交历史# 推送更改到远程仓库gitpush origin<branch-name># 示例:将本地main分支推送到远程gitpush origin main# 拉取远程更改gitpull origin<branch-name># 示例:拉取远程develop分支的最新更改gitpull origin develop# 获取远程仓库信息 (查看当前配置的远程仓库)gitremote-v2. 分支操作命令
# 查看所有分支gitbranch# 查看所有分支(包括远程分支)gitbranch-a# 创建新分支gitbranch<branch-name># 示例:创建一个名为feature/login的新分支gitbranch feature/login# 切换分支gitcheckout<branch-name># 示例:切换到develop分支gitcheckout develop# 创建并切换到新分支gitcheckout-b<branch-name># 示例:创建并切换到feature/profile分支gitcheckout-bfeature/profile# 切换分支(推荐新语法,Git 2.23+)gitswitch<branch-name># 示例:切换到develop分支gitswitch develop# 创建并切换到新分支(推荐新语法,Git 2.23+)gitswitch-c<branch-name># 示例:创建并切换到feature/profile分支gitswitch-cfeature/profile# 合并分支gitmerge<branch-name># 将指定分支合并到当前分支# 示例:将feature/login分支合并到当前分支gitmerge feature/login# 删除分支gitbranch-d<branch-name># 删除已合并的分支gitbranch-D<branch-name># 强制删除未合并的分支# 示例:删除已合并的feature/login分支gitbranch-dfeature/login# 示例:强制删除未合并的experimental分支gitbranch-Dexperimental# 推送新分支到远程gitpush-uorigin<branch-name># 示例:推送feature/dashboard分支到远程并设置上游跟踪gitpush-uorigin feature/dashboard3. 高级操作命令
# 暂存当前更改gitstashgitstash list# 查看所有暂存gitstash apply# 应用最近的暂存gitstash drop# 删除最近的暂存gitstash pop# 应用并删除最近的暂存# 示例:暂存当前未提交的更改gitstash# 示例:查看所有暂存记录gitstash list# 示例:应用最近的暂存但不删除gitstash apply# 示例:应用最近的暂存并删除gitstash pop# 撤销工作区更改gitrestore<file># 推荐新语法(Git 2.23+)gitcheckout --<file># 旧语法,与上行等价# 示例:撤销对index.html文件的未提交更改gitrestore index.html# 撤销暂存区更改gitreset HEAD<file># 示例:从暂存区移除app.js文件,但保留工作区更改gitreset HEAD app.js# 撤销暂存区更改(取消暂存,保留工作区更改)gitrestore--staged<file># 推荐新语法(Git 2.23+)gitreset HEAD<file># 旧语法,与上行等价# 示例:从暂存区移除app.js文件,但保留工作区更改gitrestore--stagedapp.js# 回滚提交gitreset--soft<commit-id># 软回滚:只移动提交指针,保留暂存区和工作区gitreset--mixed<commit-id># 混合回滚(默认):保留工作区更改,取消暂存gitreset--hard<commit-id># 硬回滚:丢弃所有之后的更改# 示例:软回滚到上一个提交(保留更改)gitreset--softHEAD~1# 示例:硬回滚到特定提交(丢弃所有之后的更改)gitreset--harda1b2c3d# cherry-pick(选择性合并提交)gitcherry-pick<commit-id># 示例:将特定提交应用到当前分支gitcherry-pick a1b2c3d# 打标签gittag<tag-name># 为当前提交创建标签gittag-a<tag-name>-m"标签信息"gitpush origin<tag-name># 推送标签到远程# 示例:创建轻量标签gittag v1.0.0# 示例:创建带注释的标签gittag-av1.0.0-m"Version 1.0.0 release"# 示例:推送标签到远程gitpush origin v1.0.0三、Git 分支命名规范
1. 常见分支类型
| 分支类型 | 命名格式 | 示例 | 说明 |
|---|---|---|---|
| 主分支 | main/master | main | 稳定可发布的代码,保护分支,禁止直接提交 |
| 开发分支 | develop | develop | 日常开发主分支,功能完成后合并到此 |
| 功能分支 | feature/简短描述 | feature/user-login | 从develop创建,完成后合并回develop |
| Bug 修复分支 | bugfix/简短描述 | bugfix/fix-email-validation | 修复开发中的问题,从develop创建 |
| 发布分支 | release/版本号 | release/1.2.0 | 准备发布版本,从develop创建,完成后合并到main和develop |
| 热修复分支 | hotfix/简短描述 | hotfix/critical-security-fix | 线上紧急修复,从main创建,完成后合并到main和develop |
2. 命名规范
- 使用短横线
-分隔单词(如feature/user-authentication) - 统一前缀(如
feature/、bugfix/)方便分类和筛选 - 保持简短且描述性强,让人一看就知道用途
- 避免特殊字符(如
#、$、@)和空格 - 使用小写字母,提高可读性
- 关联issue号(如有):
feature/issue-123-user-login
四、Git 分支管理策略
1. Git Flow 工作流
Git Flow 是一种成熟的分支管理工作流,适合中大型项目。
2. 其他常用工作流
- 集中式工作流:类似于SVN,只有一个主分支,适合小型团队
- 功能分支工作流:所有功能开发都在专门的功能分支上进行
- Forking工作流:适用于开源项目,开发者fork仓库后提交Pull Request
五、代码合并与冲突解决
1. 代码合并方法
- Merge合并:保留分支历史,创建新的合并提交
# 基本合并命令gitmerge<branch-name># 示例:将feature/homepage分支合并到当前分支gitmerge feature/homepage# 示例:合并时创建详细的合并提交信息gitmerge --no-ff feature/homepage - Rebase变基:将当前分支的提交移到目标分支的最新提交之后,使历史更线性
gitcheckout<branch-name>gitrebase develop# 示例:在feature/profile分支上执行变基操作gitcheckout feature/profilegitrebase develop# 示例:解决变基过程中的冲突后继续变基gitadd.gitrebase--continue
2. 冲突解决步骤
- 识别冲突:Git会标记冲突文件
- 查看冲突:打开冲突文件,查找冲突标记
<<<<<<<,=======,>>>>>>> - 解决冲突:编辑文件,保留正确内容,删除冲突标记
- 标记为已解决:
git add <conflicted-file> - 完成合并:
git commit
# 示例:解决冲突后完成合并# 1. 编辑冲突文件,解决冲突# 2. 标记为已解决gitaddconflicted_file.c# 3. 完成合并gitcommit-m"fix: resolve merge conflict"<<<<<<< HEAD // 当前分支的代码 ======= // 合并分支的代码 >>>>>>> branch-name六、团队协作最佳实践
1. 提交信息规范
统一的提交信息格式能降低团队沟通成本,也便于脚本自动生成 ChangeLog。提交信息遵循以下格式:
type(scope): subject- type(必填):更改类型,只允许使用下表 7 个标识
- scope(可选):更改影响范围,如
auth、ui、api;无明确范围时可省略,直接写type: subject - subject(必填):提交目的的一句话简短描述,建议不超过 50 字,结尾不加句号
- body(可选):更改原因与方案的详细说明,与 subject 之间空一行
- footer(可选):备注或关联 Issue 关闭信息,如
Closes #123
Type:必选项,用于描述本次 commit 更改类型,只允许使用下列 7 个标识,类型后使用英文冒号+空格。
| 序号 | 类型 | 说明 |
|---|---|---|
| 1 | feat | 新功能 |
| 2 | fix | 修补 bug |
| 3 | docs | 修改文档 |
| 4 | style | 格式化代码结构,没有逻辑上的代码修改 |
| 5 | refactor | 重构,即不是新增功能,也不是修改 bug 的代码变动,比如重命名变量 |
| 6 | test | 增加测试代码、单元测试一类的,没有生产代码的变更 |
| 7 | chore | 构建过程或辅助工具的变动(不会影响代码运行) |
推荐:同类型多个内容以逗号分隔,不同类型的提交内容可通过
;格式进行区分提交(建议按照同一类型进行多次提交)。示例:
- 单个类型提交:
feat: 新增登录、注册、账号查询功能,新增密码修改功能- 多个类型提交:
feat: 新增登录功能; fix: 修复登录异常bug
提交示例:
# 单类型、单内容gitcommit-m"docs: 更新分支命名规范说明"# 单类型、多内容(逗号分隔)gitcommit-m"feat: 新增登录、注册、账号查询功能,新增密码修改功能"# 多类型(分号分隔,建议拆分为多次提交)gitcommit-m"feat: 新增登录功能; fix: 修复登录异常bug"# 带 scopegitcommit-m"fix(auth): 修复token过期后未自动跳转登录页的问题"其他提交原则:
- 保持提交粒度合理:每个提交对应一个独立的更改
- 避免大文件提交:使用
.gitignore文件排除临时文件、构建产物等 - 自动化校验:可用「七、Git 高级功能」中的
commit-msg钩子拦截不合规的提交信息
2. 日常工作流程
- 每天开始工作前:
git pull origin develop拉取最新代码 - 开发新功能时:创建专门的功能分支
- 定期同步代码:将
develop分支的更改合并到功能分支 - 完成功能后:提交Pull Request进行代码审查
3. 代码审查流程
- 使用Pull Request/Merge Request进行代码审查
- 至少1-2名团队成员参与审查
- 审查重点:代码质量、功能实现、潜在问题
- 审查通过后再合并到主分支
七、Git 高级功能
1. Git Hooks
Git Hooks 允许在特定Git事件发生时自动执行脚本。
常用钩子:
pre-commit:提交前运行(可用于代码格式化、语法检查等)commit-msg:检查提交信息格式post-commit:提交后运行pre-push:推送前运行
示例.git/hooks/pre-commit脚本:
#!/bin/sh# 运行代码格式化exportPATH=$PATH:/usr/local/bin npx prettier--write.# 添加格式化后的文件gitadd.示例.git/hooks/commit-msg脚本:
#!/bin/sh# 检查提交信息是否符合规范COMMIT_MSG_FILE=$1PATTERN="^(feat|fix|docs|style|refactor|test|chore)(\([^)]+\))?: .{1,50}"if!grep-qE"$PATTERN""$COMMIT_MSG_FILE";thenecho"提交信息不符合规范,请使用: type(scope): subject 或 type: subject"exit1fi2. Git 子模块
用于管理项目中的外部依赖。
# 添加子模块gitsubmoduleadd<repository-url><path># 示例:添加一个UI组件库作为子模块gitsubmoduleaddhttps://github.com/username/ui-components.git src/components/external# 克隆包含子模块的仓库gitclone<repository-url>gitsubmodule update--init--recursive# 示例:克隆包含子模块的仓库并初始化所有子模块gitclone https://github.com/username/main-project.gitgitsubmodule update--init--recursive# 更新子模块gitsubmodule update--remote# 示例:更新所有子模块到最新版本gitsubmodule update--remote--recursive3. Git blame
查看文件每行代码最后一次修改的提交和作者。
gitblame<file># 示例:查看index.js文件每行代码的修改记录gitblame index.js# 示例:只查看index.js文件第10-20行的修改记录gitblame-L10,20index.js八、Git 常见问题解决方案
1. 撤销错误提交
# 撤销最近的提交,但保留更改gitreset--softHEAD~1# 示例:撤销最近一次提交,但保留更改以便修改gitreset--softHEAD~1# 完全撤销最近的提交,丢弃更改gitreset--hardHEAD~1# 示例:彻底撤销最近一次提交,丢弃所有更改gitreset--hardHEAD~1# 撤销已推送到远程的提交(谨慎使用)gitrevert HEAD# 示例:创建一个新提交来撤销上一次提交的更改gitrevert HEAD2. 找回丢失的提交
gitreflog# 查看所有引用历史gitcheckout<commit-id># 检出丢失的提交gitbranch recover-branch# 创建新分支保留该提交# 示例:查看所有操作历史以找到丢失的提交gitreflog# 示例:恢复特定的丢失提交gitcheckout a1b2c3d# 示例:创建新分支来保留找回的提交gitbranch recovered-feature a1b2c3d3. 清理未跟踪文件
gitclean-n# 预览将要删除的文件gitclean-f# 删除未跟踪的文件gitclean-fd# 删除未跟踪的文件和目录gitclean-fx# 删除未跟踪的文件和被忽略的文件# 示例:先预览将要清理的文件gitclean-n# 示例:清理所有未跟踪的文件gitclean-f# 示例:清理所有未跟踪的文件和目录gitclean-fd九、Git 工具推荐
1. 命令行工具
- git-extras:提供额外的Git命令,如git summary、git effort等
- hub:GitHub命令行工具,简化GitHub操作
- git-flow:Git Flow工作流辅助工具,自动化分支管理流程
2. GUI工具
- SourceTree:免费的Git GUI客户端,支持多种Git操作
- GitKraken:直观的Git客户端,支持多种Git托管服务
- GitHub Desktop:GitHub官方客户端,简化GitHub工作流
- VS Code Git集成:轻量级Git操作界面,集成在代码编辑器中
希望本指南能帮助你更好地学习和应用Git进行版本控制和团队协作。Git是一个强大的工具,掌握它将大大提高你的开发效率和代码管理能力。
持续学习,不断实践,你会越来越熟练地使用Git!
本博客为个人技术记录与分享平台,内容基于实践经验整理。如有错误或建议,欢迎在评论区指正,将及时核实并修正。