Git 黑科技手册:告别混乱,图解24个核心Git命令+掌握技巧成为版本控制大师!
还在为代码冲突、分支混乱和提交历史一团糟而头疼?这份 Git 终极指南 将彻底改变你的开发体验!从零基础到高阶技巧,覆盖 仓库管理、分支策略、高效协作、撤销回退、标签发布 等核心场景,搭配 清晰图解 + 实战命令,让你轻松玩转 Git!🔥 为什么你需要这份指南?✔ 告别 Git 恐惧症:从 git init 到 git rebase,手把手教你每一步!✔ 团队协作无忧:掌握 fetch、pull
·

肖哥弹架构 跟大家“弹弹” Git 设计与实战应用,需要代码关注
欢迎 关注,点赞,留言。
关注公号Solomon肖哥弹架构获取更多精彩内容
历史热点文章
- MyCat应用实战:分布式数据库中间件的实践与优化(篇幅一)
- 图解深度剖析:MyCat 架构设计与组件协同 (篇幅二)
- 一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO
- 写代码总被Dis:5个项目案例带你掌握SOLID技巧,代码有架构风格
- 里氏替换原则在金融交易系统中的实践,再不懂你咬我
还在为代码冲突、分支混乱和提交历史一团糟而头疼?这份 Git 终极指南 将彻底改变你的开发体验!从零基础到高阶技巧,覆盖 仓库管理、分支策略、高效协作、撤销回退、标签发布 等核心场景,搭配 清晰图解 + 实战命令,让你轻松玩转 Git!
🔥 为什么你需要这份指南?
✔ 告别 Git 恐惧症:从 git init 到 git rebase,手把手教你每一步!
✔ 团队协作无忧:掌握 fetch、pull、push 的正确姿势,避免代码灾难!
✔ 高级操作揭秘:用 bisect 快速定位 Bug,用 cherry-pick 精准移植提交!
✔ 效率翻倍技巧:别名配置、钩子脚本、垃圾回收,让你的 Git 快到飞起!
1、Git 核心架构分层

1. 工作区(Working Directory)
- 作用:用户直接编辑的目录
- 特点:
- 包含
.git子目录(仓库本体) - 文件状态分为:未跟踪/已修改/已暂存
- 包含
2. 暂存区(Staging Area / Index)
- 作用:临时存储即将提交的变更
- 底层实现:
- 二进制文件
.git/index记录文件快照 - 存储文件的 SHA-1 哈希、时间戳和路径
- 二进制文件
3. 本地仓库(Local Repository)
- 组成:
- 对象数据库
.git/objects/ - 引用数据库
.git/refs/
- 对象数据库
- 持久化存储所有版本数据
4. 远程仓库(Remote Repository)
- 协议支持:HTTPS/SSH/Git 协议
- 典型交互:
git push origin main # 推送 git fetch origin # 获取
2、仓库初始化与克隆

| 命令 | 作用 | 示例 |
|---|---|---|
git init |
初始化新仓库 | git init my-project |
git clone |
克隆远程仓库 | git clone https://github.com/user/repo.git |
git remote add |
添加远程仓库 | git remote add origin https://github.com/user/repo.git |
2.0 典型工作流

2.1. git init - 初始化新仓库
2.1.1 作用
- 将当前目录转换为 Git 仓库,创建
.git子目录(存储所有版本控制数据) - 本质:生成 Git 的对象数据库、引用数据库和基础配置文件
2.1.2 示例
# 在当前目录初始化仓库
git init
# 指定目录初始化(自动创建目录)
git init my-project
执行后目录结构:
my-project/
└── .git/ # Git核心数据库
├── objects/ # 存储所有Git对象
├── refs/ # 存储分支和标签引用
└── HEAD # 指向当前分支
2.1.3 使用场景
- 从零开始一个新项目
- 将现有非Git项目纳入版本控制
- 注意:初始化后需手动添加文件(
git add)和提交(git commit)
2.2. git clone - 克隆远程仓库
2.2.1 作用
- 完整复制远程仓库到本地(包括历史记录、分支和配置)
- 自动完成:
- 创建远程跟踪分支(如
origin/main) - 设置默认上游分支
- 创建远程跟踪分支(如
2.2.2 示例
# 克隆默认分支(通常是main/master)
git clone https://github.com/user/repo.git
# 克隆到指定目录
git clone https://github.com/user/repo.git my-local-folder
# 克隆特定分支
git clone -b develop https://github.com/user/repo.git
2.2.3 高级用法
# 浅克隆(只获取最近历史,节省时间/空间)
git clone --depth 1 https://github.com/user/repo.git
# 克隆子模块(递归依赖)
git clone --recursive https://github.com/user/repo.git
2.2.4 使用场景
- 获取开源项目代码
- 加入团队项目开发
- 需要快速获取项目历史(无需从头
init+ 手动添加远程)
2.3. git remote add - 添加远程仓库
2.3.1 作用
- 为本地仓库关联一个远程仓库(通常命名为
origin) - 关键点:
- 本地仓库可关联多个远程仓库
- 远程地址支持 HTTPS/SSH 协议
2.3.2 示例
# 添加主远程仓库(通常命名为origin)
git remote add origin https://github.com/user/repo.git
# 添加其他远程仓库(如团队其他成员)
git remote add teammate https://github.com/teammate/repo.git
2.3.3 查看与管理远程仓库
# 查看所有远程仓库
git remote -v
# 删除远程仓库关联
git remote remove origin
# 修改远程仓库URL
git remote set-url origin git@github.com:user/repo.git
2.3.4 使用场景
- 本地
init后需要关联远程仓库 - 需要同时推送代码到多个仓库(如GitHub + Gitee)
- 典型工作流:
git init git add . git commit -m "Initial commit" git remote add origin https://github.com/user/repo.git git push -u origin main
3、基础工作流
3.0 流程图
3.0.1 Git 工作区状态流转图

3.0.2 完整工作流

3.1. 文件状态管理
| 命令 | 作用 | 示例 |
|---|---|---|
git status |
查看工作区状态 | git status -s (简洁模式) |
git add |
添加文件到暂存区 | git add file.txt git add . (添加所有) |
git restore |
撤销工作区修改 | git restore file.txt |
git restore --staged |
撤销暂存区修改 | git restore --staged file.txt |
git rm |
删除文件并暂存 | git rm file.txt |
1. git status - 查看工作区状态
1.1 作用
- 显示工作目录和暂存区的当前状态
- 标识以下文件状态:
- 未跟踪(Untracked):新文件未被 Git 管理
- 已修改(Modified):文件内容发生变化
- 已暂存(Staged):修改已添加到暂存区
1.2 示例
# 完整输出(显示详细状态和操作提示)
git status
# 简洁模式(适合快速查看)
git status -s
简洁模式输出符号说明:
?? 新文件未跟踪
A 新增到暂存区
M 文件已修改
M 工作区修改未暂存
M 暂存区修改未提交
D 文件已删除
1.3 使用场景
- 提交代码前检查哪些文件有变更
- 解决合并冲突后确认文件状态
- 快速查看当前分支与远程的同步状态
2. git add - 添加文件到暂存区
2.1 作用
- 将工作区的修改添加到暂存区(Stage)
- 本质是将文件当前状态生成快照(Blob对象)
2.2 示例
# 添加单个文件
git add README.md
# 添加所有修改(包括新文件和删除操作)
git add .
# 交互式添加(选择性地暂存修改)
git add -p
交互模式操作选项:
y - 暂存当前区块
n - 跳过当前区块
s - 分割区块
e - 手动编辑区块
2.3 使用场景
- 准备提交前选择要包含的修改
- 分多次提交时选择性暂存文件
- 恢复误删文件(
git add已删除文件等同于git rm)
3. git restore - 撤销工作区修改
3.1 作用
- 撤销工作目录中的修改(恢复到暂存区或最近提交的状态)
- 替代旧版
git checkout -- <file>命令
3.2 示例
# 撤销工作区单个文件的修改
git restore file.txt
# 撤销所有工作区修改(危险!不可恢复)
git restore .
# 从暂存区恢复文件到工作区(取消暂存)
git restore --staged file.txt
3.3 使用场景
- 丢弃实验性代码修改
- 取消误操作导致的文件变更
- 恢复被错误覆盖的文件
4. git rm - 删除文件并暂存
4.1 作用
- 从工作区和暂存区同时删除文件
- 等效于手动删除文件后执行
git add
4.2 示例
# 删除文件并自动暂存
git rm old_file.txt
# 删除暂存区文件但保留工作区文件
git rm --cached log.txt
# 强制删除已修改文件(未提交的变更会丢失)
git rm -f locked_file.txt
4.3 使用场景
- 从版本控制中移除不需要的文件
- 将文件移出 Git 管理但保留本地文件(
.gitignore忘记添加时补救) - 清理大型二进制文件以减小仓库体积
5. 典型工作流示例
# 1. 开发新功能
echo "新功能代码" >> feature.py
# 2. 检查变更
git status -s
# 输出:?? feature.py
# 3. 添加到暂存区
git add feature.py
# 4. 发现错误需要撤销
git restore --staged feature.py
# 5. 重新修改后提交
git add feature.py
git commit -m "添加新功能"
6. 命令对比总结
| 命令 | 影响范围 | 常用场景 | 危险等级 |
|---|---|---|---|
git status |
只读 | 查看变更 | 安全 |
git add |
工作区 → 暂存区 | 准备提交 | 中等(可恢复) |
git restore |
撤销工作区/暂存区修改 | 回退变更 | 高危(不可逆) |
git rm |
删除工作区+暂存区文件 | 清理文件 | 高危(需确认) |
3.2. 提交变更
| 命令 | 作用 | 示例 |
|---|---|---|
git commit |
提交变更 | git commit -m "fix: 修复登录bug" |
git commit --amend |
修改最后一次提交 | git commit --amend --no-edit (不修改消息) |
1. git commit - 提交变更到本地仓库
1.1 作用
- 将暂存区(Staging Area) 的变更永久记录到本地仓库
- 生成一个新的Commit 对象,包含:
- 当前暂存区的文件快照(Tree 对象)
- 父提交指针(形成版本历史链)
- 提交者信息(取自
user.name和user.email) - 提交消息(Commit Message)
1.2 示例
# 标准提交(必须附带提交信息)
git commit -m "fix: 修复登录页面的空指针异常"
# 修改最近一次提交(追加变更或修改提交信息)
git commit --amend -m "fix: 修复登录逻辑和样式问题"
# 自动暂存已跟踪文件的修改并提交(跳过 `git add`)
git commit -a -m "chore: 优化代码格式"
# 提交并添加 GPG 签名(提高安全性)
git commit -S -m "feat: 新增支付功能"
1.3 使用场景
- 常规提交:完成一个功能或修复后,提交代码到本地仓库
- 修正提交:发现漏改文件或提交信息错误时,使用
--amend修补 - 紧急修复:使用
-a快速提交已跟踪文件的变更(适合紧急补丁) - 规范提交:遵循
Conventional Commits规范(如feat:、fix:)
1.4 注意事项
--amend会修改提交历史,若已推送远程需强制更新(git push --force)-a不会自动提交新文件(未git add的文件仍需手动添加)- 提交信息应清晰明确,便于后续代码审查和版本回溯
4、分支管理

| 命令 | 作用 | 示例 |
|---|---|---|
git branch |
查看/创建分支 | git branch feature-login |
git checkout |
切换分支 | git checkout main |
git switch |
(新版) 切换分支 | git switch feature-login |
git merge |
合并分支 | git merge feature-login |
git rebase |
变基分支 | git rebase main |
git branch -d |
删除分支 | git branch -d feature-old |
4.0 实践流程图

4.1. git branch - 查看/创建分支
4.1.1 作用
- 查看分支:列出所有本地分支(当前分支前带
*标记) - 创建分支:基于当前提交新建分支(不自动切换)
4.1.2 示例
# 查看本地分支
git branch
# 输出:
# * main
# feature-login
# 创建新分支
git branch feature-payment
# 查看远程分支
git branch -r
# 查看所有分支(本地+远程)
git branch -a
4.1.3 使用场景
- 开发新功能前创建独立分支
- 修复 Bug 时创建临时分支
- 查看当前仓库分支结构
4.2. git checkout - 切换分支
4.2.1 作用
- 切换到指定分支(更新工作目录文件)
- 可基于远程分支创建本地分支
4.2.2 示例
# 切换到现有分支
git checkout main
# 创建并切换到新分支(等效于 git switch -c)
git checkout -b feature-search
# 基于远程分支创建本地分支
git checkout -b hotfix origin/hotfix
4.2.3 注意事项
- 切换前需提交或暂存当前修改(否则会提示冲突)
- 旧版 Git 中也可用于恢复文件(新版推荐用
git restore)
4.3. git switch - (新版) 切换分支
4.3.1 作用
- 专用于分支切换的命令(Git 2.23+ 引入)
- 比
checkout更语义化,降低误操作风险
4.3.2 示例
# 切换到现有分支
git switch main
# 创建并切换到新分支
git switch -c feature-auth
4.3.3 与 checkout 的区别
| 命令 | 推荐用途 | 可替代旧命令 |
|---|---|---|
git switch |
仅分支切换 | git checkout <branch> |
git restore |
仅文件恢复 | git checkout -- <file> |
4.4. git merge - 合并分支
4.4.1 作用
- 将指定分支的变更合并到当前分支
- 生成一个新的合并提交(Merge Commit)
4.4.2 示例
# 将 feature-login 合并到当前分支
git merge feature-login
# 禁用快进合并(强制生成合并提交)
git merge --no-ff feature-login
4.4.3 合并策略
- 快进合并(Fast-forward) :当目标分支是当前分支的直接后继时
- 三方合并:当分支出现分叉时需解决冲突
4.4.4 使用场景
- 功能开发完成后合并到主分支
- 同步其他成员的修改到本地分支
4.5. git rebase - 变基分支
4.5.1 作用
- 将当前分支的提交"移植"到目标分支最新提交之后
- 可生成更线性的提交历史
4.5.2 示例
# 将当前分支变基到 main
git rebase main
# 交互式变基(可修改提交历史)
git rebase -i HEAD~3
4.5.3 与 merge 的区别
| merge | rebase | |
|---|---|---|
| 历史记录 | 保留分支结构 | 线性历史 |
| 冲突处理 | 最后解决一次 | 可能需多次解决 |
| 适用场景 | 公共分支合并 | 本地分支整理 |
4.5.4 注意事项
- 不要对已推送的公共分支执行 rebase
4.6. git branch -d - 删除分支
4.6.1 作用
- 删除已合并的分支(安全删除)
-D强制删除未合并分支
4.6.2 示例
# 安全删除已合并分支
git branch -d feature-old
# 强制删除未合并分支
git branch -D experiment
4.6.3 使用场景
- 清理已完成功能的分支
- 删除实验性废弃分支
4.6 命令对比总结
| 命令 | 影响范围 | 常用场景 | 危险等级 |
|---|---|---|---|
git branch |
本地分支列表/创建 | 查看分支结构、创建新分支 | 安全 |
git checkout |
切换分支/恢复文件 | 旧版Git环境操作 | 中(文件操作风险) |
git switch |
仅分支切换 | 新版专用分支切换(Git 2.23+) | 安全 |
git merge |
合并分支历史 | 公共分支合并(保留完整历史) | 中(可能冲突) |
git rebase |
重写分支提交历史 | 整理本地提交(线性历史) | 高(改写历史) |
git branch -d |
删除已合并分支 | 清理完成的分支 | 中(需确认合并) |
git branch -D |
强制删除未合并分支 | 紧急清理废弃分支 | 高(数据丢失) |
5、远程协作

| 命令 | 作用 | 示例 |
|---|---|---|
git fetch |
获取远程更新 | git fetch origin |
git pull |
拉取并合并远程变更 | git pull origin main |
git push |
推送本地提交 | git push origin feature-login |
git push -u |
首次推送并关联分支 | git push -u origin main |
git remote -v |
查看远程仓库 | git remote -v |
5.0 典型协作场景图示

5.1. git fetch - 获取远程更新
5.1.1 作用
- 从远程仓库下载所有分支的最新提交、文件和引用(不会自动合并)
- 更新本地仓库中的远程跟踪分支(如
origin/main)
5.1.2 示例
# 获取默认远程仓库的所有更新
git fetch
# 获取特定远程仓库的更新
git fetch origin
# 获取远程特定分支的更新
git fetch origin feature-bugfix
5.1.3 使用场景
- 查看团队成员的新提交(不立即合并到本地分支)
- 同步远程分支信息(如新建的远程分支)
- 安全检查:先
fetch查看变更,再决定是否合并
5.1.4 与 git pull 的区别
| 命令 | 是否修改工作区 | 是否自动合并 | 适用场景 |
|---|---|---|---|
fetch |
否 | 否 | 安全查看远程变更 |
pull |
是 | 是 | 快速同步最新代码 |
5.2. git pull - 拉取并合并远程变更
5.2.1 作用
- 相当于
git fetch+git merge(默认行为) - 将远程分支的变更合并到当前本地分支
5.2.2 示例
# 拉取当前分支的远程对应分支并合并
git pull
# 拉取指定远程分支合并到当前分支
git pull origin main
# 使用 rebase 代替 merge(保持线性历史)
git pull --rebase origin main
5.2.3 常见问题处理
# 遇到冲突时中止合并
git merge --abort
# 或中止 rebase
git rebase --abort
5.2.4 使用场景
- 开始工作前同步最新代码
- 团队协作时定期合并他人提交
- 推荐流程:
git fetch # 先查看变更 git log ..origin/main # 检查差异 git pull # 确认无误后合并
5.3. git push - 推送本地提交
5.3.1 作用
- 将本地分支的提交上传到远程仓库
- 更新远程分支指针
5.3.2 示例
# 推送到远程同名分支
git push origin feature-login
# 强制推送(覆盖远程历史,慎用!)
git push --force origin main
# 更安全的强制推送(避免覆盖他人提交)
git push --force-with-lease origin main
5.3.3 推送规则
- 如果远程分支不存在,需指定本地和远程分支名:
git push origin local-branch:remote-branch - 删除远程分支:
git push origin --delete old-branch
5.3.4 使用场景
- 本地开发完成后分享代码
- 同步本地修复到远程仓库
- 注意:强制推送前确保团队协调
5.4. git push -u - 首次推送并关联分支
5.4.1 作用
- 首次推送分支时建立跟踪关系(upstream)
- 后续可直接用
git push无需指定远程分支
5.4.2 示例
# 首次推送并关联远程分支
git push -u origin main
# 之后简化推送
git push
5.4.3 原理
-
在
.git/config中记录:[branch "main"] remote = origin merge = refs/heads/main
5.4.4 使用场景
- 新分支第一次推送时
- 本地新建仓库首次关联远程时
5.5. git remote -v - 查看远程仓库
5.5.1 作用
- 显示所有已配置的远程仓库及其URL
-v参数显示详细地址(verbose)
5.5.2 示例
git remote -v
# 输出示例:
# origin https://github.com/user/repo.git (fetch)
# origin https://github.com/user/repo.git (push)
# upstream git@github.com:other/repo.git (fetch)
5.5.3 扩展操作
# 添加远程仓库
git remote add upstream git@github.com:other/repo.git
# 修改远程仓库URL
git remote set-url origin git@new-url.com/repo.git
# 删除远程仓库关联
git remote remove upstream
5.5.4 使用场景
- 检查是否已正确配置远程仓库
- 需要切换仓库协议时(如HTTPS转SSH)
- 开源项目贡献时添加上游仓库
5.6 远程协作命令对比总结
| 命令 | 影响范围 | 常用场景 | 危险等级 | 同步方向 |
|---|---|---|---|---|
git fetch |
仅更新本地远程分支指针 | 安全查看远程变更 | 安全 | 远程 → 本地 |
git pull |
更新远程分支 + 合并到当前分支 | 快速同步团队代码 | 中(可能冲突) | 远程 → 本地 |
git push |
上传本地分支到远程 | 分享代码/提交PR | 中(需权限) | 本地 → 远程 |
git push -u |
首次推送 + 建立分支关联 | 新分支首次推送 | 低 | 本地 → 远程 |
git remote -v |
只读查看远程地址 | 检查仓库关联配置 | 安全 | 无数据同步 |
6、查看历史
| 命令 | 作用 | 示例 |
|---|---|---|
git log |
查看提交历史 | git log --oneline --graph |
git show |
查看某次提交 | git show abc123 |
git diff |
比较差异 | git diff HEAD~1 (与上一次提交比较) |
6.1. git log - 查看提交历史
6.1.1 作用
- 显示当前分支的提交历史(按时间倒序排列)
- 可查看提交哈希、作者、日期和提交信息
6.1.2 常用参数组合
# 简洁单行显示 + 分支图形化
git log --oneline --graph
# 显示最近3次提交
git log -3
# 显示包含文件修改的详细信息
git log --stat
# 按作者筛选
git log --author="John"
# 按时间范围筛选
git log --since="2023-01-01" --until="2023-12-31"
# 搜索提交信息
git log --grep="修复登录"
6.1.3 典型输出示例
* 1a2b3cd (HEAD -> main) feat: 新增支付接口
| * 4e5f6gh (feature/login) fix: 修复登录跳转
|/
* 0b23a3d chore: 初始化项目
6.1.4 使用场景
- 追溯代码变更历史
- 排查特定功能引入时间
- 准备发布时生成变更日志(CHANGELOG)
6.2. git show - 查看提交详情
6.2.1 作用
- 显示特定提交的完整信息:
- 元数据(作者、时间、提交信息)
- 文件变更内容(diff)
6.2.2. 示例用法
# 查看最新提交
git show
# 查看指定提交(支持短哈希)
git show abc123
# 只显示文件变更(不显示元数据)
git show abc123 --stat
# 查看某次提交中的特定文件
git show abc123:src/index.js
6.2.3 输出解析
commit abc123...
Author: Alice <alice@example.com>
Date: Mon Jan 1 12:00:00 2023 +0800
fix: 修复空指针异常
diff --git a/src/main.js b/src/main.js
index 1a2b3c..4d5e6f 100644
--- a/src/main.js
+++ b/src/main.js
@@ -10,6 +10,7 @@
- return null;
+ return defaultValue;
6.2.4 使用场景
- 审查代码变更细节
- 恢复被删除的文件内容
- 学习优秀项目的提交规范
6.3. git diff - 比较差异
6.3.1 作用
- 比较工作区、暂存区、仓库版本之间的差异
- 支持文件/提交/分支间的对比
6.3.2 常用对比模式
# 工作区 vs 暂存区
git diff
# 暂存区 vs 最新提交
git diff --staged
# 工作区 vs 最新提交
git diff HEAD
# 比较两次提交
git diff abc123 xyz789
# 比较两个分支
git diff main..feature
# 只显示变更文件名(不显示具体内容)
git diff --name-only
6.3.3 输出解读
- 删除的行(旧内容)
+ 新增的行(新内容)
@@ 定位变更位置(语法:@@ -旧文件行号 +新文件行号 @@)
6.3.4 使用场景
- 提交前检查代码变更
- 解决合并冲突时分析差异
- 统计版本间变更量:
git diff --shortstat v1.0..v2.0 # 输出示例:3 files changed, 15 insertions(+), 8 deletions(-)
6.4 三命令对比总结
| 命令 | 核心用途 | 最佳适用场景 |
|---|---|---|
git log |
宏观历史查看 | 追溯变更脉络 |
git show |
微观提交分析 | 审查具体修改 |
git diff |
差异对比 | 代码变更检查 |
7、撤销与回退

| 命令 | 作用 | 示例 |
|---|---|---|
git reset |
回退提交 | git reset --soft HEAD~1 (保留更改) |
git revert |
创建反向提交 | git revert abc123 |
git stash |
暂存临时修改 | git stash pop (恢复暂存) |
7.0 典型场景流程图

7.1. git reset - 回退提交
7.1.1 作用原理
- 移动当前分支的
HEAD指针到指定提交,有三种模式:模式 影响范围 适用场景 --soft只移动 HEAD指针修改提交历史 --mixed(默认)移动 HEAD+ 重置暂存区撤销 git add--hard移动 HEAD+ 重置工作区彻底丢弃更改
7.1.2 示例操作
# 撤销最近1次提交(保留修改到暂存区)
git reset --soft HEAD~1
# 撤销最近2次提交(保留修改到工作区)
git reset HEAD~2
# 彻底回退到指定提交(丢弃所有修改)
git reset --hard abc123
# 撤销对单个文件的修改(从暂存区移除)
git reset HEAD file.txt
7.1.3 使用场景
- 修改本地提交历史(未推送前)
- 撤销误提交(如提交了敏感信息)
- 恢复误删的
.gitignore文件:git reset HEAD .gitignore git checkout -- .gitignore
7.1.4 注意事项
- 对已推送的提交使用
reset --hard会导致团队协作问题 - 可通过
git reflog找回误删的提交
7.2. git revert - 创建反向提交
7.2.1 作用原理
- 生成一个新的提交,用于撤销指定提交的更改
- 与 reset 的区别:保留原始提交历史,适合公共分支
7.2.2 示例操作
# 撤销单个提交
git revert abc123
# 撤销合并提交(需指定主父提交)
git revert -m 1 merge-commit-id
# 连续撤销多个提交
git revert old-commit..new-commit
7.2.3 冲突处理
# 遇到冲突时
git revert --abort # 中止
git revert --continue # 解决冲突后继续
7.2.4 使用场景
- 撤销已推送到远程的提交
- 安全回退生产环境代码
- 典型工作流:
git revert bad-commit git push origin main # 安全推送撤销
7.3. git stash - 暂存临时修改
7.3.1 作用原理
- 将工作区和暂存区的修改保存到栈中(不生成提交)
- 存储内容包含:
- 工作区已跟踪文件的修改
- 暂存区的变更(需加
--include-untracked包含新文件)
7.3.2 示例操作
# 保存当前修改(默认消息)
git stash
# 自定义存储消息
git stash push -m "临时保存登录模块修改"
# 查看存储列表
git stash list
# 输出:stash@{0}: On main: 临时保存登录模块修改
# 恢复最近一次存储(保留存储记录)
git stash apply
# 恢复指定存储(如 stash@{1})
git stash apply stash@{1}
# 恢复并删除存储记录
git stash pop
# 删除所有存储
git stash clear
7.3.3 高级用法
# 暂存包含未跟踪文件
git stash -u
# 选择性恢复部分文件
git stash push -p # 交互选择要暂存的修改
# 从存储创建新分支
git stash branch new-branch stash@{1}
7.3.4 使用场景
- 紧急切换分支处理其他任务
- 暂存未完成的实验性代码
- 恢复误
reset --hard的修改:git reset --hard HEAD~3 # 误操作 git stash apply # 从最近的 stash 恢复
7.4 三命令对比总结
| 命令 | 是否修改历史 | 适用场景 | 危险等级 |
|---|---|---|---|
reset |
是 | 本地提交回退 | 高危(可能丢失数据) |
revert |
否 | 公共提交撤销 | 安全 |
stash |
无 | 临时保存修改 | 安全 |
7.5 典型工作流
7.5.1 场景1:修复紧急Bug
# 1. 暂存当前未完成的工作
git stash -m "WIP: 用户模块优化"
# 2. 创建修复分支
git checkout -b hotfix
# 3. 修复后提交并合并
git commit -m "fix: 紧急修复支付漏洞"
git checkout main
git merge hotfix
# 4. 恢复之前的工作
git stash pop
7.5.2 场景2:撤销错误提交
# 1. 查看要撤销的提交
git log --oneline
# 2. 安全撤销(已推送)
git revert abc123
git push
# 或本地撤销(未推送)
git reset --soft HEAD~1
8、标签管理
| 命令 | 作用 | 示例 |
|---|---|---|
git tag |
查看/创建标签 | git tag v1.0.0 |
git push --tags |
推送标签到远程 | git push origin --tags |
8.1. git tag - 查看/创建标签
8.1.1 作用
- 查看标签:列出仓库中所有标签(按字母排序)
- 创建标签:为特定提交打上永久标记(常用于版本发布)
8.1.2 标签类型
| 类型 | 创建命令 | 特点 |
|---|---|---|
| 轻量标签 | git tag v1.0.1 |
只是指向提交的指针 |
| 附注标签 | git tag -a v1.0.0 -m "Release" |
包含完整元信息的独立对象 |
8.1.3 示例操作
# 查看所有标签
git tag
# 输出:v1.0.0 v1.1.0
# 创建轻量标签(指向当前提交)
git tag v1.2.0
# 创建附注标签(推荐用于正式发布)
git tag -a v2.0.0 -m "正式发布用户中心模块"
# 给历史提交打标签
git tag -a v1.1.1 abc123 -m "修复安全漏洞"
# 查看标签详情
git show v1.0.0
8.1.4 使用场景
- 标记发布版本(如
v1.0.0) - 标识重要里程碑(如
production-2023) - 快速回滚到稳定版本:
git checkout v1.0.0
8.2. git push --tags - 推送标签到远程
8.2.1 作用
- 将本地标签同步到远程仓库
- 与分支推送的区别:标签需要显式推送(不会随
git push自动推送)
8.2.2 示例操作
# 推送单个标签
git push origin v1.0.0
# 推送所有本地标签(慎用!)
git push origin --tags
# 删除远程标签
git push origin :refs/tags/v0.9.0
8.2.3 标签同步策略
| 场景 | 操作 |
|---|---|
| 正式版本发布 | 只推送附注标签 |
| 临时测试标记 | 保留为本地标签 |
| 错误标签清理 | 先删本地再删远程 |
8.2.4 使用场景
- 团队共享版本标记
- CI/CD 流水线自动构建特定版本
- 开源项目发布公告
8.3 最佳实践指南
8.3.1. 语义化版本控制(SemVer)
v<主版本>.<次版本>.<修订号>
示例:
v1.0.0 - 正式首发版
v1.1.0 - 新增功能
v1.1.1 - 紧急修复
8.3.2. 签名验证(安全项目必备)
# 创建签名标签
git tag -s v2.0.0 -m "Signed release"
# 验证标签签名
git tag -v v2.0.0
8.3.3. 与分支配合使用
# 发布流程示例
git checkout release-branch
git tag -a v1.5.0 -m "Production release"
git push origin v1.5.0
9、高级操作

| 命令 | 作用 | 示例 |
|---|---|---|
git bisect |
二分查找Bug | git bisect start |
git cherry-pick |
选择性合并提交 | git cherry-pick abc123 |
git reflog |
查看操作历史 | git reflog (找回误删分支) |
9.1. git bisect - 二分查找Bug
9.1.1 作用原理
- 通过二分法快速定位引入Bug的提交
- 自动化流程:标记"好"和"坏"提交,Git自动跳转到中间提交供验证
9.1.2 示例操作
# 启动二分查找
git bisect start
# 标记当前为有Bug的提交
git bisect bad
# 标记已知正常的旧提交
git bisect good v1.0.0
# 自动化测试脚本(返回0表示好,非0表示坏)
git bisect run npm test
# 结束查找
git bisect reset
9.1.3 使用场景
- 定位难以追溯的回归Bug
- 大型项目中快速缩小问题范围
- 结合测试脚本实现自动化排查
9.1.4 输出示例
Bisecting: 15 revisions left to test
Commit abc123: 测试通过 → 继续向后查找
Commit def456: 测试失败 → 继续向前查找
9.2. git cherry-pick - 选择性合并提交
9.2.1 作用原理
- 将指定提交的变更重新应用到当前分支
- 生成新的提交(与原提交内容相同但哈希值不同)
9.2.2 示例操作
# 合并单个提交
git cherry-pick abc123
# 合并多个连续提交
git cherry-pick abc123..def456
# 只应用变更不自动提交
git cherry-pick -n abc123
# 遇到冲突时
git cherry-pick --abort # 中止
git cherry-pick --continue # 解决冲突后继续
9.2.3 使用场景
- 从其他分支移植特定修复
- 撤销之前的revert操作
- 同步特定功能到发布分支
9.2.4 注意事项
- 不要滥用(可能导致重复提交)
- 合并提交需加
-m指定父提交:git cherry-pick -m 1 merge-commit-id
9.3. git reflog - 查看操作历史
9.3.1 作用原理
- 记录所有本地仓库引用变更(包括被删除的提交)
- 存储在
.git/logs/目录下
9.3.2 示例操作
# 查看完整操作历史
git reflog
# 查看特定分支历史
git reflog show main
# 恢复误删的分支
git reflog
# 找到删除前的提交 abc123
git branch recovered-branch abc123
9.3.3 典型输出
abc123 (HEAD -> main) HEAD@{0}: commit: 更新登录页
def456 HEAD@{1}: reset: moving to HEAD~1
ghi789 HEAD@{2}: pull origin main
9.3.4 使用场景
- 恢复误删的分支/提交
- 找回被reset丢失的代码
- 审计本地仓库操作记录
9.3.5 注意事项
- 只记录本地操作(不会同步到远程)
- 默认保留90天记录(可通过
gc.reflogExpire配置)
9.4 三命令对比总结
| 命令 | 核心用途 | 数据恢复能力 |
|---|---|---|
bisect |
Bug定位 | 无 |
cherry-pick |
提交移植 | 无 |
reflog |
操作回溯 | 可恢复误删数据 |
9.5 典型工作流示例
9.5.1 场景1:定位生产环境Bug
# 1. 复现Bug并确认存在
# 2. 启动二分查找
git bisect start
git bisect bad
git bisect good v2.0.0
# 3. 测试每个中间版本
# 4. 最终定位问题提交 abc123
git show abc123 # 分析问题
git bisect reset
9.5.2 场景2:紧急修复移植
# 从开发分支移植特定修复到生产
git checkout production
git cherry-pick abc123
git push origin production
9.5.3 场景3:恢复误操作
# 误执行了git reset --hard
git reflog
# 找到reset前的提交 def456
git reset --hard def456
10、配置与帮助
| 命令 | 作用 | 示例 |
|---|---|---|
git config |
修改配置 | git config --global alias.co checkout |
git help |
查看帮助 | git help commit |
10.1. git config配置
10.1.1. 基本功能
- 查看或修改 Git 的配置参数
- 配置分为三个级别(优先级从高到低):
- 本地仓库(
.git/config):只影响当前项目 - 全局用户(
~/.gitconfig):影响当前用户的所有仓库 - 系统级(
/etc/gitconfig):影响所有用户
- 本地仓库(
10.1.2. 配置文件结构
[user]
name = Your Name
email = your@email.com
[alias]
co = checkout
[core]
editor = code --wait
10.2 参数详解与示例
10.2.1. 查看配置
# 查看所有配置(含来源文件)
git config --list --show-origin
# 查看特定配置项
git config user.name
10.2.2. 修改配置
# 设置用户名(全局级)
git config --global user.name "Your Name"
# 设置默认编辑器(本地仓库级)
git config core.editor "code --wait"
# 删除配置项
git config --unset alias.co
10.3 使用场景与最佳实践
10.3.1. 配置用户信息(首次使用必做)
git config --global user.name "Your Name"
git config --global user.email "your@email.com"
10.3.2. 创建命令别名(提升效率)
# 常用别名配置
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 alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'"
10.3.3. 跨平台协作配置
# Windows换行符设置
git config --global core.autocrlf true
# Mac/Linux换行符设置
git config --global core.autocrlf input
10.3.4. 安全增强配置
# 禁止强制推送(防误操作)
git config --global push.rejectForce true
# 提交自动GPG签名
git config --global commit.gpgsign true
10.4 典型配置示例
10.4.1. 完整开发环境配置
# 用户信息
git config --global user.name "Dev User"
git config --global user.email "dev@company.com"
# 核心配置
git config --global core.editor "code --wait"
git config --global core.autocrlf input
git config --global init.defaultBranch main
# 别名配置
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.st status
git config --global alias.last "log -1 HEAD"
# 安全配置
git config --global push.rejectForce true
git config --global transfer.fsckObjects true
10.4.2. 查看当前生效配置
git config --list
# 输出示例:
# user.name=Dev User
# user.email=dev@company.com
# core.editor=code --wait
# alias.co=checkout
11、实用命令组合
1. 清理本地已合并分支
git branch --merged | grep -v "main" | xargs git branch -d
2. 修改多个提交消息
git rebase -i HEAD~3 # 交互式修改最近3次提交
3. 同步远程已删除分支
git fetch --prune
12、命令速查表
| 场景 | 常用命令 |
|---|---|
| 日常提交 | add, commit, status, restore |
| 分支管理 | branch, checkout, merge, rebase |
| 团队协作 | fetch, pull, push, remote |
| 错误恢复 | reset, revert, stash, reflog |
13、扩展设计要点
1. 引用命名空间
- 分支:
refs/heads/ - 标签:
refs/tags/ - 远程跟踪:
refs/remotes/origin/
2. 钩子机制(Hooks)
- 关键钩子:
pre-commit:提交前检查代码post-receive:服务端推送后触发 CI
3. 垃圾回收
-
触发条件:
- 松散对象过多(默认≥7000)
- 手动执行
git gc
-
过程:
- 合并松散对象为 packfile
- 移除不可达对象
更多推荐



所有评论(0)