编程进阶网 编程进阶网
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接

杨充

专注编程 · 终身学习者
首页
  • 计算机原理
  • 操作系统
  • 网络协议
  • 数据库原理
  • 面向对象
  • 设计原则
  • 设计模式
  • 系统架构
  • 性能优化
  • 编程原理
  • 方案设计
  • 稳定可靠
  • 工程运维
  • 基础认知
  • 线性结构
  • 树与哈希
  • 工业级实现
  • 算法思想
  • 实战与综合
  • 算法题考核
  • C语言入门
  • C综合案例
  • C专栏博客
  • C标准集库
  • C++入门教程
  • C++综合案例
  • C++专栏博客
  • C++开发技巧
  • Java入门教程
  • Java综合案例
  • Java专栏博客
  • Go入门教程
  • Go综合案例
  • Go专栏博客
  • Go开发技巧
  • JavaScript入门
  • JavaScript高级
  • Android库解读
  • Android专栏
  • Android智能硬件
  • iOS ObjC入门
  • iOS Swift入门
  • iOS入门精通
  • Web之Html手册
  • Web之TypeScript
  • Web之Vue高级进阶
  • Linux之QML入门
  • Linux之QT核心库
  • Linux实践开发
  • Python教程
  • Shell&Bash教程
  • 工具脚本
  • 自动化脚本
  • 质量保障
  • 产品思考
  • 软实力
  • 开发流程
  • Git应用
  • 技术模版
  • 技术规范
  • Markdown
  • Mermaid
  • 开源协议
  • JSON工具
  • 文本工具
  • 图片处理
  • 文档转化
  • 代码压缩
  • 关于我
  • 自我精进
  • 职场管理
  • 职场面试
  • 心情杂货
  • 友情链接
  • README
  • 质量保障

  • 产品思考

  • 软实力

  • 开发流程

  • Git应用

    • README
    • 版本控制的诞生:从一场灾难说起
    • 单人工作流:在 Git 的时光机里自由穿梭
    • 分支:Git 的灵魂——像开平行宇宙一样开发
    • 远程协作:把你的代码推到全世界
    • Git特种作战:stash、cherry-pick、bisect三件套
    • 团队工作流实战:从一个人能打到一队人能战
    • Git故障排除:遇到报错不再慌的急诊手册
    • Git 场景速查地图:遇到问题对号入座
    • 常见操作实践:从理论到实战的最后一步
      • 一、学了八章,实战还是卡壳
      • 二、场景一:提交 & 推送
        • 2.1 首次配置
        • 2.2 首次推送并建立追踪
        • 2.3 日常提交流程
        • 2.4 修改最后一次提交
        • 2.5 提交前先同步(团队铁律)
      • 三、场景二:撤销操作
        • 3.1 撤销工作区(还没 add)
        • 3.2 撤销暂存区(已 add 未 commit)
        • 3.3 撤销本地提交(已 commit 未 push)
        • 3.4 撤销远程提交(已 push)
        • 3.5 放弃进行中的操作
        • 3.6 恢复到历史版本
      • 四、场景三:合并分支
        • 4.1 标准合并流程
        • 4.2 合并策略速选
        • 4.3 合并后撤销
        • 4.4 合并预防冲突策略
      • 五、场景四:cherry-pick 精准移植
        • 5.1 基础操作
        • 5.2 多提交选择
        • 5.3 编辑选项
        • 5.4 遇到冲突
        • 5.5 适用场景
      • 六、场景五:分支管理
        • 6.1 重命名分支
        • 6.2 删除分支
        • 6.3 查看分支
      • 七、场景六:标签管理
        • 7.1 创建标签
        • 7.2 推送标签
        • 7.3 查看标签
        • 7.4 删除标签
        • 7.5 基于标签创建分支
        • 7.6 标签与 CI/CD
      • 八、开发技巧汇总
        • 8.1 协作铁律
        • 8.2 常见别名配置
      • 九、综合实战:一次完整的功能交付
        • 场景设定
        • 实战开始
      • 十、本章回顾
        • 📎 本章涉及的命令速查
  • 技术模版

  • 技术规范

  • markdown

  • mermaid

  • license

  • 博客部署

  • 技术招聘

  • 测试经验

  • 技术
  • Git应用
杨充
2025-06-06
目录

常见操作实践:从理论到实战的最后一步

# 第9章 · 常见操作实践

# 一、学了八章,实战还是卡壳

前八章,小李从零到一学会了 Git 的完整体系。但当 Leader 在群里喊"把 hotfix 移植到 release 分支"时,他还是下意识打开了搜索引擎。

他的问题不是不懂,而是没有形成肌肉记忆。本章就做一件事:把前八章的知识,按真实工作场景重新组织成可执行的"操作清单"。


# 二、场景一:提交 & 推送

# 2.1 首次配置

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --list
1
2
3

# 2.2 首次推送并建立追踪

git init
git add .
git commit -m "init: 项目初始化"
git remote add origin <仓库地址>
git push -u origin main
1
2
3
4
5

# 2.3 日常提交流程

git add <file>                 # 添加到暂存区
git commit -m "feat: xxx"     # 提交到版本库
git push                       # 推送到远程
1
2
3

# 2.4 修改最后一次提交

# 只改 message
git commit --amend -m "新的提交说明"

# 补漏掉的文件
git add <漏掉的文件>
git commit --amend --no-edit
1
2
3
4
5
6

# 2.5 提交前先同步(团队铁律)

# 推荐:先侦察
git fetch origin
git log --oneline main..origin/main
git diff main origin/main

# 再决定合并方式
git rebase origin/main          # 推荐:保持线性历史
# 或 git merge origin/main      # 保留分叉历史

# 最后再 push
git push
1
2
3
4
5
6
7
8
9
10
11

# 三、场景二:撤销操作

# 3.1 撤销工作区(还没 add)

# 单个文件
git restore <file>

# 所有文件
git restore .
1
2
3
4
5

# 3.2 撤销暂存区(已 add 未 commit)

git restore --staged <file>
git restore --staged .
1
2

# 3.3 撤销本地提交(已 commit 未 push)

# 保留修改在暂存区(改 message 用)
git reset --soft HEAD~1

# 保留修改在工作区(重新规划 commit)
git reset --mixed HEAD~1

# 彻底丢弃(⚠️ reflog 可救)
git reset --hard HEAD~1
1
2
3
4
5
6
7
8

# 3.4 撤销远程提交(已 push)

git revert <commit-hash>        # 生成新 commit 抵消
git push
1
2

# 3.5 放弃进行中的操作

git merge --abort               # 放弃合并
git rebase --abort              # 放弃变基
git cherry-pick --abort         # 放弃 cherry-pick
1
2
3

# 3.6 恢复到历史版本

git checkout <commit-hash>      # 临时看
git reset --hard <commit-hash>  # 彻底回退(⚠️)
1
2

# 四、场景三:合并分支

# 4.1 标准合并流程

# 1. 切换到目标分支
git switch develop

# 2. 拉取最新代码
git pull origin develop

# 3. 合并
git merge --no-ff feature/xxx   # 推荐:保留分支痕迹

# 4. 解决冲突(如有)→ 编辑文件 → git add → git commit

# 5. 推送
git push origin develop
1
2
3
4
5
6
7
8
9
10
11
12
13

# 4.2 合并策略速选

策略 命令 适用场景
标准合并 git merge feature 小功能
推荐日常 git merge --no-ff feature 保留分支历史
线性历史 git rebase develop 整理私有分支
压缩提交 git merge --squash feature 简化历史

# 4.3 合并后撤销

# 未 push
git reset --hard HEAD~1

# 已 push
git revert -m 1 <merge-commit-hash>
1
2
3
4
5

# 4.4 合并预防冲突策略

# 每天至少一次同步
git switch feature/xxx
git merge develop                # 或 git rebase develop
1
2
3

# 五、场景四:cherry-pick 精准移植

当你只需要某个 commit,不需要整个分支时使用。

# 5.1 基础操作

git switch <目标分支>
git cherry-pick <commit-hash>
1
2

# 5.2 多提交选择

# 连续范围
git cherry-pick abc123..def456

# 不连续的多个
git cherry-pick abc123 def456 xyz789
1
2
3
4
5

# 5.3 编辑选项

git cherry-pick -e <hash>       # 改 message
git cherry-pick -n <hash>       # 只取改动不 commit
1
2

# 5.4 遇到冲突

# 解决冲突 → git add → git cherry-pick --continue
# 放弃:git cherry-pick --abort
1
2

# 5.5 适用场景

场景 用什么
单 bug 修复同步到多分支 cherry-pick
整个功能合入主分支 merge
整理自己的分支历史 rebase

# 六、场景五:分支管理

# 6.1 重命名分支

# 重命名本地分支
git branch -m <旧名> <新名>

# 删除远程旧名
git push origin --delete <旧名>

# 推送新名
git push -u origin <新名>
1
2
3
4
5
6
7
8

# 6.2 删除分支

# 删除本地(已合并)
git branch -d <name>

# 强制删除(未合并)
git branch -D <name>

# 删除远程
git push origin --delete <name>

# 同步本地远程引用
git fetch --prune
1
2
3
4
5
6
7
8
9
10
11

# 6.3 查看分支

git branch -a           # 所有(含远程)
git branch -v           # 带最新 commit
git branch --merged     # 已合并的分支
git branch --no-merged  # 未合并的分支
1
2
3
4

# 七、场景六:标签管理

# 7.1 创建标签

# 轻量标签
git tag v1.0.0

# 附注标签(推荐)
git tag -a v1.0.0 -m "Release v1.0.0"

# 给过去的 commit 打标签
git tag -a v0.9.0 <commit-hash> -m "内测版"
1
2
3
4
5
6
7
8

# 7.2 推送标签

# push 默认不推标签!
git push origin v1.0.0          # 推送单个
git push origin --tags          # 推送全部
1
2
3

# 7.3 查看标签

git tag                          # 全部
git tag -l "v1.*"                # 按模式过滤
git show v1.0.0                  # 查看详情
1
2
3

# 7.4 删除标签

git tag -d v1.0.0                            # 本地
git push origin :refs/tags/v1.0.0            # 远程
1
2

# 7.5 基于标签创建分支

git switch -c hotfix/v1.0.1 v1.0.0
1

# 7.6 标签与 CI/CD

# 当推送标签时自动触发发布
on:
  push:
    tags:
      - 'v*'
1
2
3
4
5

# 八、开发技巧汇总

# 8.1 协作铁律

  1. 同分支多人开发:提交前先 pull --rebase,再 push
  2. feature 分支开发:每天 rebase 一次 develop,减少冲突
  3. 合并到 develop:用 merge --no-ff,保留需求开发记录

# 8.2 常见别名配置

git config --global alias.lg "log --oneline --graph --all"
git config --global alias.st "status -s"
git config --global alias.co "switch"
git config --global alias.br "branch"
git config --global alias.undo "reset --soft HEAD~1"
1
2
3
4
5

# 九、综合实战:一次完整的功能交付

# 场景设定

小李要在电商平台上添加「商品评价」功能,同时做一次版本发布。

# 实战开始

mkdir practice && cd practice && git init

# ==================== Phase 1:初始化 ====================
echo 'const app = "Shop v1.0.0";' > app.js
echo 'node_modules/' > .gitignore
git add . && git commit -m "init: 项目初始化"
git tag -a v1.0.0 -m "v1.0.0 初始版本"


# ==================== Phase 2:开发评价功能 ====================
git switch -c feature/商品评价

echo '
const reviews = [];
function addReview(productId, rating, comment) {
  reviews.push({ productId, rating, comment, date: new Date() });
}
function getReviews(productId) {
  return reviews.filter(r => r.productId === productId);
}
' > reviews.js

git add . && git commit -m "feat: 添加商品评价基础功能"

# 补充:加上平均分计算
echo '
function getAverageRating(productId) {
  const productReviews = getReviews(productId);
  if (productReviews.length === 0) return 0;
  const sum = productReviews.reduce((s, r) => s + r.rating, 0);
  return sum / productReviews.length;
}
' >> reviews.js

git add . && git commit -m "feat: 添加评分统计功能"


# ==================== Phase 3:整理提交 ====================
git rebase -i HEAD~2
# squash → feat: 实现商品评价功能(添加 + 评分统计)

git push -u origin feature/商品评价


# ==================== Phase 4:代码审查 & 修改 ====================
# 审查者提了意见:addReview 应该校验 rating 范围(1-5)
# 小李在本地修改:

sed -i '' 's/reviews.push({ productId, rating, comment, date: new Date() });/if (rating < 1 || rating > 5) return false; reviews.push({ productId, rating, comment, date: new Date() }); return true;/' reviews.js

git add . && git commit -m "fix: 添加评分范围校验(1-5分)"
git push origin feature/商品评价

# 审查通过 → Merge PR


# ==================== Phase 5:合并到 develop ====================
git switch develop
git pull origin develop
git merge --no-ff feature/商品评价 -m "merge: 合并商品评价功能"


# ==================== Phase 6:发布 v1.1.0 ====================
git switch -c release/v1.1.0 develop

# 修一个 display bug
echo 'const APP_VERSION = "1.1.0";' >> app.js
git add . && git commit -m "chore: 更新版本号到 1.1.0"

# 合并到 main
git switch main
git merge --no-ff release/v1.1.0 -m "release: v1.1.0"
git tag -a v1.1.0 -m "v1.1.0:商品评价功能上线"
git push origin main --tags

# 同步回 develop
git switch develop
git merge --no-ff release/v1.1.0 -m "merge: 同步 release v1.1.0"


# ==================== Phase 7:清理战场 ====================
git push origin --delete feature/商品评价
git push origin --delete release/v1.1.0
git branch -d feature/商品评价
git branch -d release/v1.1.0
git fetch --prune

# 🎉 功能交付完毕!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

# 十、本章回顾

场景 核心命令
提交并推送 add → commit → push
修改上次提交 commit --amend
撤销工作区 git restore <file>
撤销暂存区 git restore --staged <file>
撤销本地提交 git reset --soft HEAD~1
撤销远程提交 git revert <hash>
合并分支 git merge --no-ff <branch>
变基整理 git rebase -i HEAD~N
精准移植 git cherry-pick <hash>
分支重命名 git branch -m 旧名 新名
删除分支 git branch -d / push --delete
标签管理 git tag -a v1.0.0 -m "msg"
发布版本 merge main + git tag + push --tags

🎯 从理论到实战的最后一步:每当你犹豫"这个操作该用什么命令"时,回到本章,按场景对号入座。重复 30 次,它就是肌肉记忆。


# 📎 本章涉及的命令速查

# === 提交推送 ===
git add <file>                                    # 添加到暂存区
git commit -m "feat: xxx"                        # 提交
git commit --amend -m "新消息"                    # 修改上次提交
git push                                          # 推送
git push -u origin <branch>                       # 首次推送 + 建追踪

# === 撤销 ===
git restore <file>                                # 撤销工作区
git restore --staged <file>                       # 撤销暂存区
git reset --soft HEAD~1                           # 撤销 commit(保留修改)
git reset --hard HEAD~1                           # 彻底丢弃
git revert <hash>                                 # 安全撤销(已 push)

# === 合并 ===
git merge --no-ff <branch>                        # 推荐合并
git merge --abort                                 # 放弃合并
git rebase <target>                               # 变基
git rebase -i HEAD~N                              # 交互变基
git rebase --abort                                # 放弃变基

# === cherry-pick ===
git cherry-pick <hash>                            # 移植单个 commit
git cherry-pick -n <hash>                         # 只取改动不提交
git cherry-pick --continue / --abort              # 继续 / 放弃

# === 分支 ===
git branch <name>                                 # 创建分支
git switch -c <name>                              # 创建 + 切换
git branch -m <旧> <新>                            # 重命名
git branch -d <name>                              # 删除本地
git push origin --delete <name>                   # 删除远程
git fetch --prune                                 # 清理远程引用

# === 标签 ===
git tag -a v1.0.0 -m "msg"                        # 创建附注标签
git tag -l "v1.*"                                 # 按模式过滤
git show v1.0.0                                   # 查看详情
git push origin --tags                            # 推送全部标签
git tag -d v1.0.0                                 # 删除本地
git push origin :refs/tags/v1.0.0                 # 删除远程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#Git
上次更新: 2026/06/07, 10:26:12
Git 场景速查地图:遇到问题对号入座
技术模版

← Git 场景速查地图:遇到问题对号入座 技术模版→

最近更新
01
信号崩溃快速排查
06-15
02
CoreDump破案
06-15
03
perf火焰图实战
06-15
更多文章>
Theme by Vdoing | Copyright © 2019-2026 杨充 | MIT License | 桂ICP备2024034950号 | 桂公网安备45142202000030
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式