Git 完全指南:从入门到精通
本文详细介绍 Git 版本控制系统的使用方法,涵盖基础概念、日常操作、分支管理、团队协作等核心内容。
文章目录
- [Git 完全指南:从入门到精通](#Git 完全指南:从入门到精通)
-
- [1. Git 简介](#1. Git 简介)
-
- [1.1 什么是 Git?](#1.1 什么是 Git?)
- [1.2 Git vs 其他版本控制系统](#1.2 Git vs 其他版本控制系统)
- [2. 安装与配置](#2. 安装与配置)
-
- [2.1 安装 Git](#2.1 安装 Git)
- [2.2 验证安装](#2.2 验证安装)
- [2.3 初始配置](#2.3 初始配置)
- [2.4 查看配置](#2.4 查看配置)
- [2.5 配置 SSH 密钥](#2.5 配置 SSH 密钥)
- [3. 基础概念](#3. 基础概念)
-
- [3.1 Git 的三个区域](#3.1 Git 的三个区域)
- [3.2 文件状态](#3.2 文件状态)
- [3.3 Git 对象](#3.3 Git 对象)
- [4. 基本操作](#4. 基本操作)
-
- [4.1 创建仓库](#4.1 创建仓库)
- [4.2 查看状态](#4.2 查看状态)
- [4.3 添加文件到暂存区](#4.3 添加文件到暂存区)
- [4.4 提交更改](#4.4 提交更改)
- [4.5 查看历史](#4.5 查看历史)
- [4.6 查看差异](#4.6 查看差异)
- [4.7 .gitignore 文件](#4.7 .gitignore 文件)
- [5. 分支管理](#5. 分支管理)
-
- [5.1 分支基础](#5.1 分支基础)
- [5.2 创建与切换分支](#5.2 创建与切换分支)
- [5.3 合并分支](#5.3 合并分支)
- [5.4 变基 (Rebase)](#5.4 变基 (Rebase))
- [5.5 删除分支](#5.5 删除分支)
- [5.6 储藏 (Stash)](#5.6 储藏 (Stash))
- [6. 远程仓库](#6. 远程仓库)
-
- [6.1 管理远程仓库](#6.1 管理远程仓库)
- [6.2 拉取与推送](#6.2 拉取与推送)
- [6.3 跟踪分支](#6.3 跟踪分支)
- [7. 撤销与回退](#7. 撤销与回退)
-
- [7.1 撤销工作目录的修改](#7.1 撤销工作目录的修改)
- [7.2 撤销暂存](#7.2 撤销暂存)
- [7.3 回退提交](#7.3 回退提交)
- [7.4 创建撤销提交](#7.4 创建撤销提交)
- [7.5 恢复删除的提交](#7.5 恢复删除的提交)
- [8. 高级技巧](#8. 高级技巧)
-
- [8.1 Cherry-pick](#8.1 Cherry-pick)
- [8.2 标签管理](#8.2 标签管理)
- [8.3 子模块](#8.3 子模块)
- [8.4 Git Bisect](#8.4 Git Bisect)
- [8.5 Git Blame](#8.5 Git Blame)
- [8.6 Git Hooks](#8.6 Git Hooks)
- [8.7 Git Worktree](#8.7 Git Worktree)
- [9. 团队协作工作流](#9. 团队协作工作流)
-
- [9.1 Git Flow](#9.1 Git Flow)
- [9.2 GitHub Flow](#9.2 GitHub Flow)
- [9.3 Trunk-Based Development](#9.3 Trunk-Based Development)
- [9.4 Fork 工作流](#9.4 Fork 工作流)
- [10. 常见问题解决](#10. 常见问题解决)
-
- [10.1 合并冲突](#10.1 合并冲突)
- [10.2 误删分支恢复](#10.2 误删分支恢复)
- [10.3 大文件处理](#10.3 大文件处理)
- [10.4 清理仓库](#10.4 清理仓库)
- [10.5 修改历史提交](#10.5 修改历史提交)
- [10.6 统计信息](#10.6 统计信息)
- 附录:常用命令速查表
1. Git 简介
1.1 什么是 Git?
Git 是一个分布式版本控制系统,由 Linus Torvalds 于 2005 年创建,最初用于管理 Linux 内核开发。它具有以下特点:
- 分布式架构:每个开发者都拥有完整的代码仓库副本
- 高性能:几乎所有操作都在本地执行,速度极快
- 数据完整性:使用 SHA-1 哈希确保数据完整性
- 支持非线性开发:强大的分支和合并能力
1.2 Git vs 其他版本控制系统
| 特性 | Git | SVN | CVS |
|---|---|---|---|
| 架构 | 分布式 | 集中式 | 集中式 |
| 离线工作 | ✅ 完全支持 | ❌ 需要网络 | ❌ 需要网络 |
| 分支开销 | 极低 | 较高 | 高 |
| 速度 | 极快 | 中等 | 慢 |
2. 安装与配置
2.1 安装 Git
Linux (Debian/Ubuntu):
bash
sudo apt update
sudo apt install git
Linux (CentOS/RHEL):
bash
sudo yum install git
# 或者
sudo dnf install git
macOS:
bash
# 使用 Homebrew
brew install git
# 或者安装 Xcode Command Line Tools
xcode-select --install
Windows:
- 下载 Git for Windows
- 或使用 winget:
winget install Git.Git
2.2 验证安装
bash
git --version
# 输出示例: git version 2.43.0
2.3 初始配置
安装完成后,需要配置用户信息:
bash
# 设置用户名(必须)
git config --global user.name "你的名字"
# 设置邮箱(必须)
git config --global user.email "your.email@example.com"
# 设置默认编辑器
git config --global core.editor "vim"
# 或者使用 VS Code
git config --global core.editor "code --wait"
# 设置默认分支名称
git config --global init.defaultBranch main
# 配置换行符处理(跨平台协作时很重要)
# Linux/macOS
git config --global core.autocrlf input
# Windows
git config --global core.autocrlf true
# 启用颜色输出
git config --global color.ui auto
2.4 查看配置
bash
# 查看所有配置
git config --list
# 查看特定配置
git config user.name
# 查看配置来源
git config --list --show-origin
2.5 配置 SSH 密钥
bash
# 生成 SSH 密钥
ssh-keygen -t ed25519 -C "your.email@example.com"
# 启动 ssh-agent
eval "$(ssh-agent -s)"
# 添加私钥
ssh-add ~/.ssh/id_ed25519
# 查看公钥(复制到 GitHub/GitLab)
cat ~/.ssh/id_ed25519.pub
3. 基础概念
3.1 Git 的三个区域
┌─────────────────────────────────────────────────────────────┐
│ 工作目录 (Working Directory) │
│ 你编辑文件的地方 │
└─────────────────────────────────────────────────────────────┘
│
│ git add
▼
┌─────────────────────────────────────────────────────────────┐
│ 暂存区 (Staging Area / Index) │
│ 准备提交的文件快照 │
└─────────────────────────────────────────────────────────────┘
│
│ git commit
▼
┌─────────────────────────────────────────────────────────────┐
│ 本地仓库 (Repository / .git) │
│ 完整的版本历史记录 │
└─────────────────────────────────────────────────────────────┘
3.2 文件状态
Git 中的文件有四种状态:
-
未跟踪 (Untracked):新文件,Git 还不知道它的存在
-
未修改 (Unmodified):文件已被跟踪,但没有改动
-
已修改 (Modified):文件已修改,但还未暂存
-
已暂存 (Staged):文件已添加到暂存区,等待提交
Untracked ──git add──> Staged
│ │
│ │ git commit
│ ▼
│ Unmodified
│ │
│ │ 编辑文件
│ ▼
│ Modified
│ │
└─────────────────────┘
git add
3.3 Git 对象
Git 内部使用三种主要对象:
- Blob:存储文件内容
- Tree:存储目录结构
- Commit:存储提交信息,指向 tree 和父提交
4. 基本操作
4.1 创建仓库
bash
# 方式一:初始化新仓库
mkdir my-project
cd my-project
git init
# 方式二:克隆现有仓库
git clone https://github.com/user/repo.git
git clone git@github.com:user/repo.git # SSH 方式
# 克隆到指定目录
git clone https://github.com/user/repo.git my-folder
# 浅克隆(只获取最近的历史,适合大型仓库)
git clone --depth 1 https://github.com/user/repo.git
4.2 查看状态
bash
# 查看完整状态
git status
# 简洁模式
git status -s
# 输出示例:
# M README.md # 已修改,未暂存
# M src/main.cpp # 已修改,已暂存
# MM config.json # 暂存后又修改
# ?? new-file.txt # 未跟踪
# A added.txt # 新添加到暂存区
# D deleted.txt # 已删除
4.3 添加文件到暂存区
bash
# 添加单个文件
git add filename.txt
# 添加多个文件
git add file1.txt file2.txt
# 添加当前目录所有文件
git add .
# 添加所有已跟踪文件的修改
git add -u
# 添加所有文件(包括未跟踪的)
git add -A
# 交互式添加(可以选择性地暂存文件的部分内容)
git add -p
4.4 提交更改
bash
# 基本提交
git commit -m "提交信息"
# 添加并提交(仅限已跟踪文件)
git commit -am "提交信息"
# 打开编辑器编写详细提交信息
git commit
# 修改最后一次提交
git commit --amend -m "新的提交信息"
# 修改最后一次提交(不改变提交信息)
git commit --amend --no-edit
提交信息规范(推荐):
<类型>(<范围>): <简短描述>
<详细描述>
<关联的 issue>
常用类型:
feat: 新功能fix: 修复 bugdocs: 文档更新style: 代码格式(不影响功能)refactor: 重构test: 测试相关chore: 构建/工具相关
示例:
feat(logger): 添加异步日志支持
- 实现基于无锁队列的异步写入
- 添加配置选项控制队列大小
- 支持优雅关闭,确保日志不丢失
Closes #123
4.5 查看历史
bash
# 查看提交历史
git log
# 简洁模式(一行一个提交)
git log --oneline
# 显示分支图
git log --oneline --graph --all
# 显示最近 n 条
git log -n 5
# 显示文件变更统计
git log --stat
# 显示具体改动
git log -p
# 按作者过滤
git log --author="名字"
# 按日期过滤
git log --since="2024-01-01" --until="2024-12-31"
# 按提交信息搜索
git log --grep="关键词"
# 查看某个文件的历史
git log -- path/to/file
# 美化输出格式
git log --pretty=format:"%h - %an, %ar : %s"
4.6 查看差异
bash
# 查看工作目录与暂存区的差异
git diff
# 查看暂存区与最后一次提交的差异
git diff --staged
git diff --cached # 同上
# 查看工作目录与最后一次提交的差异
git diff HEAD
# 比较两个提交
git diff commit1 commit2
# 比较两个分支
git diff branch1 branch2
# 只查看文件名
git diff --name-only
# 查看统计信息
git diff --stat
4.7 .gitignore 文件
创建 .gitignore 文件来忽略不需要跟踪的文件:
gitignore
# 编译输出
build/
*.o
*.a
*.so
*.exe
# IDE 配置
.idea/
.vscode/
*.swp
# 依赖目录
node_modules/
vendor/
# 日志文件
*.log
logs/
# 环境配置
.env
.env.local
# 操作系统文件
.DS_Store
Thumbs.db
# 临时文件
*.tmp
*.bak
*~
常用规则语法:
*匹配任意字符?匹配单个字符**匹配多级目录!取反(不忽略)/开头表示根目录/结尾表示目录
5. 分支管理
5.1 分支基础
bash
# 查看本地分支
git branch
# 查看所有分支(包括远程)
git branch -a
# 查看分支详情
git branch -v
# 查看已合并/未合并的分支
git branch --merged
git branch --no-merged
5.2 创建与切换分支
bash
# 创建新分支
git branch feature-login
# 切换分支
git checkout feature-login
# 或者(Git 2.23+)
git switch feature-login
# 创建并切换
git checkout -b feature-login
# 或者
git switch -c feature-login
# 基于特定提交创建分支
git checkout -b hotfix abc1234
# 基于远程分支创建本地分支
git checkout -b feature origin/feature
5.3 合并分支
bash
# 切换到目标分支
git checkout main
# 合并分支
git merge feature-login
# 合并时创建合并提交(即使可以快进)
git merge --no-ff feature-login
# 合并时压缩为一个提交
git merge --squash feature-login
git commit -m "合并 feature-login"
合并冲突处理:
bash
# 发生冲突时,文件会包含冲突标记
<<<<<<< HEAD
当前分支的内容
=======
要合并分支的内容
>>>>>>> feature-login
# 手动编辑解决冲突后
git add conflicted-file.txt
git commit
# 或者
git merge --continue
# 放弃合并
git merge --abort
5.4 变基 (Rebase)
bash
# 将当前分支变基到 main
git rebase main
# 交互式变基(可以编辑、合并、删除提交)
git rebase -i HEAD~3
# 交互式变基命令:
# pick = 保留提交
# reword = 保留但修改提交信息
# edit = 保留但停下来修改
# squash = 合并到前一个提交
# fixup = 合并但丢弃提交信息
# drop = 删除提交
# 解决变基冲突后继续
git rebase --continue
# 放弃变基
git rebase --abort
⚠️ 注意:不要对已推送的公共分支进行变基!
5.5 删除分支
bash
# 删除已合并的本地分支
git branch -d feature-login
# 强制删除分支(未合并也删除)
git branch -D feature-login
# 删除远程分支
git push origin --delete feature-login
# 或者
git push origin :feature-login
5.6 储藏 (Stash)
临时保存工作进度:
bash
# 储藏当前修改
git stash
# 储藏并添加描述
git stash save "正在开发登录功能"
# Git 2.13+ 推荐使用
git stash push -m "正在开发登录功能"
# 包含未跟踪文件
git stash -u
# 查看储藏列表
git stash list
# 恢复最近的储藏(保留储藏记录)
git stash apply
# 恢复最近的储藏(删除储藏记录)
git stash pop
# 恢复指定的储藏
git stash apply stash@{2}
# 查看储藏内容
git stash show -p stash@{0}
# 删除储藏
git stash drop stash@{0}
# 清空所有储藏
git stash clear
# 从储藏创建分支
git stash branch new-branch stash@{0}
6. 远程仓库
6.1 管理远程仓库
bash
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
git remote add upstream https://github.com/original/repo.git
# 修改远程仓库 URL
git remote set-url origin git@github.com:user/repo.git
# 重命名远程仓库
git remote rename origin github
# 删除远程仓库
git remote remove upstream
# 查看远程仓库详情
git remote show origin
6.2 拉取与推送
bash
# 获取远程更新(不合并)
git fetch origin
# 获取所有远程仓库的更新
git fetch --all
# 拉取并合并
git pull origin main
# 等同于
git fetch origin
git merge origin/main
# 拉取时使用变基
git pull --rebase origin main
# 推送到远程
git push origin main
# 推送并设置上游分支
git push -u origin main
# 之后可以直接使用
git push
# 推送所有分支
git push --all origin
# 推送标签
git push origin v1.0.0
git push --tags # 推送所有标签
# 强制推送(谨慎使用!)
git push --force origin main
# 更安全的强制推送
git push --force-with-lease origin main
6.3 跟踪分支
bash
# 查看跟踪关系
git branch -vv
# 设置跟踪分支
git branch -u origin/main
git branch --set-upstream-to=origin/main
# 创建跟踪分支
git checkout --track origin/feature
7. 撤销与回退
7.1 撤销工作目录的修改
bash
# 撤销单个文件的修改
git checkout -- filename.txt
# Git 2.23+
git restore filename.txt
# 撤销所有修改
git checkout -- .
git restore .
7.2 撤销暂存
bash
# 取消暂存单个文件
git reset HEAD filename.txt
# Git 2.23+
git restore --staged filename.txt
# 取消暂存所有文件
git reset HEAD
git restore --staged .
7.3 回退提交
bash
# 软回退(保留修改在暂存区)
git reset --soft HEAD~1
# 混合回退(保留修改在工作目录,默认)
git reset HEAD~1
git reset --mixed HEAD~1
# 硬回退(丢弃所有修改)⚠️ 危险操作
git reset --hard HEAD~1
# 回退到指定提交
git reset --hard abc1234
7.4 创建撤销提交
bash
# 创建一个新提交来撤销指定提交(安全,保留历史)
git revert abc1234
# 撤销多个提交
git revert abc1234 def5678
# 撤销范围
git revert HEAD~3..HEAD
# 撤销但不自动提交
git revert --no-commit abc1234
7.5 恢复删除的提交
bash
# 查看所有操作历史
git reflog
# 恢复到之前的状态
git reset --hard HEAD@{2}
# 从 reflog 恢复分支
git checkout -b recovered-branch abc1234
8. 高级技巧
8.1 Cherry-pick
选择性地应用某个提交:
bash
# 应用单个提交
git cherry-pick abc1234
# 应用多个提交
git cherry-pick abc1234 def5678
# 应用但不提交
git cherry-pick --no-commit abc1234
# 解决冲突后继续
git cherry-pick --continue
# 放弃
git cherry-pick --abort
8.2 标签管理
bash
# 创建轻量标签
git tag v1.0.0
# 创建附注标签(推荐)
git tag -a v1.0.0 -m "版本 1.0.0 发布"
# 给历史提交打标签
git tag -a v0.9.0 abc1234 -m "版本 0.9.0"
# 查看标签
git tag
git tag -l "v1.*"
# 查看标签详情
git show v1.0.0
# 删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin --delete v1.0.0
8.3 子模块
bash
# 添加子模块
git submodule add https://github.com/user/lib.git libs/lib
# 克隆包含子模块的仓库
git clone --recursive https://github.com/user/repo.git
# 或者
git clone https://github.com/user/repo.git
git submodule init
git submodule update
# 更新子模块
git submodule update --remote
# 删除子模块
git submodule deinit libs/lib
git rm libs/lib
rm -rf .git/modules/libs/lib
8.4 Git Bisect
二分查找定位问题提交:
bash
# 开始二分查找
git bisect start
# 标记当前版本有问题
git bisect bad
# 标记已知正常的版本
git bisect good v1.0.0
# Git 会自动切换到中间的提交
# 测试后标记结果
git bisect good # 或 git bisect bad
# 重复直到找到问题提交
# 结束查找
git bisect reset
# 自动化测试
git bisect run ./test.sh
8.5 Git Blame
查看每行代码的最后修改者:
bash
# 查看文件每行的作者
git blame filename.txt
# 显示行范围
git blame -L 10,20 filename.txt
# 忽略空白变化
git blame -w filename.txt
# 显示原始提交(跟踪代码移动)
git blame -C filename.txt
8.6 Git Hooks
Git 钩子位于 .git/hooks/ 目录:
常用钩子:
pre-commit: 提交前执行commit-msg: 检查提交信息pre-push: 推送前执行post-merge: 合并后执行
示例 pre-commit 钩子:
bash
#!/bin/bash
# .git/hooks/pre-commit
# 运行代码格式检查
if ! make lint; then
echo "代码格式检查失败,请修复后再提交"
exit 1
fi
# 运行测试
if ! make test; then
echo "测试失败,请修复后再提交"
exit 1
fi
8.7 Git Worktree
同时在多个分支工作:
bash
# 创建新的工作目录
git worktree add ../hotfix hotfix-branch
# 查看工作目录
git worktree list
# 删除工作目录
git worktree remove ../hotfix
# 清理无效的工作目录
git worktree prune
9. 团队协作工作流
9.1 Git Flow
经典的分支管理策略:
main ─────────●─────────────────●─────────────────●────
│ │ │
│ release/1.0 │ │
│ ┌────●───────┤ │
│ │ │ │
develop ──●───┼────┼────●───────●─────●───────────┼────
│ │ │ │ │ │
│ │ │ │ │ │
feature/a ├───┘ │ │ │ │
│ │ │ │
feature/b ─────────┴────┘ │ │
│ │
hotfix/1.0.1 ─────────────────────────┴───────────┘
主要分支:
main: 生产环境代码develop: 开发主分支feature/*: 功能分支release/*: 发布准备分支hotfix/*: 紧急修复分支
9.2 GitHub Flow
更简单的工作流:
bash
# 1. 从 main 创建功能分支
git checkout main
git pull origin main
git checkout -b feature-xxx
# 2. 开发并提交
git add .
git commit -m "feat: 添加新功能"
# 3. 推送到远程
git push -u origin feature-xxx
# 4. 创建 Pull Request
# 5. 代码审查通过后合并
# 6. 删除功能分支
git checkout main
git pull origin main
git branch -d feature-xxx
9.3 Trunk-Based Development
主干开发模式:
- 所有开发者直接向
main提交 - 使用功能开关控制未完成功能
- 频繁集成,快速反馈
9.4 Fork 工作流
开源项目常用:
bash
# 1. Fork 项目到自己的账户
# 2. 克隆自己的 fork
git clone git@github.com:your-username/repo.git
# 3. 添加上游仓库
git remote add upstream https://github.com/original/repo.git
# 4. 保持同步
git fetch upstream
git checkout main
git merge upstream/main
# 5. 创建功能分支
git checkout -b feature-xxx
# 6. 开发完成后推送到自己的 fork
git push origin feature-xxx
# 7. 创建 Pull Request 到上游仓库
10. 常见问题解决
10.1 合并冲突
bash
# 查看冲突文件
git status
# 使用工具解决冲突
git mergetool
# 选择保留某一方的版本
git checkout --ours filename.txt # 保留当前分支
git checkout --theirs filename.txt # 保留合并分支
10.2 误删分支恢复
bash
# 查找删除的分支
git reflog
# 恢复分支
git checkout -b recovered-branch abc1234
10.3 大文件处理
bash
# 安装 Git LFS
git lfs install
# 跟踪大文件
git lfs track "*.psd"
git lfs track "*.zip"
# 查看跟踪的文件类型
git lfs track
# 确保 .gitattributes 被提交
git add .gitattributes
10.4 清理仓库
bash
# 清理未跟踪的文件(预览)
git clean -n
# 清理未跟踪的文件
git clean -f
# 包括目录
git clean -fd
# 包括忽略的文件
git clean -fdx
# 垃圾回收
git gc
# 激进的垃圾回收
git gc --aggressive --prune=now
10.5 修改历史提交
bash
# 修改最近一次提交的作者
git commit --amend --author="New Name <new@email.com>"
# 修改历史提交的作者(交互式变基)
git rebase -i HEAD~5
# 将要修改的提交标记为 edit
# 然后
git commit --amend --author="New Name <new@email.com>"
git rebase --continue
10.6 统计信息
bash
# 查看贡献者统计
git shortlog -sn
# 查看代码行数变化
git diff --stat HEAD~10
# 查看仓库大小
git count-objects -vH
附录:常用命令速查表
| 命令 | 说明 |
|---|---|
git init |
初始化仓库 |
git clone <url> |
克隆仓库 |
git status |
查看状态 |
git add <file> |
添加到暂存区 |
git commit -m "msg" |
提交 |
git push |
推送到远程 |
git pull |
拉取并合并 |
git fetch |
获取远程更新 |
git branch |
查看分支 |
git checkout <branch> |
切换分支 |
git merge <branch> |
合并分支 |
git rebase <branch> |
变基 |
git stash |
储藏修改 |
git log |
查看历史 |
git diff |
查看差异 |
git reset |
回退 |
git revert |
撤销提交 |
git tag |
标签管理 |
git remote |
远程仓库管理 |