Git 概述 安装指南 基础操作 核心概念 常用命令 分支管理 远程协作 高级主题 最佳实践 参考资源

掌握 Git,掌控代码

全球最权威的分布式版本控制系统完全指南

Git 是由 Linus Torvalds 于 2005 年创建的分布式版本控制系统,旨在高效地处理从小型到大型项目的所有内容。本指南涵盖从安装配置到高级工作流的完整知识体系,助你成为 Git 专家。

开始学习 官网下载 Git 清华镜像 中科大镜像 淘宝镜像

Git 概述

Git 是一个免费开源的分布式版本控制系统,由 Linux 之父 Linus Torvalds 于 2005 年创建。它的设计目标是速度、数据完整性以及对分布式非线性工作流的强大支持。

与集中式版本控制系统(如 SVN)不同,Git 为每个开发者提供完整的代码仓库副本,包括完整的历史记录。这意味着即使离线,开发者也能进行提交、查看历史、创建分支等操作。

发展历史

2005 年,Linux 内核开发社区与 BitKeeper 的商业授权终止,Linus Torvalds 决定自行开发一款新的版本控制系统。设计目标包括:

  • 速度快
  • 简单的设计
  • 对非线性开发(数千个并行分支)的完全支持
  • 完全分布式
  • 能够高效处理大型项目(如 Linux 内核)

核心特性

  • 分布式架构:每个副本都是完整仓库,不依赖中央服务器
  • 高效分支:轻量级分支,创建与切换几乎瞬时完成
  • 数据完整性:使用 SHA-1 哈希确保内容不被篡改
  • 暂存区:精细控制提交内容,支持多阶段提交
  • 离线工作:本地提交、查看历史、分支操作无需网络
  • 灵活工作流:支持多种协作模式(集中式、功能分支、Forking 等)

Git vs 其他版本控制系统

特性GitSVNMercurial
架构分布式集中式分布式
分支性能极快较慢
离线操作完全支持有限完全支持
数据完整性SHA-1 校验无内置校验SHA-1 校验
社区规模最大中等较小

安装指南

Git 支持 Linux、macOS 和 Windows 系统。安装后,你可以在终端使用 git --version 验证安装是否成功。

Linux

Debian/Ubuntu:

sudo apt update
sudo apt install git

Fedora:

sudo dnf install git

Arch Linux:

sudo pacman -S git

macOS

使用 Homebrew 安装(推荐):

brew install git

或下载官方安装包:

https://git-scm.com/download/mac

Windows

下载官方安装程序:

https://git-scm.com/download/win

或使用 Winget:

winget install --id Git.Git -e --source winget

安装过程中建议选择 "Use Git from Git Bash only" 或 "Git from the command line and also from 3rd-party software"。

首次配置

安装完成后,配置用户名和邮箱(用于提交记录):

git config --global user.name "你的名字"
git config --global user.email "[email protected]"

查看配置:

git config --list

基础操作

初始化仓库

在项目目录中创建新的 Git 仓库:

git init

或克隆远程仓库:

git clone https://github.com/user/repo.git

基本工作流

Git 的典型工作流包含三个区域:

  1. 工作区(Working Directory):你看到的实际文件
  2. 暂存区(Staging Area):准备提交的更改快照
  3. 版本库(Repository):永久保存的提交历史
# 查看文件状态
git status

# 将文件添加到暂存区
git add filename.txt
git add .  # 添加所有更改

# 提交更改
git commit -m "提交说明"

# 查看提交历史
git log --oneline

撤销操作

# 撤销工作区的修改(未 add)
git checkout -- filename.txt

# 取消暂存(已 add 未 commit)
git reset HEAD filename.txt

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

核心概念

三个工作区域

工作区(Working Directory)是你在文件系统中看到的项目文件。暂存区(Index/Staging Area)是一个准备下一次提交的文件列表。版本库(Repository)是 Git 存储项目元数据和对象数据库的地方。

文件在 Git 中有四种状态:未跟踪(Untracked)、已修改(Modified)、已暂存(Staged)、已提交(Committed)。

Git 对象模型

Git 的核心是一个内容寻址文件系统,包含四种基本对象类型:

  • Blob(二进制大对象):存储文件内容
  • Tree(树):存储目录结构和文件名
  • Commit(提交):存储作者、时间、提交信息及指向 tree 的指针
  • Tag(标签):对提交的引用,通常用于版本标记

所有对象都通过 SHA-1 哈希值唯一标识,确保数据完整性。

引用与分支

分支本质上是一个指向提交的轻量级可移动指针。默认分支名为 main(或旧版中的 master)。HEAD 是一个特殊引用,指向当前所在的本地分支。

# 查看分支
git branch

# 创建分支
git branch feature-x

# 切换分支
git checkout feature-x
# 或简写
git switch feature-x

常用命令速查

日常命令

git status              # 查看状态
git add <file>          # 添加文件到暂存区
git add -p              # 交互式选择补丁片段
git commit -m "msg"     # 提交更改
git commit -a -m "msg"  # 跳过 add,直接提交所有修改
git diff                # 查看工作区与暂存区的差异
git diff --cached       # 查看暂存区与最后一次提交的差异
git log --oneline --graph --all  # 图形化查看历史
git show <commit>       # 显示某次提交的详细信息和差异

文件操作

git rm <file>           # 删除文件并暂存
git mv <old> <new>      # 重命名文件并暂存
git restore <file>      # 恢复文件到上次提交状态(Git 2.23+)
git restore --staged <file>  # 取消暂存

历史与回退

git log -p -2           # 查看最近两次提交的差异
git log --author="name" --since="2024-01-01"
git blame <file>        # 逐行查看文件修改作者
git reset --soft HEAD~1  # 撤销最后一次提交,保留更改在暂存区
git reset --mixed HEAD~1 # 撤销最后一次提交,保留更改在工作区
git reset --hard HEAD~1  # 彻底删除最后一次提交及更改(慎用)
git revert <commit>     # 创建新提交来撤销某次提交的更改(安全)

分支管理

创建与切换

git branch              # 列出本地分支
git branch -a           # 列出所有分支(含远程)
git branch <name>       # 创建分支
git checkout <name>     # 切换分支
git checkout -b <name>  # 创建并切换
git switch <name>       # 新命令:切换分支
git switch -c <name>    # 新命令:创建并切换

合并分支

将特性分支合并到主分支:

git checkout main
git merge feature-x

Git 提供两种合并策略:

  • Fast-forward(快进):目标分支没有新提交,直接将指针前移
  • Three-way merge(三方合并):创建一个新的合并提交,包含两个分支的历史

解决冲突

当两个分支修改了同一文件的同一部分,合并时会产生冲突。Git 会在冲突文件中标记冲突区域:

<<<<<<< HEAD
当前分支的内容
=======
被合并分支的内容
>>>>>>> feature-x

手动编辑文件解决冲突后:

git add <file>
git commit

合并策略

git merge --no-ff       # 禁用快进,强制创建合并提交
git merge --squash      # 将分支所有提交压缩为一个提交
git rebase main         # 将当前分支变基到 main 最新提交上

Merge vs Rebase:Merge 保留完整历史但可能产生复杂的提交图;Rebase 产生线性历史但会改写提交记录。在共享分支上避免使用 Rebase。

远程协作

远程仓库配置

git remote -v                    # 查看远程仓库
git remote add origin <url>     # 添加远程仓库
git remote rename old new        # 重命名远程仓库
git remote remove origin         # 删除远程仓库

同步操作

git fetch origin                 # 下载远程分支更新(不合并)
git pull origin main             # fetch + merge
git pull --rebase origin main    # fetch + rebase(推荐)
git push origin main             # 推送到远程
git push -u origin main          # 首次推送并设置上游分支

协作工作流

Forking 工作流:在 GitHub/GitLab 上 Fork 仓库到自己的账号,克隆个人仓库,推送更改后提交 Pull Request。

功能分支工作流:主仓库中创建 feature 分支,完成后通过 Merge Request 合并。

# Fork 工作流示例
git clone https://github.com/your-name/repo.git
git remote add upstream https://github.com/original/repo.git
git fetch upstream
git rebase upstream/main

Pull Request 最佳实践

  • 每个 PR 专注于一个功能或修复
  • 保持提交历史清晰,适当使用 rebase 整理
  • 添加详细的 PR 描述,说明改动原因和测试方法
  • 确保 CI 检查通过后再请求审查
  • 及时响应审查意见,保持沟通礼貌

高级主题

交互式变基

交互式变基允许你修改、合并、删除或重新排序提交:

git rebase -i HEAD~3

常用命令:

  • pick:保留提交
  • reword:修改提交信息
  • squash:合并到上一个提交
  • fixup:类似 squash 但不保留提交信息
  • drop:删除提交

储藏(Stash)

临时保存未提交的更改,以便切换到其他分支:

git stash push -m "描述"   # 储藏更改
git stash list               # 查看储藏列表
git stash pop                # 应用并删除最新储藏
git stash apply stash@{1}    # 应用指定储藏但不删除
git stash drop stash@{0}     # 删除指定储藏

标签管理

标签用于标记重要的提交(如版本发布):

git tag                          # 列出标签
git tag v1.0.0                   # 创建轻量标签
git tag -a v1.0.0 -m "版本 1.0.0"  # 创建附注标签
git push origin v1.0.0           # 推送单个标签
git push origin --tags           # 推送所有标签
git tag -d v1.0.0                # 删除本地标签

拣选(Cherry-pick)

将特定提交应用到当前分支:

git cherry-pick <commit-hash>

适用于将 bug 修复从维护分支应用到主分支等场景。

Git 钩子

钩子是 Git 在特定事件触发时执行的脚本,位于 .git/hooks/ 目录:

  • pre-commit:提交前执行(代码检查)
  • prepare-commit-msg:提交信息编辑前
  • post-merge:合并后执行(如安装依赖)
  • pre-push:推送前执行(运行测试)

配合 Husky 等工具可在团队中共享钩子配置。

子模块

子模块允许你将一个 Git 仓库作为另一个仓库的子目录:

git submodule add https://github.com/user/lib.git libs/lib
git submodule update --init --recursive

最佳实践

提交规范

  • 提交信息使用祈使句(如 "添加搜索功能" 而非 "添加了搜索功能")
  • 标题不超过 50 个字符,正文每行不超过 72 个字符
  • 正文解释为什么做此更改,而非如何更改
  • 使用 Conventional Commits 规范:类型(范围): 描述
feat(auth): 添加 OAuth2 登录支持

实现了 GitHub 和 Google 的 OAuth2 登录,
替代原有的邮箱密码认证方式。

Closes #123

分支策略

Git Flow:适用于有发布周期的项目

  • main:生产分支
  • develop:开发分支
  • feature/*:功能分支
  • release/*:发布分支
  • hotfix/*:紧急修复分支

GitHub Flow:适用于持续部署的项目

  • main 始终可部署
  • 从 main 创建功能分支
  • 通过 PR 审查后合并到 main

实用技巧

  • 使用 .gitignore 排除不需要版本控制的文件(如依赖目录、编译产物、环境配置文件)
  • 定期使用 git gc 清理和优化仓库
  • 使用 git bisect 二分查找引入 bug 的提交
  • 配置别名简化常用命令:git config --global alias.co checkout
  • 使用 git log --all --graph --oneline --decorate 查看完整分支图

参考资源

官方资源

图形化工具

  • GitHub Desktop — 简洁易用的 Git 客户端
  • SourceTree — Atlassian 出品的免费 Git 客户端
  • GitKraken — 跨平台 Git GUI,可视化能力强
  • Fork — macOS/Windows 上快速的 Git 客户端
  • Tower — 专业的 macOS/Windows Git 客户端

代码托管平台

  • GitHub — 全球最大的代码托管平台
  • GitLab — 支持自托管的 DevOps 平台
  • Gitee — 国内知名的代码托管平台
  • Bitbucket — Atlassian 的代码托管服务

学习资源