跳转到内容

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的对比

特性GitSVN
架构分布式集中式
本地操作完整支持需要联网
分支操作轻量快速重量缓慢
存储方式快照差异
适用场景开源项目、大型团队小型团队、简单项目

2. Git安装与配置

2.1 在Linux上安装Git

CentOS/RHEL:

bash
# 使用yum安装
sudo yum install git

# 或使用dnf(CentOS 8+)
sudo dnf install git

Ubuntu/Debian:

bash
sudo apt update
sudo apt install git

验证安装:

bash
git --version
# 输出:git version 2.x.x

2.2 在Windows上安装Git

  1. 下载安装包:https://git-scm.com/download/win
  2. 运行安装程序,使用默认选项
  3. 验证安装:打开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 commit

3. 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 --all

4. 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.git

4.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 -A

4.4 提交更改

bash
# 基本提交
git commit -m "提交信息"

# 添加并提交(仅对已跟踪文件)
git commit -am "提交信息"

# 修改最后一次提交
git commit --amend -m "新的提交信息"

提交信息规范:

text
类型(范围): 简短描述

详细说明(可选)

相关Issue(可选)

常用类型:

  • feat:新功能
  • fix:修复bug
  • docs:文档更新
  • style:代码格式
  • refactor:重构
  • test:测试相关
  • chore:构建/工具

示例:

bash
git commit -m "feat(auth): 添加用户登录功能

- 实现JWT认证
- 添加登录页面
- 集成第三方登录

Closes #123"

4.5 查看差异

bash
# 查看工作区与暂存区的差异
git diff

# 查看暂存区与最新提交的差异
git diff --staged

# 查看指定文件的差异
git diff filename.txt

4.6 撤销操作

撤销工作区的修改:

bash
# 撤销单个文件的修改
git checkout -- filename.txt

# 撤销所有修改
git checkout -- .

撤销暂存区的文件:

bash
# 将文件从暂存区移回工作区
git reset HEAD filename.txt

撤销提交:

bash
# 撤销最后一次提交(保留修改)
git reset --soft HEAD~1

# 撤销最后一次提交(不保留修改)
git reset --hard HEAD~1

5. 分支管理

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-name

5.3 合并分支

bash
# 切换到目标分支
git checkout main

# 合并指定分支到当前分支
git merge feature-branch

合并方式:

Fast-forward(快进合并):

  • 目标分支没有新提交
  • 直接移动指针

Three-way merge(三方合并):

  • 两个分支都有新提交
  • 创建新的合并提交

5.4 解决合并冲突

当两个分支修改了同一文件的同一部分时,会产生冲突。

冲突标记:

text
<<<<<<< HEAD
当前分支的内容
=======
合并分支的内容
>>>>>>> feature-branch

解决步骤:

  1. 打开冲突文件
  2. 编辑文件,保留需要的代码
  3. 删除冲突标记
  4. 添加文件到暂存区
  5. 提交合并
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-name

6.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 --all

pull 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 -vv

6.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.0

7. 团队协作工作流

7.1 Forking工作流

适用于开源项目:

  1. Fork项目到自己的账号
  2. 克隆自己的仓库
  3. 创建功能分支
  4. 提交更改
  5. 推送到自己的仓库
  6. 创建Pull Request

7.2 Feature Branch工作流

适用于小型团队:

  1. 从main创建功能分支
  2. 在功能分支上开发
  3. 完成后推送到远程
  4. 创建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.0

8. 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 clear

8.2 变基(Rebase)

重新应用提交到另一个基础提交:

bash
# 将当前分支变基到main
git rebase main

# 交互式变基
git rebase -i HEAD~3

rebase vs merge:

  • merge:保留完整历史,创建合并提交
  • rebase:线性历史,重写提交记录

8.3 Cherry-pick

选择性地应用某个提交:

bash
# 应用指定提交到当前分支
git cherry-pick commit-hash

# 应用多个提交
git cherry-pick hash1 hash2 hash3

8.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 --recursive

9. 运维场景应用

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 main

9.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.txt

10.3 修改历史提交

bash
# 修改最后一次提交
git commit --amend

# 修改多个提交(交互式变基)
git rebase -i HEAD~3

# 强制推送(谨慎使用)
git push --force-with-lease

10.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 -20

11. 最佳实践

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工具的集成

参考资源

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径