在这里插入图片描述

肖哥弹架构 跟大家“弹弹” Git 设计与实战应用,需要代码关注

欢迎 关注,点赞,留言。

关注公号Solomon肖哥弹架构获取更多精彩内容

历史热点文章

还在为代码冲突、分支混乱和提交历史一团糟而头疼?这份 Git 终极指南 将彻底改变你的开发体验!从零基础到高阶技巧,覆盖 仓库管理、分支策略、高效协作、撤销回退、标签发布 等核心场景,搭配 清晰图解 + 实战命令,让你轻松玩转 Git!

🔥 为什么你需要这份指南?
告别 Git 恐惧症:从 git initgit rebase,手把手教你每一步!
团队协作无忧:掌握 fetchpullpush 的正确姿势,避免代码灾难!
高级操作揭秘:用 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.nameuser.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
  • 过程

    1. 合并松散对象为 packfile
    2. 移除不可达对象
Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐