1. Git 基础配置与初始化
1.1 用户身份配置
作为开发者使用 Git 的第一步,必须正确配置用户身份信息。这个配置会永久记录在你的每一次代码提交中,相当于你的数字签名。我强烈建议使用与代码托管平台(如 GitHub、GitLab)相同的邮箱地址,这样平台能正确关联你的提交记录和个人账号。
bash复制# 设置全局用户名(建议使用真实姓名或常用ID)
git config --global user.name "你的姓名"
# 设置全局邮箱(必须与代码托管平台账号一致)
git config --global user.email "your.email@example.com"
注意:如果不小心配置错了邮箱,后续的提交记录将无法正确关联到你的代码托管平台账号。我曾经就遇到过因为使用公司邮箱提交开源项目,后来离职后无法证明代码所有权的情况。
1.2 编辑器与基础优化
选择合适的文本编辑器能极大提升 Git 使用体验。我推荐使用 VS Code 作为默认编辑器,它不仅支持 Git 集成,还能在解决冲突时提供可视化界面。
bash复制# 设置 VS Code 为默认编辑器(需先安装VS Code)
git config --global core.editor "code --wait"
# 解决跨平台换行符问题(根据系统选择)
git config --global core.autocrlf true # Windows用户
git config --global core.autocrlf input # macOS/Linux用户
# 启用彩色输出(让命令行更易读)
git config --global color.ui auto
1.3 查看与验证配置
配置完成后,建议检查所有设置是否正确。我习惯使用以下命令验证:
bash复制# 查看所有配置项
git config --list
# 查看特定配置(如用户邮箱)
git config user.email
2. 仓库创建与管理
2.1 本地仓库初始化
创建新项目时,初始化 Git 仓库是第一步。现代 Git 版本(2.28+)建议明确指定初始分支名称,避免使用传统的 master 分支命名。
bash复制# 进入项目目录
cd /path/to/your/project
# 初始化仓库并指定默认分支为main
git init --initial-branch=main
初始化后,你会看到一个隐藏的 .git 目录,这里存储了所有的版本控制信息。千万不要手动修改这个目录下的文件,否则可能导致仓库损坏。
2.2 克隆远程仓库
从现有代码库开始工作时,克隆是最常用的方式。我强烈推荐使用 SSH 协议而非 HTTPS,因为 SSH 不仅更安全,还能避免每次推送都要输入密码的麻烦。
bash复制# 克隆仓库(SSH方式,推荐)
git clone git@github.com:username/repository.git
# 克隆特定分支(节省时间和空间)
git clone -b feature-branch git@github.com:username/repository.git
# 克隆后重命名本地目录
git clone git@github.com:username/repository.git my-project
提示:如果你在克隆时遇到权限问题,可能是 SSH 密钥未正确配置。建议检查 ~/.ssh 目录下是否有 id_rsa 和 id_rsa.pub 文件,并将公钥添加到代码托管平台。
3. 日常开发工作流
3.1 状态检查与变更管理
在开始任何 Git 操作前,检查仓库状态应该是你的第一反应。这个习惯能避免很多低级错误。
bash复制# 查看详细状态
git status
# 简洁状态显示(适合快速查看)
git status -s
状态输出中的标记含义:
- ??:未跟踪的新文件
- M:已修改但未暂存的文件
- A:已暂存待提交的文件
- D:已删除的文件
3.2 代码提交最佳实践
提交代码不是简单的 git commit -m "update",而应该遵循行业规范。好的提交信息能让团队协作更高效。
bash复制# 添加所有变更(包括新文件、修改和删除)
git add .
# 提交变更(使用规范格式)
git commit -m "修复(登录): 解决手机号验证逻辑错误
详细描述问题原因和解决方案,必要时可多行说明。
影响范围:登录模块相关功能"
提交信息规范建议:
- 类型前缀:修复、新增、优化、重构、删除、文档等
- 模块范围:用括号注明影响的模块
- 简短描述:50字内说明主要变更
- 详细说明(可选):空一行后补充细节
3.3 分支管理策略
合理的分支策略是团队协作的基石。我推荐采用 Git Flow 的简化版:
bash复制# 创建功能分支(从开发分支切出)
git checkout -b feature/user-auth dev
# 开发完成后合并到开发分支
git checkout dev
git merge --no-ff feature/user-auth
# 删除已完成的功能分支
git branch -d feature/user-auth
经验分享:使用 --no-ff (no fast-forward) 选项能保留分支合并历史,让项目演进过程更清晰可见。我在大型项目中通过这个方式成功追踪到了三年前某个功能的引入过程。
4. 团队协作与冲突解决
4.1 远程仓库同步
与团队保持代码同步是每日必修课。我建议采用 fetch + merge 而非直接 pull,这样能更清晰地了解变更内容。
bash复制# 获取远程最新变更(不自动合并)
git fetch origin
# 查看远程分支变更
git log origin/main..main
# 合并远程变更到本地
git merge origin/main
4.2 冲突解决实战
冲突不可避免,但处理得当可以变成团队沟通的机会。这是我总结的冲突解决四步法:
- 识别冲突文件(git status 显示 "both modified")
- 打开文件,定位冲突标记(<<<<<<<, =======, >>>>>>>)
- 与团队成员协商确定最终代码
- 标记冲突已解决并继续操作
bash复制# 解决冲突后标记文件
git add conflicted-file.js
# 继续合并/变基
git rebase --continue
# 或
git merge --continue
避坑指南:遇到复杂冲突时,不要盲目接受某一方的修改。我曾经因为直接接受自己的修改而导致重要功能丢失,后来花了三天时间才恢复。建议使用专业的对比工具(如 VS Code 的冲突解决界面)逐行检查。
5. 版本控制与错误恢复
5.1 安全回滚操作
误操作时有发生,Git 提供了多种"后悔药"。关键是要根据情况选择正确的回滚方式。
bash复制# 查看提交历史(获取commit hash)
git log --oneline
# 撤销未暂存的修改(危险!不可恢复)
git checkout -- filename
# 重置到指定提交(三种模式)
git reset --soft HEAD~1 # 仅撤销提交,保留更改
git reset --mixed HEAD~1 # 默认,撤销提交和暂存
git reset --hard HEAD~1 # 彻底删除更改(慎用!)
5.2 已推送代码的回滚
对于已经推送到远程的代码,绝对不能使用 reset --hard,而应该用 revert 创建反向提交。
bash复制# 创建反向提交
git revert bad-commit-hash
# 解决可能的冲突后推送
git push origin main
6. 高级技巧与最佳实践
6.1 使用.gitignore管理忽略文件
正确的.gitignore能避免提交无用文件。我建议项目初始化时就创建好这个文件。
bash复制# 示例.gitignore内容
# 忽略操作系统文件
.DS_Store
Thumbs.db
# 忽略依赖目录
node_modules/
vendor/
# 忽略构建产物
dist/
build/
# 忽略环境配置文件
.env
*.local
常见问题:如果文件已经被跟踪,再添加到.gitignore将不会生效。必须先使用 git rm --cached filename 将其从Git中移除。
6.2 使用stash暂存工作
临时切换分支时,stash是你的好帮手。我习惯给每个stash添加描述,方便后续找回。
bash复制# 暂存当前工作
git stash push -m "正在开发用户权限功能"
# 查看所有暂存
git stash list
# 恢复最近暂存
git stash pop
# 应用特定暂存(不删除)
git stash apply stash@{1}
6.3 二分查找定位问题
当项目突然出现bug时,git bisect能帮你快速定位问题提交。
bash复制# 开始二分查找
git bisect start
# 标记当前版本有问题
git bisect bad
# 标记已知的好版本
git bisect good v1.0.0
# 根据测试结果标记好/坏
git bisect good # 如果当前版本正常
git bisect bad # 如果当前版本有问题
# 结束后重置
git bisect reset
7. 企业级Git工作流建议
7.1 分支策略选择
根据团队规模选择合适的协作模型:
- 小型团队:GitHub Flow(主分支+功能分支)
- 中型团队:简化Git Flow(main + develop + feature)
- 大型项目:完整Git Flow(含release和hotfix)
7.2 代码审查流程
结合Pull Request(MR)进行代码审查是行业标准做法。我建议:
- 功能分支开发完成后发起PR
- 至少一名团队成员审查通过
- 通过CI/CD流水线检查
- 使用 squash merge 保持提交历史整洁
bash复制# 合并PR时压缩提交
git merge --squash feature/awesome
git commit -m "实现用户权限系统 (#123)"
7.3 提交信息规范强制执行
使用commitlint等工具强制规范提交信息格式:
bash复制# 安装commitlint
npm install --save-dev @commitlint/config-conventional @commitlint/cli
# 配置commitlint.config.js
module.exports = {
extends: ['@commitlint/config-conventional']
};
8. 性能优化与疑难解答
8.1 仓库瘦身技巧
长期项目可能会积累大量无用对象,定期清理能提升性能。
bash复制# 删除本地已合并分支
git branch --merged | egrep -v "(^\*|main|dev)" | xargs git branch -d
# 清理孤立对象
git gc --auto
# 深度清理历史大文件(使用BFG工具)
java -jar bfg.jar --strip-blobs-bigger-than 100M your-repo.git
8.2 常见错误解决方案
问题1:fatal: refusing to merge unrelated histories
bash复制# 当合并两个不相关的仓库时
git pull origin main --allow-unrelated-histories
问题2:error: failed to push some refs
bash复制# 通常是因为远程有本地没有的提交
git pull --rebase origin main
git push origin main
问题3:误删分支恢复
bash复制# 使用reflog查找最后提交
git reflog
# 恢复分支
git branch feature/important 1234abc
9. 图形化工具推荐
虽然命令行是Git的核心,但适当使用图形工具能提高效率:
- VS Code Git集成:内置的Git功能足够日常使用
- GitKraken:优秀的跨平台GUI,特别适合分支可视化
- SourceTree:免费的Git/Mercurial客户端
- Lazygit:终端内的交互式Git工具
我个人日常使用VS Code进行大部分Git操作,只在处理复杂合并冲突时会用GitKraken辅助。
10. 持续学习资源
要真正精通Git,我推荐以下进阶资源:
- Pro Git:官方免费电子书(https://git-scm.com/book)
- Git Internals:了解Git底层原理
- Git Katas:实践练习(https://github.com/eficode-academy/git-katas)
- Oh My Git!:游戏化学习Git
记住,Git的精通不在于记住所有命令,而在于理解其工作原理。我花了三年时间才真正理解Git的对象模型,这让我能从容应对各种复杂场景。