Git 版本控制系统 详解

Git 是一个分布式版本控制系统,用于跟踪文件变化,协调多人协作开发。

Git简介

Git是由Linus Torvalds为Linux内核开发而创建的分布式版本控制系统。主要特点:

  • 分布式:每个开发者都有完整的代码仓库副本
  • 高效:快速的分支切换和合并操作
  • 安全:使用SHA-1哈希保证数据完整性
  • 灵活:支持多种工作流程和协作模式

基本概念

仓库 (Repository)

存储项目历史记录和元数据的地方

提交 (Commit)

项目历史中的一个快照,包含变更描述

分支 (Branch)

独立开发线,用于隔离不同功能开发

暂存区 (Staging Area)

准备提交的文件临时存储区

远程仓库 (Remote)

托管在服务器上的共享仓库

合并 (Merge)

将不同分支的更改整合到一起

Git工作流程

Git工作流程

安装与配置

安装Git

# Ubuntu/Debian
sudo apt-get install git

# CentOS/RHEL
sudo yum install git

# macOS
brew install git

配置用户信息

git config --global user.name "你的姓名"
git config --global user.email "你的邮箱"
git config --global core.editor "vim"

常用Git命令

仓库操作

命令 说明 示例
git init 初始化新仓库 git init project-name
git clone 克隆远程仓库 git clone https://github.com/user/repo.git
git status 查看仓库状态 git status

文件操作

命令 说明 示例
git add 添加文件到暂存区 git add file.txt
git commit 提交更改 git commit -m "描述"
git rm 删除文件 git rm file.txt
git mv 移动或重命名文件 git mv old.txt new.txt

分支操作

命令 说明 示例
git branch 列出、创建或删除分支 git branch feature
git checkout 切换分支 git checkout feature
git merge 合并分支 git merge feature
git rebase 变基分支 git rebase main

远程操作

命令 说明 示例
git push 推送到远程仓库 git push origin main
git pull 从远程拉取更新 git pull origin main
git fetch 获取远程更新 git fetch origin
git remote 管理远程仓库 git remote -v

详细使用示例

1. 创建新项目

# 创建项目目录
mkdir my-project
cd my-project

# 初始化Git仓库
git init

# 添加远程仓库
git remote add origin https://github.com/user/my-project.git

2. 基本工作流程

# 查看状态
git status

# 添加文件到暂存区
git add .

# 提交更改
git commit -m "初始化项目"

# 推送到远程仓库
git push -u origin main

3. 分支管理

# 创建新分支
git branch feature-login

# 切换到新分支
git checkout feature-login
# 或者使用简写
git switch feature-login

# 在新分支上开发
git add .
git commit -m "实现登录功能"

# 切换回主分支
git checkout main

# 合并功能分支
git merge feature-login

# 删除已合并的分支
git branch -d feature-login

4. 查看历史记录

# 查看提交历史
git log

# 简洁格式查看
git log --oneline

# 查看图形化历史
git log --graph --oneline --all

# 查看特定文件的更改历史
git log -p file.txt

5. 撤销更改

# 撤销工作区的修改
git checkout -- file.txt

# 撤销暂存区的文件(取消add)
git reset HEAD file.txt

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

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

# 恢复已删除的文件
git checkout HEAD -- deleted-file.txt

6. 标签管理

# 创建标签
git tag v1.0.0

# 创建带注释的标签
git tag -a v1.0.0 -m "版本1.0.0发布"

# 查看标签
git tag

# 推送标签到远程
git push origin v1.0.0

# 推送所有标签
git push origin --tags

7. 储藏更改

# 储藏当前工作
git stash

# 查看储藏列表
git stash list

# 恢复最近储藏
git stash pop

# 应用特定储藏
git stash apply stash@{1}

# 删除储藏
git stash drop stash@{0}

8. 解决冲突

# 合并时发生冲突
git merge feature-branch

# 查看冲突文件
git status

# 手动解决冲突后标记为已解决
git add resolved-file.txt

# 完成合并
git commit

Git配置技巧

常用配置选项

# 设置默认编辑器
git config --global core.editor "vim"

# 设置差异工具
git config --global merge.tool "vimdiff"

# 设置别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

# 颜色输出
git config --global color.ui auto

# 设置默认分支名称
git config --global init.defaultBranch main

忽略文件配置

创建 .gitignore 文件:

# 编译输出
*.class
*.exe
*.dll

# 日志文件
*.log

# 依赖目录
node_modules/
vendor/

# 系统文件
.DS_Store
Thumbs.db

# 编辑器文件
.vscode/
.idea/

工作流程模型

1. 集中式工作流

类似SVN,所有开发者直接向主分支提交代码。

2. 功能分支工作流

每个新功能在独立分支开发,完成后合并到主分支。

3. Gitflow工作流

严格的分支模型,包含功能分支、发布分支、热修复分支等。

4. Forking工作流

每个开发者fork主仓库,通过Pull Request贡献代码。

高级功能

1. 二分查找

# 开始二分查找
git bisect start

# 标记错误提交
git bisect bad

# 标记正确提交
git bisect good v1.0.0

# Git会自动在中间提交测试,直到找到问题提交

2. 子模块

# 添加子模块
git submodule add https://github.com/user/lib.git

# 初始化子模块
git submodule init

# 更新子模块
git submodule update

3. 钩子脚本

.git/hooks/ 目录下添加脚本,在特定事件发生时自动执行。

常见问题与解决方案

问题 解决方案
提交了错误信息 git commit --amend
提交了错误文件 git reset HEAD~1
分支合并错误 git merge --abort
需要撤销远程提交 git revert <commit>
找回删除的分支 git reflog

最佳实践

  • 提交信息要清晰明确,说明做了什么和为什么
  • 保持提交的原子性,每个提交只做一个逻辑更改
  • 频繁提交,避免大而复杂的提交
  • 在合并前先拉取最新代码
  • 使用分支进行功能开发
  • 定期清理不需要的分支
  • 使用.gitignore文件避免提交不必要的文件

相关工具

  • GitHub - 代码托管平台
  • GitLab - 自托管的Git仓库管理
  • Bitbucket - Atlassian的代码托管服务
  • Sourcetree - 图形化Git客户端
  • GitKraken - 跨平台Git图形客户端