Git 进阶:从只会提交到玩转分支与回滚
约 1 分钟阅读
Git是现代开发必备的版本控制工具,但很多人只会git add、git commit、git push三板斧。本文带你深入学习Git的进阶操作,特别是分支管理和回滚技巧。
Git 工作原理回顾
核心概念
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ Working │────▶│ Index │────▶│ Local │────▶│ Remote │
│ Tree │ │ (Stage) │ │ Repo │ │ Repo │
└─────────┘ └─────────┘ └─────────┘ └─────────┘
│ │ │ │
git add git commit git push clone
四大对象
| 对象 | 说明 |
|---|---|
| blob | 文件内容快照 |
| tree | 目录结构 |
| commit | 提交记录 |
| tag | 版本标签 |
分支管理
查看分支
# 查看本地分支
git branch
# 查看所有分支(包括远程)
git branch -a
# 查看分支详细信息
git branch -v
# 查看已合并到当前分支的分支
git branch --merged
# 查看未合并的分支
git branch --no-merged
创建与切换分支
# 创建新分支
git branch feature-login
# 切换分支
git checkout feature-login
# 或
git switch feature-login
# 创建并切换(新方式推荐)
git switch -c feature-login
# 或
git checkout -b feature-login
# 从特定提交创建分支
git switch -c fix-bug <commit-hash>
删除分支
# 删除已合并的分支
git branch -d feature-login
# 强制删除分支(即使未合并)
git branch -D feature-login
# 删除远程分支
git push origin --delete feature-login
合并操作
基本合并
# 将指定分支合并到当前分支
git merge feature-login
# 合并时禁止快进(保留分支历史)
git merge --no-ff feature-login
合并策略
| 策略 | 命令 | 适用场景 |
|---|---|---|
| Fast Forward | git merge | 无冲突的线性历史 |
| No Fast Forward | --no-ff | 保留分支历史 |
| Recursive | git merge -X theirs | 处理冲突 |
| Squash | --squash | 压缩提交历史 |
# Squash合并(将分支上所有提交压缩成一个)
git merge --squash feature-login
git commit -m "完成了登录功能"
变基(Rebase)
变基可以创造更线性的提交历史:
# 变基到main分支
git rebase main
# 交互式变基(修改历史)
git rebase -i HEAD~3
变基命令说明:
pick- 保留该提交squash- 与前一个提交合并reword- 修改提交信息drop- 删除该提交
解决合并冲突
# 查看冲突文件
git status
# 手动解决冲突后
git add <resolved-files>
git commit
# 或者使用工具
git mergetool
回滚操作
工作区回滚
# 丢弃单个文件的修改
git checkout -- file.txt
# 或
git restore file.txt
# 丢弃所有修改
git checkout -- .
# 或
git restore .
暂存区回滚
# 取消暂存(从Index移回Working Tree)
git reset HEAD file.txt
# 或
git restore --staged file.txt
# 取消所有暂存
git reset HEAD
# 或
git restore --staged .
提交回滚(重点)
场景1:撤销最后一次提交(保留修改)
git reset --soft HEAD~1
# 结果:
# - 提交被撤销
# - 修改保留在暂存区
场景2:撤销最后一次提交(保留修改在working tree)
git reset --mixed HEAD~1
# 或
git reset HEAD~1
# 结果:
# - 提交被撤销
# - 修改保留在工作区
场景3:撤销最后一次提交(完全丢弃)
git reset --hard HEAD~1
# 结果:
# - 提交被撤销
# - 修改被丢弃
# ⚠️ 谨慎使用!
场景4:撤销特定提交
# 创建一个新的提交来撤销指定提交
git revert <commit-hash>
# 撤销多个提交
git revert HEAD~3..HEAD
恢复误删的提交
# 查看所有操作记录
git reflog
# 输出示例:
# a1b2c3d HEAD@{0}: commit: 添加新功能
# e4f5g6h HEAD@{1}: reset: moving to HEAD~1
# b7c8d9e HEAD@{2}: commit: 误删的提交
# 恢复误删的提交
git reset --hard a1b2c3d
高级技巧
暂存工作进度
# 暂存当前工作
git stash
# 暂存并添加说明
git stash save "正在开发登录功能"
# 查看暂存列表
git stash list
# 应用最新暂存
git stash apply
# 应用特定暂存
git stash apply stash@{2}
# 应用并删除
git stash pop
# 删除暂存
git stash drop stash@{0}
# 清空所有暂存
git stash clear
Cherry Pick
选择性地合并某个提交:
# 合并指定提交
git cherry-pick <commit-hash>
# 合并但不自动提交
git cherry-pick -n <commit-hash>
# 合并多个提交
git cherry-pick commit1 commit3 commit5
子模块(Submodule)
管理独立仓库:
# 添加子模块
git submodule add https://github.com/user/repo.git libs/repo
# 克隆包含子模块的仓库
git clone --recurse-submodules <repo-url>
# 更新子模块
git submodule update --remote libs/repo
# 初始化子模块
git submodule init
查找问题
# 查看谁修改了某行
git blame file.txt
# 二分查找问题提交
git bisect start
git bisect bad HEAD
git bisect good v1.0.0
git bisect run test.sh # 自动测试
常用配置
别名配置
# 命令别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.unstage 'reset HEAD --'
# 高级别名
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' --abbrev-commit"
日志美化
# 美化日志输出
git log --oneline --graph --all
# 查看最近N条提交
git log -n 5
# 查看文件历史
git log -p file.txt
# 统计改动
git log --stat
最佳实践
分支命名规范
feature/<issue-id>-功能描述 # 功能分支
bugfix/<issue-id>-问题描述 # Bug修复分支
hotfix/<issue-id>-紧急修复 # 紧急修复分支
release/<version> # 发布分支
提交信息规范
# 推荐格式
<type>(<scope>): <subject>
# type: feat | fix | docs | style | refactor | test | chore
# scope: 影响范围
# subject: 简短描述
# 示例
feat(auth): 添加微信登录功能
fix(payment): 修复支付回调超时问题
docs(readme): 更新安装说明
日常工作流程
# 1. 拉取最新代码
git pull origin main
# 2. 创建功能分支
git switch -c feature/new-feature
# 3. 开发并提交
git add .
git commit -m "feat: 添加新功能"
# 4. 定期同步主分支
git fetch origin
git rebase origin/main
# 5. 完成后合并回主分支
git switch main
git merge --no-ff feature/new-feature
git push origin main
# 6. 删除功能分支
git branch -d feature/new-feature
常见问题
Q: 合并冲突太多怎么办?
# 放弃合并
git merge --abort
# 或者
git rebase --abort
Q: 不小心提交到了错误的分支?
# 1. 在正确分支重新提交
git cherry-pick <wrong-commit-hash>
# 2. 撤销错误分支的提交
git reset --hard HEAD~1
Q: 如何撤销已经push的提交?
# 使用revert(推荐,更安全)
git revert <commit-hash>
git push
# 或者使用reset(需要force push,不推荐)
git reset --hard HEAD~1
git push --force
总结
本文涵盖了Git进阶的核心内容:
- ✅ 分支创建、切换、删除
- ✅ 合并策略与变基操作
- ✅ 各种场景的回滚技巧
- ✅ 暂存、cherry-pick等高级功能
- ✅ 常用配置与最佳实践
Git是工具,熟练需要多练习。建议在项目中主动使用这些高级功能,逐步掌握。
有Git相关问题欢迎留言交流!