主题
Git版本控制基础
课程介绍
Git是目前最流行的分布式版本控制系统,广泛应用于软件开发、运维脚本管理、文档协作等场景。作为运维工程师,掌握Git是必不可少的技能。本课程将从零开始,带你全面了解Git的核心概念、常用命令和最佳实践。
学习目标
完成本课程后,你将能够:
- 理解Git的核心概念和工作原理
- 熟练使用Git进行日常版本控制操作
- 掌握分支管理和团队协作工作流
- 能够解决常见的Git使用问题
- 将Git应用到运维脚本和配置管理中
1. Git概述
1.1 什么是版本控制
版本控制是记录文件变化历史,以便将来查阅特定版本修订情况的系统。
为什么需要版本控制?
| 场景 | 没有版本控制 | 有版本控制 |
|---|---|---|
| 代码回滚 | 手动备份多个副本 | 一键回滚到任意历史版本 |
| 协作开发 | 通过邮件/U盘传递文件 | 多人并行开发,自动合并 |
| 代码审查 | 面对面审查 | 提交记录清晰,在线审查 |
| 问题追踪 | 难以定位问题引入时间 | 通过提交历史快速定位 |
1.2 Git的诞生与发展
Git由Linux之父Linus Torvalds于2005年创建,最初用于管理Linux内核代码。如今Git已成为软件开发行业的标准工具。
Git的特点:
- 分布式:每个开发者都有完整的代码仓库
- 高效:大多数操作在本地完成,速度极快
- 安全:使用SHA-1哈希确保数据完整性
- 灵活:支持多种工作流和分支策略
1.3 Git与SVN的对比
| 特性 | Git | SVN |
|---|---|---|
| 架构 | 分布式 | 集中式 |
| 本地操作 | 完整支持 | 需要联网 |
| 分支操作 | 轻量快速 | 重量缓慢 |
| 存储方式 | 快照 | 差异 |
| 适用场景 | 开源项目、大型团队 | 小型团队、简单项目 |
2. Git安装与配置
2.1 在Linux上安装Git
CentOS/RHEL:
bash
# 使用yum安装
sudo yum install git
# 或使用dnf(CentOS 8+)
sudo dnf install gitUbuntu/Debian:
bash
sudo apt update
sudo apt install git验证安装:
bash
git --version
# 输出:git version 2.x.x2.2 在Windows上安装Git
- 下载安装包:https://git-scm.com/download/win
- 运行安装程序,使用默认选项
- 验证安装:打开Git Bash,运行
git --version
2.3 配置Git
全局配置(必须):
bash
# 配置用户名
git config --global user.name "你的名字"
# 配置邮箱
git config --global user.email "your.email@example.com"查看配置:
bash
# 查看所有配置
git config --list
# 查看特定配置
git config user.name常用配置选项:
bash
# 设置默认编辑器
git config --global core.editor vim
# 设置换行符处理(Windows)
git config --global core.autocrlf true
# 设置换行符处理(Linux/Mac)
git config --global core.autocrlf input
# 设置别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit3. Git基础概念
3.1 工作区、暂存区和版本库
Git有三个核心区域:
text
工作区(Working Directory)
↓ git add
暂存区(Staging Area/Index)
↓ git commit
版本库(Repository)工作区(Working Directory)
- 你实际看到的文件目录
- 可以直接编辑文件
暂存区(Staging Area)
- 临时存放准备提交的修改
- 可以精确控制哪些修改进入下一次提交
版本库(Repository)
- 存储项目的历史版本
- 包含所有提交记录和分支信息
3.2 Git的三种状态
文件在Git中处于三种状态之一:
| 状态 | 说明 | 命令 |
|---|---|---|
| 已修改(Modified) | 文件被修改但未暂存 | 自动检测 |
| 已暂存(Staged) | 修改已添加到暂存区 | git add |
| 已提交(Committed) | 修改已保存到版本库 | git commit |
状态流转图:
text
编辑文件 → 已修改 → git add → 已暂存 → git commit → 已提交3.3 提交(Commit)
提交是Git中的基本单位,代表项目在某个时间点的快照。
提交包含:
- 提交信息(描述这次修改)
- 作者信息
- 时间戳
- 指向父提交的指针
- 完整的文件树快照
提交历史:
bash
# 查看提交历史
git log
# 简洁显示
git log --oneline
# 图形化显示分支
git log --graph --oneline --all4. Git基础操作
4.1 创建仓库
方式一:初始化新仓库
bash
# 创建项目目录
mkdir my-project
cd my-project
# 初始化Git仓库
git init
# 输出:Initialized empty Git repository in /path/to/my-project/.git/方式二:克隆现有仓库
bash
# 克隆远程仓库
git clone https://github.com/username/repository.git
# 克隆到指定目录
git clone https://github.com/username/repository.git my-directory
# 克隆特定分支
git clone -b branch-name https://github.com/username/repository.git4.2 查看状态
bash
# 查看工作区状态
git status
# 简洁状态
git status -s状态符号说明:
??:未跟踪的文件A:新添加到暂存区的文件M:修改过的文件D:删除的文件
4.3 添加文件到暂存区
bash
# 添加单个文件
git add filename.txt
# 添加多个文件
git add file1.txt file2.txt
# 添加所有修改
git add .
# 添加所有修改(包括删除)
git add -A4.4 提交更改
bash
# 基本提交
git commit -m "提交信息"
# 添加并提交(仅对已跟踪文件)
git commit -am "提交信息"
# 修改最后一次提交
git commit --amend -m "新的提交信息"提交信息规范:
text
类型(范围): 简短描述
详细说明(可选)
相关Issue(可选)常用类型:
feat:新功能fix:修复bugdocs:文档更新style:代码格式refactor:重构test:测试相关chore:构建/工具
示例:
bash
git commit -m "feat(auth): 添加用户登录功能
- 实现JWT认证
- 添加登录页面
- 集成第三方登录
Closes #123"4.5 查看差异
bash
# 查看工作区与暂存区的差异
git diff
# 查看暂存区与最新提交的差异
git diff --staged
# 查看指定文件的差异
git diff filename.txt4.6 撤销操作
撤销工作区的修改:
bash
# 撤销单个文件的修改
git checkout -- filename.txt
# 撤销所有修改
git checkout -- .撤销暂存区的文件:
bash
# 将文件从暂存区移回工作区
git reset HEAD filename.txt撤销提交:
bash
# 撤销最后一次提交(保留修改)
git reset --soft HEAD~1
# 撤销最后一次提交(不保留修改)
git reset --hard HEAD~15. 分支管理
5.1 什么是分支
分支是Git的核心特性,允许你从主开发线分离出来,独立进行开发而不影响主线。
分支的优势:
- 并行开发多个功能
- 隔离实验性代码
- 支持多版本维护
- 方便代码审查
5.2 分支基本操作
bash
# 查看分支
git branch
# 查看所有分支(包括远程)
git branch -a
# 创建分支
git branch new-branch
# 切换分支
git checkout new-branch
# 创建并切换分支
git checkout -b new-branch
# 删除分支
git branch -d branch-name
# 强制删除分支
git branch -D branch-name
# 重命名分支
git branch -m old-name new-name5.3 合并分支
bash
# 切换到目标分支
git checkout main
# 合并指定分支到当前分支
git merge feature-branch合并方式:
Fast-forward(快进合并):
- 目标分支没有新提交
- 直接移动指针
Three-way merge(三方合并):
- 两个分支都有新提交
- 创建新的合并提交
5.4 解决合并冲突
当两个分支修改了同一文件的同一部分时,会产生冲突。
冲突标记:
text
<<<<<<< HEAD
当前分支的内容
=======
合并分支的内容
>>>>>>> feature-branch解决步骤:
- 打开冲突文件
- 编辑文件,保留需要的代码
- 删除冲突标记
- 添加文件到暂存区
- 提交合并
bash
# 解决冲突后
git add .
git commit -m "resolve: 解决合并冲突"5.5 分支策略
Git Flow(经典工作流):
text
main: 生产分支
└── develop: 开发分支
├── feature/*: 功能分支
├── release/*: 发布分支
└── hotfix/*: 热修复分支GitHub Flow(简化工作流):
text
main: 主分支
└── feature/*: 功能分支分支命名规范:
feature/:新功能fix/:Bug修复hotfix/:紧急修复release/:发布准备docs/:文档更新
6. 远程仓库操作
6.1 远程仓库基础
查看远程仓库:
bash
# 查看远程仓库列表
git remote -v
# 查看远程仓库详细信息
git remote show origin添加远程仓库:
bash
git remote add origin https://github.com/username/repository.git修改远程仓库:
bash
# 修改URL
git remote set-url origin https://new-url.git
# 重命名
git remote rename old-name new-name
# 删除
git remote remove remote-name6.2 推送与拉取
推送代码:
bash
# 推送到远程仓库
git push origin main
# 推送并建立追踪关系
git push -u origin main
# 推送所有分支
git push --all origin
# 推送标签
git push origin --tags拉取代码:
bash
# 拉取远程更新
git pull origin main
# 获取远程更新但不合并
git fetch origin
# 获取所有分支更新
git fetch --allpull vs fetch:
fetch:下载远程更新,不自动合并pull:下载远程更新并自动合并(fetch + merge)
6.3 分支追踪
设置上游分支:
bash
# 推送并建立追踪
git push -u origin feature-branch
# 手动设置上游
git branch --set-upstream-to=origin/main main查看追踪关系:
bash
git branch -vv6.4 标签管理
创建标签:
bash
# 轻量标签
git tag v1.0.0
# 附注标签(推荐)
git tag -a v1.0.0 -m "版本1.0.0"
# 给特定提交打标签
git tag -a v1.0.0 commit-hash -m "版本1.0.0"推送标签:
bash
# 推送单个标签
git push origin v1.0.0
# 推送所有标签
git push origin --tags删除标签:
bash
# 删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin --delete v1.0.07. 团队协作工作流
7.1 Forking工作流
适用于开源项目:
- Fork项目到自己的账号
- 克隆自己的仓库
- 创建功能分支
- 提交更改
- 推送到自己的仓库
- 创建Pull Request
7.2 Feature Branch工作流
适用于小型团队:
- 从main创建功能分支
- 在功能分支上开发
- 完成后推送到远程
- 创建Pull Request合并到main
7.3 Git Flow工作流
适用于大型项目:
分支结构:
main:生产分支develop:开发分支feature/*:功能分支release/*:发布分支hotfix/*:热修复分支
工作流程:
bash
# 开始新功能
git checkout develop
git checkout -b feature/new-feature
# 完成功能
git checkout develop
git merge feature/new-feature
# 准备发布
git checkout -b release/v1.0.0
# 发布完成
git checkout main
git merge release/v1.0.0
git tag v1.0.08. Git进阶技巧
8.1 储藏(Stash)
临时保存未提交的修改:
bash
# 储藏当前修改
git stash
# 查看储藏列表
git stash list
# 应用最近储藏
git stash apply
# 应用指定储藏
git stash apply stash@'{2}'
# 应用并删除储藏
git stash pop
# 删除储藏
git stash drop stash@'{0}'
# 清空所有储藏
git stash clear8.2 变基(Rebase)
重新应用提交到另一个基础提交:
bash
# 将当前分支变基到main
git rebase main
# 交互式变基
git rebase -i HEAD~3rebase vs merge:
merge:保留完整历史,创建合并提交rebase:线性历史,重写提交记录
8.3 Cherry-pick
选择性地应用某个提交:
bash
# 应用指定提交到当前分支
git cherry-pick commit-hash
# 应用多个提交
git cherry-pick hash1 hash2 hash38.4 子模块(Submodule)
管理项目中的其他Git仓库:
bash
# 添加子模块
git submodule add https://github.com/user/repo.git path/to/submodule
# 克隆包含子模块的项目
git clone --recursive https://github.com/user/main-repo.git
# 更新子模块
git submodule update --init --recursive9. 运维场景应用
9.1 配置文件管理
使用Git管理服务器配置文件:
bash
# 初始化配置仓库
cd /etc
git init
git add .
git commit -m "init: 初始配置文件"
# 修改配置前创建分支
git checkout -b feature/nginx-ssl
# 修改并测试
git add nginx/nginx.conf
git commit -m "feat(nginx): 添加SSL配置"
# 如果出问题,快速回滚
git checkout main9.2 脚本版本控制
管理运维脚本:
bash
# 脚本仓库结构
scripts/
├── backup/
│ ├── mysql-backup.sh
│ └── file-backup.sh
├── deploy/
│ └── auto-deploy.sh
├── monitor/
│ └── health-check.sh
└── README.md
# 提交规范
git commit -m "feat(backup): 添加MySQL增量备份脚本
- 支持按天/周/月备份策略
- 自动清理过期备份
- 发送备份状态通知"9.3 与CI/CD集成
Git触发自动化流程:
yaml
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Deploy to server
run: |
ssh user@server "cd /app && git pull && ./deploy.sh"10. 常见问题与解决方案
10.1 忘记添加文件到.gitignore
bash
# 1. 添加规则到.gitignore
echo "*.log" >> .gitignore
# 2. 从版本库删除但保留本地文件
git rm --cached *.log
# 3. 提交更改
git add .gitignore
git commit -m "chore: 更新.gitignore"10.2 误删文件恢复
bash
# 查看可恢复的文件
git ls-files -d
# 恢复删除的文件
git checkout -- deleted-file.txt
# 从特定提交恢复
git checkout commit-hash -- deleted-file.txt10.3 修改历史提交
bash
# 修改最后一次提交
git commit --amend
# 修改多个提交(交互式变基)
git rebase -i HEAD~3
# 强制推送(谨慎使用)
git push --force-with-lease10.4 大文件处理
使用Git LFS管理大文件:
bash
# 安装Git LFS
git lfs install
# 追踪大文件
git lfs track "*.psd"
git lfs track "*.zip"
# 提交.gitattributes
git add .gitattributes
git commit -m "chore: 配置Git LFS"10.5 仓库瘦身
bash
# 清理未引用的对象
git gc --prune=now --aggressive
# 查看大文件
git rev-list --objects --all | \
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(restpath)' | \
awk '/^blob/ {print $3, $4}' | sort -rn | head -2011. 最佳实践
11.1 提交规范
提交信息格式:
text
类型(范围): 简短描述(50字符以内)
详细说明(可选,每行72字符以内)
相关Issue(可选)提交频率:
- 逻辑完整的修改就提交
- 不要积攒大量修改一次性提交
- 提交前检查修改内容
11.2 分支管理
- main分支保持稳定
- 功能开发使用feature分支
- 定期清理已合并的分支
- 分支命名要有意义
11.3 代码审查
- 提交前自我审查
- 使用Pull Request进行团队审查
- 关注代码质量和提交信息
11.4 备份策略
- 定期推送到远程仓库
- 重要标签及时推送
- 考虑使用多个远程仓库
12. 实用工具推荐
12.1 图形化工具
- SourceTree(免费,跨平台)
- GitKraken(免费版可用)
- GitHub Desktop(免费,简单易用)
- TortoiseGit(Windows,集成资源管理器)
12.2 IDE集成
- VS Code:内置Git支持,插件丰富
- IntelliJ IDEA:强大的Git工具
- Vim/Neovim:fugitive.vim插件
12.3 命令行增强
bash
# 安装zsh和oh-my-zsh
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# Git插件提供别名和自动补全
plugins=(git)总结
Git是现代软件开发和运维管理的必备工具。通过本课程,你应该掌握了:
✅ Git的核心概念和工作原理 ✅ 日常开发中的常用命令 ✅ 分支管理和团队协作 ✅ 远程仓库操作 ✅ 运维场景的实际应用 ✅ 常见问题的解决方案
下一步学习:
- 深入学习Git内部原理
- 探索高级特性如hooks、filter-branch
- 学习Git在大型项目中的最佳实践
- 了解Git与其他DevOps工具的集成