Git 工作流中几个让你事半功倍的实用技巧
Git 的基本操作add、commit、push、pull大家都会但碰到分支混淆、历史需要重写、错误提交要挽回的时候很多人就愣住了——要么直接重拉仓库要么用一些危险的 force push。我把自己日常用 Git 几年下来最实用的几个进阶技巧整理一下每个都附上适用场景。一、什么时候需要这些技巧工作做到一半要切分支当前改了一半的文件还没提交但需要紧急去修另一个 bug直接切换分支会把修改带过去分支历史乱七八糟一堆 fix、update 的提交信息想合并整理一下再发 PR定位 bug 引入时间点线上出了 bug不知道是哪个提交引入的一个个 checkout 看太慢误操作想恢复reset 做错了、分支删错了、提交推错了想找回来二、技巧一stash——手头工作做到一半要切换分支日常工作里最频繁的场景——A 分支改了一半突然需要切到 B 分支去修一个紧急 bug。直接切分支 Git 会报错Your local changes to the following files would be overwritten by checkout。很多人要么临时提交一个半成品要么直接把改动的文件复制出去再复制回来。其实stash就是干这个的# 暂存当前未提交的修改 git stash push -m 用户管理模块重构进行中 # 查看 stash 列表 git stash list # stash{0}: On feature/user-mgmt: 用户管理模块重构进行中 # 切到其他分支处理紧急任务 git checkout main # 修复 bug、提交... git checkout feature/user-mgmt # 恢复之前暂存的修改 git stash pop几个变体用法# 只暂存暂存区的文件不包含未 staged 的新文件 git stash push --staged # 暂存时包含未跟踪的新文件 git stash push -u -m 包含新文件 # 恢复指定的 stash保留 stash 记录 git stash apply stash{0} # 丢弃指定 stash git stash drop stash{0} # 查看某个 stash 的改动详情 git stash show -p stash{1}有个小经验stash push -m 说明一定要写描述信息不然 stash 列表里的stash{0}、stash{1}多了之后根本分不清哪个是哪个。适合功能分支开发中被打断、需要临时切分支处理高优任务。不太适合stash 堆了超过 5-6 个还没处理说明分支切换太频繁应该考虑工作流优化了。三、技巧二rebase -i——把自己的提交历史整理干净再发 PR功能分支开发完成后历史通常是这样的git log --oneline e4f7b21 fix typo a3b2c11 update d1e5f31 fix review comment c2b4a01 implement user login b1e3d11 add tests发 PR 之前把这类开发过程提交整理成几个逻辑单元提交不仅 reviewer 看起来轻松往后回溯历史也更有条理。rebase -i交互式变基就是干这个的# 整理最近的 5 个提交把当前分支的提交合并整理 git rebase -i HEAD~5执行后会进入编辑界面每一行对应一个提交pick c2b4a01 implement user login pick b1e3d11 add tests pick d1e5f31 fix review comment pick a3b2c11 update pick e4f7b21 fix typo常用的操作指令pick保留这个提交默认reword保留提交内容但修改提交信息squash把这个提交合并到上一个提交中并合并提交信息fixup和 squash 类似但丢弃这个提交的提交信息只保留内容最常见的用法是把后续的小修小改 fixup 到功能提交上pick c2b4a01 implement user login pick b1e3d11 add tests fixup d1e5f31 fix review comment fixup a3b2c11 update fixup e4f7b21 fix typo保存退出后历史会变成git log --oneline 9f2c5e1 add tests 7d8a3f1 implement user login两个清晰的逻辑提交checkout 到任意一个都能独立运行和测试。注意rebase会重写提交历史千万不要对已经 push 到远程且其他人基于它工作的分支执行 rebase。只对还未推送的本地分支做。适合发 PR 前整理自己的分支历史让 reviewer 能按实现→测试的逻辑顺序阅读。不太适合已经推送到远程且多人协作的分支改用 merge 来整合。四、技巧三bisect——二分查找定位 bug 是哪个提交引入的线上出了 bug你知道上周之前跑得好好的但不知道怎么查是哪个提交导致的。手动一个个 checkout 太慢了。git bisect用二分法帮你定位它的效率是 O(log n)——假设最近 128 个提交里找只需 7 步# 开始二分查找 git bisect start # 把当前有 bug 的版本标记为 bad git bisect bad # 把最后一个已知正常的版本标记为 good git bisect good v1.2.0 # Git 会自动 checkout 到中间的一个提交让验证 # 此时运行你的测试程序来判断这个版本好不好 # 如果这个版本没问题 git bisect good # 如果这个版本有问题 git bisect bad # 重复每次 Git 会二分缩小范围 # 最终会精确告诉你 # e3a5f7d02c1b4e8f9a0d3c6b7e5f2a1d4c8b9e0f is the first bad commit手动执行麻烦的话可以写个脚本让 bisect 全自动跑# 创建一个测试脚本 test.sh # 返回值0 表示 good1 表示 bad #!/bin/bash pytest tests/test_payment.py # 跑支付相关的测试 # 自动二分查找 git bisect run sh test.sh我碰到过一次支付模块汇率计算精度问题bisect 自动跑了 8 步定位到一个提交把Decimal换成了float做运算。如果不是 bisect人工翻 200 多个提交可能需要半天。适合回归 bug、性能退化、已知某段时间内引入的问题。不太适合第一次出现的 bug 且完全不明确引入时间窗口。五、技巧四reflog——误操作的后悔药Git 最容易被低估的命令就是reflog。很多人不知道Git 默认保留最近 30 天内的所有 HEAD 变动记录——包括 rebase 之前的、已经被 reset 丢弃的、甚至分支删除前的# 查看 HEAD 的变动历史 git reflog # 输出示例 # c4b8e7f HEAD{0}: reset: moving to HEAD~3 # a1b2c3d HEAD{1}: commit: 实现用户导出功能 # f6e5d4c HEAD{2}: checkout: moving from main to feature/excel # 9a8b7c6 HEAD{3}: rebase -i (finish): 整理提交历史几个实用场景恢复 rebase 前的状态# rebase 后发现搞砸了想回到 rebase 之前 git reset --hard HEAD{3} # HEAD{3} 是 rebase 之前的提交恢复被 reset 丢弃的提交# 不小心做了 hard reset git reset --hard HEAD~3 # 后悔了用 reflog 找回来 git reflog # 找到之前的提交 hash比如 a1b2c3d git reset --hard a1b2c3d找回被删除的分支上的提交# 分支删了但分支上的提交还在 reflog 里 git reflog --all # 查看所有引用包括已删分支 git checkout -b recovered-branch commit-hash有个朋友有一次在项目里跑错了 branch把 feature 分支git branch -D删了里面攒了一周的改动。我让他用git reflog --all找到最后一个提交 hashcheckout 回来数据全在。适合各种误操作后想恢复前提是误操作后的 30 天内。不太适合想依赖 reflog 做长期备份——它只是短期应急重要的变动还是要推送到远程。六、选型建议场景对应技巧复杂度风险使用频率切分支时不想提交半成品stash低很低每天发 PR 前整理提交历史rebase -i中较高需注意远程每周找回归 bug 的元凶bisect中低按需误操作想恢复reflog低低按需把特定提交搬到当前分支cherry-pick低中每周注cherry-pick 也是实用技巧之一但篇幅有限不展开了。它和 rebase 配合使用可以灵活地把任意分支上的提交提取到当前分支。什么时候用哪个日常开发被打断 → stash不解释了养成习惯发给 reviewer 之间的交接时刻 → rebase -i 整理一通reviewer 体验会好很多线上出问题怀疑代码变动 → bisect让机器帮你翻提交历史不要自己翻做错了操作 → 先看 reflog大部分误操作都能救回来别急着重拉仓库七、总结Git 的进阶技巧和基础操作的区别在于基础操作让你能动进阶技巧让你动得舒服。stash 解决切换焦虑rebase 解决历史整洁焦虑bisect 解决排查焦虑reflog 解决误操作焦虑。花点时间把这几个命令练熟日常 Git 使用的幸福感会有明显提升。本文提到的 Git 命令均为开源工具 git-scm.com 的标准功能可在所有安装了 Git 的终端中直接使用。

相关新闻

最新新闻

日新闻

周新闻

月新闻