Git 高级技巧

Git 高级技巧:提升代码管理效率

Git是现代软件开发不可或缺的版本控制工具。除了基础的commit/push/pull之外,掌握高级技巧可以让代码管理更加优雅高效。本文分享实用的Git高级操作技巧。

一、交互式变基(Interactive Rebase)

# 整理最近5个commit:合并、修改、删除、重新排序
git rebase -i HEAD~5

# 交互界面选项说明
# pick   使用该commit(不变)
# reword 使用该commit,但修改commit message
# edit   使用该commit,但暂停允许修改内容
# squash 合并到上一个commit(保留所有commit message)
# fixup  合并到上一个commit(丢弃该commit的message)
# drop   删除该commit

# 场景:将多个WIP commit合并成一个干净的commit
# 原来有5个"WIP"commit,rebase后合并成1个

二、stash:临时保存工作

git stash push -m "feat: 正在开发的登录功能"  # 保存工作区到stash
git stash list                                  # 查看所有stash
git stash pop                                   # 恢复最新的stash(并删除)
git stash apply stash@{2}                       # 恢复指定stash(保留stash)
git stash drop stash@{0}                        # 删除指定stash
git stash branch feature/login stash@{1}        # 基于stash创建新分支

三、cherry-pick:精选提交

# 将其他分支的某个commit应用到当前分支
git cherry-pick abc1234                         # 应用单个commit
git cherry-pick abc1234 def5678                 # 应用多个commit
git cherry-pick abc1234..def5678                # 应用一段范围的commit

# 场景:hotfix分支修复了一个bug,cherry-pick到develop分支
git checkout develop
git cherry-pick hotfix/abc1234

四、Bisect:二分法定位Bug

# 在数百个commit中快速找到引入bug的那个commit
git bisect start
git bisect bad                    # 当前版本有bug
git bisect good v1.0.0            # v1.0.0版本正常

# Git自动checkout中间的commit,你测试后标记good或bad
git bisect good  # 当前版本正常,继续二分
git bisect bad   # 当前版本有bug,继续二分
# 重复上述步骤,约8步即可在256个commit中定位到问题commit

git bisect reset  # 完成后重置到初始状态

五、Reflog:恢复误删数据

# 查看所有HEAD指针的历史(包括已删除的分支、reset前的状态)
git reflog

# 恢复被hard reset删除的commit
git reflog  # 找到reset前的commit hash
git reset --hard abc1234  # 恢复到该commit

# 恢复已删除的分支
git reflog  # 找到分支最后一个commit hash
git checkout -b recovered-branch abc1234

六、高级日志查看

# 图形化分支树(极其实用!)
git log --oneline --graph --all --decorate

# 搜索commit message
git log --grep="fix bug"

# 搜索代码变更(谁改了这行代码)
git log -S "function loginUser"  # 查找添加或删除该字符串的commit
git log -G "loginUser.*password" # 使用正则表达式

# 查看某文件的修改历史(包含重命名跟踪)
git log --follow -p src/auth.js

# 两个分支间的差异
git log main..feature/login  # feature分支上有但main没有的commit

七、Git Alias配置

# ~/.gitconfig 添加别名
[alias]
    st = status
    co = checkout
    br = branch
    cm = commit -m
    lg = log --oneline --graph --all --decorate
    undo = reset HEAD~1 --mixed  # 撤销最后一次commit(保留修改)
    unstage = reset HEAD         # 取消暂存
    aliases = config --get-regexp alias  # 查看所有别名

# 使用
git lg    # 图形化日志
git undo  # 撤销最后一次commit

八、工作流最佳实践

  • 使用约定式提交(Conventional Commits):feat/fix/docs/refactor等前缀
  • 功能分支开发,定期rebase main分支保持更新
  • PR合并前使用rebase整理commit历史
  • 使用.gitignore忽略不需要追踪的文件
  • 配置pre-commit钩子自动运行Lint和测试
  • 重要的里程碑版本打Tag并写Changelog

九、总结

Git的高级特性是提升代码管理质量的利器。交互式rebase可以让提交历史整洁清晰;bisect可以快速定位Bug;reflog是后悔药,防止误操作造成数据丢失。这些技巧在实际项目中用起来,会发现日常的代码管理工作效率大幅提升。