常见操作实践:从理论到实战的最后一步
# 第9章 · 常见操作实践
# 一、学了八章,实战还是卡壳
前八章,小李从零到一学会了 Git 的完整体系。但当 Leader 在群里喊"把 hotfix 移植到 release 分支"时,他还是下意识打开了搜索引擎。
他的问题不是不懂,而是没有形成肌肉记忆。本章就做一件事:把前八章的知识,按真实工作场景重新组织成可执行的"操作清单"。
# 二、场景一:提交 & 推送
# 2.1 首次配置
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --list
1
2
3
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
4
5
# 2.3 日常提交流程
git add <file> # 添加到暂存区
git commit -m "feat: xxx" # 提交到版本库
git push # 推送到远程
1
2
3
2
3
# 2.4 修改最后一次提交
# 只改 message
git commit --amend -m "新的提交说明"
# 补漏掉的文件
git add <漏掉的文件>
git commit --amend --no-edit
1
2
3
4
5
6
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
2
3
4
5
6
7
8
9
10
11
# 三、场景二:撤销操作
# 3.1 撤销工作区(还没 add)
# 单个文件
git restore <file>
# 所有文件
git restore .
1
2
3
4
5
2
3
4
5
# 3.2 撤销暂存区(已 add 未 commit)
git restore --staged <file>
git restore --staged .
1
2
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
2
3
4
5
6
7
8
# 3.4 撤销远程提交(已 push)
git revert <commit-hash> # 生成新 commit 抵消
git push
1
2
2
# 3.5 放弃进行中的操作
git merge --abort # 放弃合并
git rebase --abort # 放弃变基
git cherry-pick --abort # 放弃 cherry-pick
1
2
3
2
3
# 3.6 恢复到历史版本
git checkout <commit-hash> # 临时看
git reset --hard <commit-hash> # 彻底回退(⚠️)
1
2
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
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
2
3
4
5
# 4.4 合并预防冲突策略
# 每天至少一次同步
git switch feature/xxx
git merge develop # 或 git rebase develop
1
2
3
2
3
# 五、场景四:cherry-pick 精准移植
当你只需要某个 commit,不需要整个分支时使用。
# 5.1 基础操作
git switch <目标分支>
git cherry-pick <commit-hash>
1
2
2
# 5.2 多提交选择
# 连续范围
git cherry-pick abc123..def456
# 不连续的多个
git cherry-pick abc123 def456 xyz789
1
2
3
4
5
2
3
4
5
# 5.3 编辑选项
git cherry-pick -e <hash> # 改 message
git cherry-pick -n <hash> # 只取改动不 commit
1
2
2
# 5.4 遇到冲突
# 解决冲突 → git add → git cherry-pick --continue
# 放弃:git cherry-pick --abort
1
2
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
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
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
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
2
3
4
5
6
7
8
# 7.2 推送标签
# push 默认不推标签!
git push origin v1.0.0 # 推送单个
git push origin --tags # 推送全部
1
2
3
2
3
# 7.3 查看标签
git tag # 全部
git tag -l "v1.*" # 按模式过滤
git show v1.0.0 # 查看详情
1
2
3
2
3
# 7.4 删除标签
git tag -d v1.0.0 # 本地
git push origin :refs/tags/v1.0.0 # 远程
1
2
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
2
3
4
5
# 八、开发技巧汇总
# 8.1 协作铁律
- 同分支多人开发:提交前先
pull --rebase,再push - feature 分支开发:每天 rebase 一次 develop,减少冲突
- 合并到 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
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
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
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
上次更新: 2026/06/07, 10:26:12