跳到主要内容

Git 进阶

本篇在基础篇之上,讲解 rebase、stash、标签、撤销进阶、子模块、协作流程与排错技巧。 建议先熟练使用 add / commit / branch / merge / push / pull。


1. 暂存工作现场(stash)

当你正改着代码,突然需要切分支处理别的事,可以用 stash 把未提交的改动暂存起来。

git stash # 暂存当前改动
git stash -u # 连同未跟踪文件一起暂存
git stash list # 查看暂存列表
git stash pop # 恢复最近一次暂存并删除记录
git stash apply # 恢复但保留记录
git stash drop # 删除最近一次暂存
git stash clear # 清空所有暂存

带说明的暂存:

git stash push -m "登录功能做到一半"
git stash pop stash@{0} # 恢复指定暂存

2. Rebase(变基)

rebase 可以把一个分支的提交「搬」到另一个分支之后,让历史变成一条直线。

git switch feature
git rebase main # 把 feature 的提交重放到 main 之上

遇到冲突时:

# 手动解决冲突后
git add 冲突文件
git rebase --continue

git rebase --abort # 放弃 rebase

2.1 交互式 rebase(整理提交)

git rebase -i HEAD~3 # 整理最近 3 次提交

编辑器会打开提交列表,可对每个提交执行:

指令作用
pick保留该提交
reword修改提交说明
squash合并到上一个提交,保留说明
fixup合并到上一个提交,丢弃说明
drop删除该提交

黄金法则:只对尚未推送的提交做 rebase,已共享的提交不要变基。


3. Cherry-pick(挑选提交)

把其他分支的某一个提交复制到当前分支:

git switch main
git cherry-pick 提交ID
git cherry-pick 提交ID1 提交ID2 # 多个
git cherry-pick --continue # 冲突解决后继续
git cherry-pick --abort

4. 标签(Tag)

标签用于标记发布版本(如 v1.0.0)。

git tag # 列出标签
git tag v1.0.0 # 轻量标签
git tag -a v1.0.0 -m "首个正式版" # 附注标签(推荐)
git show v1.0.0 # 查看标签信息

git push origin v1.0.0 # 推送单个标签
git push --tags # 推送所有标签
git tag -d v1.0.0 # 删除本地标签
git push origin --delete v1.0.0 # 删除远程标签

5. 撤销进阶

5.1 revert:安全地撤销已推送的提交

revert 会生成一个反向的新提交,不修改历史,适合已推送的场景。

git revert 提交ID
git revert HEAD # 撤销最近一次提交
git revert --no-commit 提交ID # 只改工作区,不自动提交

对比:reset 重写历史(适合本地),revert 追加提交(适合已推送)。

5.2 reflog:找回误删的提交

reflog 记录了 HEAD 的每一次移动,是救命神器

git reflog
# 找到目标提交 ID 后
git reset --hard 提交ID

即使误执行了 git reset --hard,通常也能通过 reflog 找回。


6. 查看与定位问题

git log --oneline --graph --all # 图形化历史
git log --author="张三" # 按作者筛选
git log -p 文件名 # 某文件的改动历史
git log -S "关键词" # 搜索引入/删除某关键词的提交
git blame 文件名 # 逐行显示最后修改者
git bisect start # 二分查找引入 bug 的提交

git blame 示例:

git blame src/main.js

6.1 二分查找(bisect)

git bisect start
git bisect bad # 当前版本有问题
git bisect good v1.0.0 # 已知正常的版本
# Git 会切换到中间提交,测试后标记
git bisect good # 或 git bisect bad
# 重复直到定位
git bisect reset

7. 子模块与子树(简述)

7.1 子模块 submodule

在一个仓库中引用另一个仓库:

git submodule add https://github.com/用户名/库.git libs/库
git submodule update --init --recursive # 克隆后初始化子模块

7.2 子树 subtree

git subtree add --prefix=libs/库 https://github.com/用户名/库.git main --squash

简单项目优先用 submodule,复杂场景可考虑 subtree 或包管理器。


8. 团队协作流程

8.1 功能分支流程(Feature Branch)

# 1. 更新主分支
git switch main
git pull

# 2. 新建功能分支
git switch -c feature/login

# 3. 开发并提交
git add .
git commit -m "实现登录功能"

# 4. 推送分支
git push -u origin feature/login

# 5. 在平台上发起 Pull Request / Merge Request
# 6. 评审通过后合并,删除分支

8.2 Fork 流程(开源协作)

  1. 在 GitHub 上 Fork 目标仓库到自己的账号
  2. git clone 自己的 fork
  3. 添加上游仓库:git remote add upstream 原仓库地址
  4. 开发、提交、推送到自己的 fork
  5. 发起 Pull Request 到原仓库

同步上游更新:

git fetch upstream
git switch main
git merge upstream/main
git push origin main

8.3 保持分支最新

git switch feature
git rebase main # 或 git merge main

9. 常见问题排错

Q:推送被拒绝(rejected,non-fast-forward)

说明远程有你本地没有的提交,先拉取:

git pull --rebase origin main
git push

Q:提交里混进了不该提交的文件

git rm --cached 文件 # 从版本控制移除但保留本地文件
echo "文件" >> .gitignore
git commit -m "移除误提交文件"

Q:写错了提交说明(还没推送)

git commit --amend

Q:想撤销最近一次已推送的提交

git revert HEAD
git push

Q:merge 时想放弃

git merge --abort

Q:切换分支提示有未提交改动

先提交或暂存:

git stash
git switch 其他分支

10. 效率与规范

10.1 常用别名

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.lg "log --oneline --graph --all --decorate"

之后可用 git stgit lg

10.2 提交规范(Conventional Commits)

<类型>(<范围>): <说明>

feat: 新功能
fix: 修复 bug
docs: 文档
style: 格式(不影响逻辑)
refactor: 重构
test: 测试
chore: 构建/工具

示例:

feat(login): 支持手机号验证码登录
fix(api): 修复分页参数越界
docs: 更新安装说明

10.3 最佳实践

  1. 提交小而专注,一个提交只做一件事。
  2. 提交前先 git statusgit diff 检查内容。
  3. 不要提交密钥、密码等敏感信息。
  4. 主分支保持可运行,功能在分支上开发。
  5. 已推送的提交不要 rebase / 强制推送。
  6. .gitignore 排除依赖和构建产物。

11. 实用命令速查

git stash # 暂存现场
git rebase main # 变基到 main
git cherry-pick 提交ID # 挑选提交
git tag -a v1.0 -m "说明" # 打标签
git revert 提交ID # 反向提交
git reflog # 找回历史操作
git blame 文件 # 逐行追责
git bisect # 二分定位
git log -S "关键词" # 搜索改动

12. 学习资源

结合基础篇反复练习分支、合并与撤销,再逐步用上 rebase 与协作流程。

国内直连 GitHub 遇到连接问题时,参见 Git 代理配置