首页 归档 标签 关于

Git 进阶:从只会提交到玩转分支与回滚

约 1 分钟阅读

Git是现代开发必备的版本控制工具,但很多人只会git addgit commitgit 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 Forwardgit merge无冲突的线性历史
No Fast Forward--no-ff保留分支历史
Recursivegit 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相关问题欢迎留言交流!

ESC