一、Git 简介
Git 是目前最流行的分布式版本控制系统,用于高效管理项目代码和团队协作。相比传统的集中式版本控制工具(如 SVN),Git 拥有以下特点:
分布式架构:每个开发者都拥有完整的代码仓库副本,支持离线提交
高效的分支管理:分支创建和切换极其轻量,鼓励频繁使用分支
强大的合并能力:支持多种合并策略,灵活整合代码
完整的变更追溯:每次提交都有唯一的哈希标识,历史记录不可篡改
学习 Git 不仅是程序员的基本功,更是高效协作和代码质量保障的关键。
二、Git 核心概念
在开始使用 Git 之前,需要理解四个核心区域:
基本工作流程:
工作区 → git add → 暂存区 → git commit → 本地仓库 → git push → 远程仓库三、Git 安装
Windows
访问 git-scm.com 下载安装包,一路默认安装即可。安装完成后,右键菜单会出现「Git Bash Here」选项。
macOS
# 使用 Homebrew 安装
brew install git
# 或安装 Xcode Command Line Tools(自带 Git)
xcode-select --installLinux(Ubuntu/Debian)
sudo apt update
sudo apt install git安装完成后,验证是否成功:
git --version四、初始配置
配置用户信息
Git 提交时必须关联用户信息,用于标识提交者,是团队协作和代码追溯的基础。
# 全局配置(对所有项目生效)
git config --global user.name "你的姓名"
git config --global user.email "你的邮箱"
# 仅当前项目配置(优先级更高)
git config user.name "项目专用姓名"
git config user.email "项目专用邮箱"建议:确保邮箱与 GitHub/GitLab 账号一致,以便提交记录正确关联。
其他推荐配置
# 启用命令行颜色高亮
git config --global color.ui auto
# 配置默认编辑器
git config --global core.editor "code --wait" # VS Code
git config --global core.editor "vim"
# 跨平台换行符处理(Windows 用户推荐)
git config --global core.autocrlf true
# 查看所有配置
git config --list五、基础操作
1. 创建 / 获取仓库
# 初始化一个新的本地仓库
git init
# 在指定目录下初始化仓库
git init 项目名称
# 克隆远程仓库到本地
git clone https://github.com/用户名/仓库名.git
# 克隆指定分支
git clone -b 分支名 仓库地址
# 浅克隆(仅拉取最近一次提交,加速下载)
git clone <url> --depth=12. 查看状态与历史
# 查看工作区和暂存区状态
git status
git status -s # 精简一行输出
# 查看提交历史
git log
git log --oneline # 一行精简展示
git log --graph --all --oneline # 图形化展示全部分支历史
git log --author="姓名" # 查看某人提交记录
git log --grep="关键词" # 搜索提交信息3. 添加文件到暂存区
git add <文件名> # 添加指定文件
git add . # 添加当前目录所有变更(包括新文件)
git add -u # 只添加已被跟踪的修改/删除文件
git add -A # 添加所有变更4. 提交到本地仓库
git commit -m "提交说明"
# 跳过 add,直接提交已跟踪文件的修改
git commit -am "提交说明"
# 修改最近一次提交(补充遗漏的文件或修改提交信息)
git commit --amend提交信息规范建议:
使用动词开头(如
fix、add、update、refactor)简洁明确,说明「做了什么」和「为什么」
示例:
fix: prevent crash when user input is empty
5. 查看差异
git diff # 工作区 vs 暂存区
git diff --staged # 暂存区 vs 版本库
git diff HEAD # 工作区 vs 最新版本
git diff <commit1> <commit2> # 比较两次提交的差异6. 撤销操作
# 撤销工作区文件的修改
git restore <文件>
# 或(旧命令)
git checkout -- <文件>
# 将文件从暂存区移回工作区
git restore --staged <文件>
# 或(旧命令)
git reset HEAD <文件>
# 回退到指定提交
git reset --soft <commit-id> # 保留工作区和暂存区的改动
git reset --mixed <commit-id> # 保留工作区改动,清空暂存区(默认)
git reset --hard <commit-id> # 丢弃所有改动,谨慎使用!
# 反做某次提交(生成一个新的反向提交,保留历史)
git revert <commit-id>7. 忽略文件(.gitignore)
在项目根目录创建 .gitignore 文件,列出无需 Git 跟踪的文件或目录:
# 依赖目录
node_modules/
vendor/
# 日志文件
*.log
# 环境配置
.env
.env.local
# 操作系统文件
.DS_Store
Thumbs.db
# IDE 配置
.idea/
.vscode/六、分支管理
分支是 Git 的核心功能之一,允许开发者并行开发、互不干扰。
1. 查看与创建分支
# 查看本地分支
git branch
# 查看所有分支(包括远程)
git branch -a
# 创建新分支
git branch <分支名>
# 创建并切换到新分支
git checkout -b <分支名>
# 或(Git 2.23+ 推荐)
git switch -c <分支名>2. 切换分支
git checkout <分支名>
# 或(推荐的新命令)
git switch <分支名>3. 合并分支
# 将指定分支合并到当前分支
git merge <待合并分支>
# 禁用快进合并,保留合并记录(推荐用于公共分支)
git merge --no-ff <待合并分支>4. 删除分支
git branch -d <分支名> # 删除已合并的分支
git branch -D <分支名> # 强制删除未合并的分支5. 重命名分支
git branch -m <旧名称> <新名称>6. Merge vs Rebase
这是 Git 中两个重要且容易混淆的合并方式:
Merge 示例:
git checkout main
git merge feature-login
# 会产生一个新的合并提交Rebase 示例:
git checkout feature-login
git rebase main
# 解决冲突后继续
git add .
git rebase --continue
# 变基后再合并(快进合并,无额外提交)
git checkout main
git merge feature-login⚠️ 重要提醒:永远不要对已经推送到远程的公共分支执行 rebase,否则会导致协作混乱!
七、远程协作
1. 管理远程仓库
# 查看已关联的远程仓库
git remote -v
# 添加远程仓库(origin 为默认别名)
git remote add origin 远程仓库地址
# 修改远程仓库地址
git remote set-url origin 新地址
# 删除远程仓库关联
git remote remove origin2. 推送代码
# 推送本地分支到远程
git push origin <分支名>
# 首次推送并关联远程分支(之后可直接用 git push)
git push -u origin <分支名>
# 强制推送(谨慎使用!会覆盖远程历史)
git push --force origin <分支名>
# 删除远程分支
git push origin --delete <远程分支名>3. 拉取更新
# 获取远程更新但不合并(推荐)
git fetch
git diff origin/main # 先查看差异
# 拉取远程更新并自动合并
git pull origin main
# 拉取并变基(保持历史线性)
git pull --rebase origin main⚠️ 注意:git pull 等价于 git fetch + git merge,可能触发自动合并,若存在冲突需手动解决。
4. 解决合并冲突
当 git pull、git merge 或 git rebase 时,若同一文件被不同分支修改,会触发冲突。
解决步骤:
# 1. 查看冲突文件
git status
# 2. 编辑冲突文件,Git 会标记冲突区域:
# <<<<<<< HEAD
# 当前分支的内容
# =======
# 其他分支的内容
# >>>>>>> 分支名
# 3. 手动删除冲突标记,保留想要的代码
# 4. 标记冲突已解决
git add <文件>
# 5. 继续操作
git merge --continue # merge 场景
git rebase --continue # rebase 场景在 VS Code 等编辑器中,冲突区域上方会提供图形化按钮,可以一键选择保留当前修改、保留远程修改或同时保留两者,非常便捷。
八、Pull Request 工作流
Pull Request(PR)是协作开发的核心环节,用于请求将代码从一个分支合并到另一个分支(通常是 main)。
基本流程
# 1. 创建功能分支
git checkout -b feat/user-login
# 2. 开发并提交
git add .
git commit -m "feat: add user login feature"
# 3. 推送到远程
git push -u origin feat/user-login
# 4. 在 GitHub/GitLab 上创建 Pull Request
# 填写标题、描述,指定审阅者解决 PR 中的冲突
如果 PR 显示与 main 分支有冲突,可以将 main 合并到你的 PR 分支:
git checkout feat/user-login
git pull origin main
# 解决冲突
git add .
git commit -m "resolve conflicts with main"
git push九、标签管理
标签用于标记重要的版本节点(如发布版本)。
# 查看所有标签
git tag
# 创建轻量标签
git tag v1.0.0
# 创建附注标签(推荐,包含详细信息)
git tag -a v1.0.0 -m "Release version 1.0.0"
# 查看标签详情
git show v1.0.0
# 推送标签到远程
git push origin v1.0.0
git push origin --tags # 推送所有标签
# 删除标签
git tag -d v1.0.0 # 本地删除
git push origin --delete v1.0.0 # 远程删除十、进阶技巧
1. git stash:临时保存修改
当你正在开发中,突然需要切换分支处理紧急任务时使用:
# 临时保存当前修改
git stash
git stash save "未完成的登录页逻辑" # 带备注
# 查看所有 stash
git stash list
# 恢复最近一次 stash
git stash pop # 恢复并删除 stash
git stash apply # 恢复但不删除
# 删除 stash
git stash drop2. git cherry-pick:挑选提交
将某个特定提交应用到当前分支,而无需合并整个分支:
git checkout main
git cherry-pick <commit-hash>适用场景:从功能分支中挑选某个已完成的小功能合并到主分支。
3. git reflog:找回丢失的提交
当你误操作 git reset --hard 后,可以通过 reflog 找回丢失的代码:
# 查看所有 HEAD 移动记录
git reflog
# 回到某个历史位置
git checkout HEAD@{3}
# 或基于 reflog 创建新分支恢复
git branch recovery-branch HEAD@{3}Git 会保留所有 HEAD 移动记录(默认 90 天),几乎不可能真正「丢失」提交。
4. git bisect:二分查找 Bug 引入点
当你不确定哪个提交引入了 Bug 时,bisect 可以高效定位:
git bisect start
git bisect bad # 标记当前版本有 Bug
git bisect good <commit-hash> # 标记一个确定没 Bug 的版本
# Git 会自动切换到一个中间版本,测试后标记
git bisect good # 这个版本没问题
# 或
git bisect bad # 这个版本有问题
# 重复上述步骤,Git 最终会找出引入 Bug 的提交
git bisect reset # 结束二分查找5. 交互式变基(整理提交历史)
git rebase -i HEAD~5 # 整理最近 5 次提交交互界面中可以:
pick:保留该提交squash:将该提交合并到上一个提交reword:修改提交信息drop:删除该提交
十一、团队协作工作流
1. GitHub Flow(推荐)
GitHub Flow 是现代团队最常用的分支工作流,强调简单性和持续交付。
核心原则:
单一主分支(
main),始终保持可部署状态所有开发工作在短期功能分支中进行
通过 Pull Request 进行代码审查和合并
合并后自动触发部署
适用场景:大多数团队,特别是采用持续交付/持续部署的团队。
2. Git Flow
适合有正式发布周期的项目,包含五种分支类型:
适用场景:大型团队、版本发布周期明确的项目。
3. 分支命名规范
feat/功能描述 # 新功能开发
fix/问题描述 # Bug 修复
docs/文档说明 # 文档更新
refactor/重构内容 # 代码重构
chore/杂项任务 # 构建、工具链等示例:feat/user-authentication、fix/login-crash
4. 提交信息规范(Conventional Commits)
<type>: <subject>
[optional body]
[optional footer]常用类型:
feat: 新功能fix: Bug 修复docs: 文档更新style: 代码格式调整(不影响功能)refactor: 代码重构perf: 性能优化test: 测试相关chore: 构建或辅助工具变动
示例:
feat: add password reset functionality
- Add reset token generation
- Send email with reset link
- Add password update endpoint
Closes #123十二、命令速查表
十三、常见问题与最佳实践
最佳实践
频繁提交、及时推送:将大功能拆分成小提交,每天结束时推送到远程。
先 fetch 再 merge:使用
git fetch先查看远程变化,再决定如何合并。不要在公共分支上 rebase:
rebase会改变提交历史,仅用于本地分支整理。及时删除已合并的分支:保持分支列表整洁,避免混乱。
使用 .gitignore 忽略无关文件:避免将依赖目录、日志、IDE 配置等提交到仓库。
提交前自查:提交前用
git diff --staged确认修改内容,用git status确认状态。
常见问题排查
以上是 Git 的完整使用教程,从基础操作到进阶技巧,再到团队协作最佳实践。Git 的学习曲线虽然稍陡,但掌握后将成为你开发工作中最得力的工具之一。建议在实践中多加练习,遇到问题时善用 git --help 查看帮助文档。