Git指南¶
目录¶
- 1. 版本控制基础
- 1.1 什么是版本控制
- 1.2 集中式 vs 分布式版本控制
- 1.3 Git简介
- 2. Git基础
- 2.1 安装与配置
- 2.2 Git工作机制
- 2.3 基本操作流程
- 2.4 文件状态
- 3. Git本地操作
- 3.1 初始化仓库
- 3.2 暂存与提交
- 3.3 查看历史
- 3.4 版本切换与回退
- 3.5 工作区操作
- 3.6 Git原理简介
- 4. Git分支管理
- 4.1 分支概述
- 4.2 基本分支操作
- 4.3 分支合并
- 4.4 冲突解决
- 4.5 变基操作
- 5. Git标签
- 5.1 标签概念
- 5.2 标签操作
- 6. Git远程仓库
- 6.1 远程仓库概述
- 6.2 GitHub、Gitee、GitLab介绍
- 6.3 远程仓库操作
- 6.4 SSH免密登录
- 6.5 团队协作机制
- 7. Git工作流
- 7.1 集中式工作流
- 7.2 GitFlow工作流
- 7.3 Forking工作流
- 7.4 企业开发实战
- 8. Git进阶操作
- 8.1 git stash
- 8.2 git cherry-pick
- 8.3 git bisect
- 8.4 git blame
- 9. Git与IDE集成
- 9.1 IDEA中使用Git
- 9.2 Gitignore配置
- 10. Git最佳实践
- 10.1 Commit规范
- 10.2 常见问题解决
- 11. GitLab集成实战
- 11.1 GitLab Webhooks与钉钉集成
1. 版本控制基础¶
1.1 什么是版本控制¶
版本控制是一种记录文件内容变化的系统,它允许你查看历史版本并方便地切换。版本控制的主要功能包括:
- 协同修改:多人并行修改同一文件
- 数据备份:保存当前和历史状态
- 版本管理:高效存储版本(Git采用快照方式)
- 权限控制:对团队成员进行权限管理
- 历史记录:查看修改记录,恢复文件到历史状态
- 分支管理:允许同时推进多个任务
1.2 集中式 vs 分布式版本控制¶
集中式版本控制(如SVN)¶
- 有一个中央服务器保存所有文件版本
- 开发者从服务器获取最新版本
- 缺点:服务器故障时无法工作,离线时无法提交
分布式版本控制(如Git)¶
- 每个客户端都有完整的代码仓库镜像
- 可以离线工作,提交到本地后再同步
- 优点:解决了集中式的单点故障问题
1.3 Git简介¶
Git是最流行的分布式版本控制系统,由Linus Torvalds创建。它具有以下特点: - 快速高效 - 强大的分支管理 - 分布式架构 - 免费开源
2. Git基础¶
2.1 安装与配置¶
安装¶
从 git-scm.com 下载适合你系统的版本并安装。
配置¶
安装后首先配置用户信息:
# 配置用户名
git config --global user.name "你的名字"
# 配置邮箱
git config --global user.email "你的邮箱@example.com"
# 查看配置
git config --list
配置级别优先级:
1. 项目级(--local)
2. 用户级(--global)
3. 系统级(--system)
2.2 Git工作机制¶
Git有三个核心区域:
- 工作区:你实际编辑的文件
- 暂存区:临时保存准备提交的更改
- 本地库:保存历史版本记录
2.3 基本操作流程¶
- 在工作区修改文件
- 将修改添加到暂存区(
git add) - 将暂存区的更改提交到本地库(
git commit)
2.4 文件状态¶
Git中的文件有以下状态: - Untracked:未被Git跟踪 - Tracked:已被Git跟踪 - Staged:已暂存 - Unmodified:未修改 - Modified:已修改
3. Git本地操作¶
3.1 初始化仓库¶
# 创建新仓库
git init
# 克隆现有仓库
git clone <远程仓库地址>
3.2 暂存与提交¶
# 查看状态
git status
# 添加文件到暂存区
git add <文件名>
git add . # 添加所有文件
# 提交到本地库
git commit -m "提交说明"
# 跳过暂存区直接提交已跟踪文件
git commit -a -m "提交说明"
3.3 查看历史¶
# 查看详细历史
git log
# 简洁显示
git log --oneline
# 图形化显示
git log --graph --oneline --all
# 查看最近n次
git log -n <n>
3.4 版本切换与回退¶
# 查看操作记录
git reflog
# 回退版本(删除历史)
git reset --soft <commit-hash> # 只回退HEAD
git reset --mixed <commit-hash> # 回退HEAD和暂存区(默认)
git reset --hard <commit-hash> # 回退所有
# 撤销提交(保留历史)
git revert <commit-hash>
3.5 工作区操作¶
# 撤销工作区修改
git checkout -- <文件名>
git restore <文件名> # Git 2.23+
# 暂存工作进度
git stash
git stash list
git stash pop # 恢复并删除
git stash apply stash@{n} # 恢复指定暂存
git stash drop stash@{n} # 删除指定暂存
git stash clear # 清空所有
3.6 Git原理简介¶
哈希算法¶
Git使用SHA-1哈希算法,特点: - 固定长度输出 - 输入确定则输出确定 - 输入变化则输出变化 - 不可逆
Git保存版本机制¶
Git采用文件系统快照方式,而非增量存储。每次提交创建当前项目状态的快照。
4. Git分支管理¶
4.1 分支概述¶
分支是Git最强大的功能之一,它允许你: - 同时并行开发多个功能 - 隔离不同开发任务 - 一个分支失败不会影响其他分支
Git分支本质上是指向提交的指针。
4.2 基本分支操作¶
# 查看分支
git branch # 本地分支
git branch -a # 所有分支
git branch -v # 详细信息
# 创建分支
git branch <分支名>
# 创建并切换
git checkout -b <分支名>
git switch -c <分支名> # Git 2.23+
# 切换分支
git checkout <分支名>
git switch <分支名> # Git 2.23+
# 删除分支
git branch -d <分支名> # 删除已合并的
git branch -D <分支名> # 强制删除
# 修改分支名
git branch -m <旧名> <新名>
4.3 分支合并¶
# 切换到目标分支
git checkout <目标分支>
# 合并分支
git merge <源分支>
4.4 冲突解决¶
当两个分支修改了同一文件的同一部分时会发生冲突:
- Git会标记冲突文件
- 手动打开文件解决冲突(标记为
<<<<<<<、=======、>>>>>>>) - 标记解决:
git add <冲突文件> - 提交合并:
git commit -m "解决冲突"
4.5 变基操作¶
变基可以将一个分支的修改应用到另一个分支上,使提交历史更清晰:
# 将当前分支变基到目标分支
git rebase <目标分支>
# 交互式变基(整理提交历史)
git rebase -i <commit-hash>
5. Git标签¶
5.1 标签概念¶
标签用于标记项目的重要里程碑(如版本发布),标签是不可移动的。
5.2 标签操作¶
# 查看标签
git tag
# 创建轻量级标签
git tag <标签名>
# 创建带注释的标签
git tag -a <标签名> -m "标签说明"
# 查看标签详情
git show <标签名>
# 推送标签到远程
git push origin <标签名>
git push origin --tags # 推送所有
# 删除标签
git tag -d <标签名> # 本地删除
git push origin --delete <标签名> # 远程删除
6. Git远程仓库¶
6.1 远程仓库概述¶
远程仓库是托管在网络上的Git仓库,用于: - 备份代码 - 团队协作 - 代码分享
6.2 GitHub、Gitee、GitLab介绍¶
GitHub¶
- 全球最大的代码托管平台
- 开源项目聚集地
- 提供企业版
Gitee¶
- 国内的代码托管平台
- 速度快
- 支持中文
GitLab¶
- 可自托管
- 功能强大,适合企业内部使用
- 内置CI/CD
6.3 远程仓库操作¶
# 查看远程仓库
git remote
git remote -v # 详细信息
# 添加远程仓库
git remote add <别名> <地址>
# 推送到远程
git push <别名> <分支>
git push -u origin master # 首次推送设置上游
# 拉取远程
git fetch <别名> # 只获取不合并
git pull <别名> <分支> # 获取并合并
# 删除远程仓库关联
git remote remove <别名>
6.4 SSH免密登录¶
# 生成SSH密钥
ssh-keygen -t rsa -C "你的邮箱@example.com"
# 复制公钥内容
# Windows: ~/.ssh/id_rsa.pub
# Linux/Mac: ~/.ssh/id_rsa.pub
# 在GitHub/Gitee中添加公钥
# 测试连接
ssh -T git@github.com
6.5 团队协作机制¶
团队内协作¶
- 克隆仓库
- 创建分支开发
- 推送到远程
- 其他成员拉取更新
跨团队协作(Forking)¶
- Fork原仓库到自己账户
- 克隆自己的仓库
- 创建分支修改
- 推送并发起Pull Request
- 原仓库维护者审核合并
7. Git工作流¶
7.1 集中式工作流¶
像SVN一样,所有修改都提交到master分支,适合小型团队。
7.2 GitFlow工作流¶
GitFlow是一种成熟的分支管理模型:
- master:生产环境稳定版本
- develop:开发集成分支
- feature/*:功能分支(从develop分出)
- release/*:发布分支(从develop分出)
- hotfix/*:紧急修复分支(从master分出)
7.3 Forking工作流¶
适用于开源项目或不信任贡献者的团队: - 贡献者Fork仓库 - 在自己的仓库开发 - 发起Pull Request - 维护者审核合并
7.4 企业开发实战¶
典型的企业开发流程: 1. 入职获取Git账号 2. 克隆代码,搭建环境 3. 创建feature分支开发 4. 提交前检查(避免提交测试代码) 5. 合并到test分支测试 6. 测试通过后合并到develop 7. 最终合并到master发布
8. Git进阶操作¶
8.1 git stash¶
暂存当前未提交的修改:
# 暂存
git stash save "暂存说明"
# 查看暂存列表
git stash list
# 恢复最近的暂存
git stash pop
# 恢复指定暂存
git stash apply stash@{0}
# 删除暂存
git stash drop stash@{0}
git stash clear # 清空所有
8.2 git cherry-pick¶
选择某个提交应用到当前分支:
git cherry-pick <commit-hash>
适用于: - 在其他分支修复了bug,需要应用到当前分支 - 从一个仓库转移提交到另一个仓库
8.3 git bisect¶
二分查找引入bug的提交:
# 开始查找
git bisect start
# 标记当前版本有问题
git bisect bad
# 标记某个历史版本没问题
git bisect good <commit-hash>
# Git会自动切换到中间版本,测试后继续标记
# 结束查找
git bisect reset
8.4 git blame¶
查看文件每一行的最后修改者:
git blame <文件名>
9. Git与IDE集成¶
9.1 IDEA中使用Git¶
配置与初始化¶
- 安装Git
- 在IDEA中配置Git路径
- VCS → Enable Version Control Integration → 选择Git
基本操作¶
- 添加文件:右键 → Git → Add
- 提交:右键 → Git → Commit Directory 或快捷键 Ctrl+K
- 查看历史:右键 → Git → Show History
分支操作¶
- 创建/切换:右下角Git分支图标
- 合并:右下角Git分支图标 → 选择分支 → Merge
- 冲突解决:IDEA会弹出冲突解决窗口
GitHub集成¶
- File → Settings → Version Control → GitHub
- 登录或使用token
9.2 Gitignore配置¶
什么是.gitignore¶
用于指定Git应该忽略的文件或目录。
配置语法¶
# 注释
*.txt # 忽略所有.txt文件
!important.txt # 不忽略important.txt
/build/ # 忽略build目录
/doc/*.txt # 忽略doc目录下的txt文件
doc/**/*.pdf # 递归忽略doc目录下的pdf文件
常用忽略规则¶
# 编译文件
*.class
target/
build/
# IDE
.idea/
*.iml
*.ipr
*.iws
.vscode/
# 依赖
node_modules/
# 日志
*.log
log/
# 系统
.DS_Store
Thumbs.db
.gitignore不生效¶
# 清除缓存
git rm -r --cached .
git add .
git commit -m "更新.gitignore"
10. Git最佳实践¶
10.1 Commit规范¶
规范格式¶
<type>(<scope>): <subject>
<body>
<footer>
Type类型¶
feat:新功能fix:修复bugdocs:文档style:格式(不影响代码逻辑)refactor:重构perf:性能优化test:测试chore:构建/工具revert:回滚
示例¶
feat(login): 增加手机号登录功能
- 支持手机号验证码登录
- 添加表单验证
10.2 常见问题解决¶
上传大文件(Git LFS)¶
# 安装Git LFS
git lfs install
# 追踪大文件
git lfs track "*.zip"
# 正常提交
git add .gitattributes
git add large-file.zip
git commit -m "添加大文件"
git push
Authentication failed¶
- Windows:控制面板 → 用户账户 → 凭证管理器,删除Git相关凭证
- 命令行:
git config --system --unset credential.helper
! [rejected] master - master (fetch first)¶
git pull --rebase origin master
git push origin master
Your local changes would be overwritten by merge¶
# 方案1:暂存
git stash
git pull
git stash pop
# 方案2:提交本地修改
git add .
git commit -m "保存本地修改"
git pull
11. GitLab集成实战¶
11.1 GitLab Webhooks与钉钉集成¶
当我们push代码、合并代码等操作时,可以通过配置钉钉机器人接收消息通知。
配置钉钉机器人¶
- 找一个钉钉群,在智能群助手中添加机器人
- 选择GitLab机器人
- 给机器人起名字,点击完成
- 复制webhook地址
配置GitLab Webhook¶
- 进入GitLab项目
- 点击 Settings → Integrations
- 添加钉钉webhook URL
- 选择需要提醒的事件
- 点击Add Webhook
测试¶
本地push代码,钉钉群应该能收到消息通知。
通过这个机器人,团队可以方便地管理多个项目,随时了解代码提交、合并等操作。
附录¶
Git常用命令速查¶
# 配置
git config --global user.name "Name"
git config --global user.email "email@example.com"
git config --list
# 初始化
git init
git clone <url>
# 基本操作
git status
git add <file>
git commit -m "message"
# 分支
git branch
git checkout <branch>
git merge <branch>
# 远程
git remote -v
git push origin <branch>
git pull origin <branch>