ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

终端与命令行进阶(7):命令行下的 Git 高效用法

终端与命令行进阶(7):命令行下的 Git 高效用法 上一篇把重复流程封装成有参数和退出码的函数本篇把这种接口意识用于 Git。高效不是少看 diff 就更快而是用暂存区、引用和可恢复操作把一次改动整理成审阅者能理解的提交。一、痛点工作区、暂存区与提交混成一团Git 至少涉及 HEAD、暂存区和工作区三份状态。git diff比较工作区与暂存区git diff --staged比较暂存区与 HEADgit status --short汇总路径状态。提交前只看第一条会漏掉已经暂存的内容可靠习惯是同时看状态、暂存 diff 和未暂存 diff。暂存区允许用git add -p按 hunk 选择把格式化、重构和行为修改拆成独立提交。拆分不是追求提交数量而是让每个提交能单独解释、测试和回退。对二进制或自动生成文件先确认仓库策略避免把构建产物混进源代码变更。二、原理引用移动与数据恢复分支只是指向提交的可移动引用HEAD 表示当前检出位置。rebase 会复制提交形成新对象因此已共享分支不能随意改写若确需更新远端--force-with-lease会检查远端是否仍是预期值比裸--force安全但仍应遵守团队规则。restore主要恢复工作区或暂存区文件switch切换分支语义比多用途 checkout 清楚。误操作后先停手用git reflog找 HEAD 曾经指向的位置再建立救援分支不要立刻运行清理和垃圾回收。reset --soft、--mixed、--hard分别影响不同层其中 hard 会覆盖工作区执行前必须确认目标。可审阅性可以先用简单规则做门禁再交给人判断语义。下面程序接收一组拟提交文件检查是否混入秘密、生成物或跨度过大的目录。它不会调用 Git也不会改仓库因此可独立运行。把规则迁移到 pre-commit 或 CI 时仍应保留人工覆盖机制因为规则能暴露风险不能替代对改动意图的理解。fromdataclassesimportdataclassfrompathlibimportPurePosixPathdataclass(frozenTrue)classChange:path:stradded:intdeleted:intchanges[Change(src/parser.py,28,6),Change(tests/test_parser.py,34,2),Change(docs/parser.md,12,0),]forbidden{.env,id_rsa,credentials.json}errors:list[str][]roots:set[str]set()total0forchangeinchanges:pathPurePosixPath(change.path)roots.add(path.parts[0])totalchange.addedchange.deletedifpath.nameinforbidden:errors.append(fsecret-like file:{change.path})ifpath.suffixin{.pyc,.class}:errors.append(fgenerated file:{change.path})print(ffiles{len(changes)}changed_lines{total})print(roots,.join(sorted(roots)))print(fpolicy_errors{len(errors)})print(freviewable{noterrorsandtotal120})运行输出files3 changed_lines82 rootsdocs,src,tests policy_errors0 reviewableTrue三、实现创建可审阅提交下面脚本执行只读门禁拒绝 detached HEAD、列出状态、检查暂存 diff 空白错误并运行项目已有测试入口。它不自动git add或提交让开发者保留对边界的判断。#!/usr/bin/env bashset-euopipefailroot$(gitrev-parse --show-toplevel2/dev/null)||{echo不在 Git 仓库中2exit2}cd$rootbranch$(gitsymbolic-ref--quiet--shortHEAD)||{echo当前为 detached HEAD请先建立分支2exit2}printfbranch%s\n$branchprintf%s\n[status]gitstatus--shortprintf%s\n[staged summary]gitdiff--staged--statifgitdiff--staged--quiet;thenecho暂存区为空2exit1figitdiff--staged--checkif[[-x./scripts/test]];then./scripts/testelif[[-fMakefile]]grep-q^test:Makefile;thenmaketestelseprintf%s\n未发现统一测试入口请手动验证fiprintf%s\n[review]gitdiff--staged--name-statusprintf%s\n门禁通过请再次阅读 git diff --staged 后手动提交。历史查询应用 Git 自己的格式接口。下面按作者、日期和路径检索并用稳定分隔符输出--明确分开修订和路径避免文件名被解释成分支。author${1:-}path${2:-.}gitlog\--since3 months ago\--author$author\--dateshort\--format%h%x09%ad%x09%an%x09%s\--$path|whileIFS$\tread-rhashdatename subject;doprintf%-10s %-10s %-18s %s\n$hash$date$name$subjectdone四、踩坑漂亮历史与真实协作冲突频繁 pull 而不理解策略会产生意外 merge commit。团队应明确pull.rebase或仅允许 fast-forward并在运行前 fetch 查看差异。stash 适合短暂切换不是长期存储给 stash 写消息并尽快恢复未跟踪文件需显式包含。长期并行任务更适合git worktree每个工作区绑定不同分支共享对象数据库。不要在提交中包含密钥再“删除”因为历史仍保存对象。应立即轮换凭据再按协作范围选择历史重写工具并通知所有克隆者。签名提交能证明密钥持有者签署了对象但不能证明代码正确仍需评审和 CI。五、验证从审阅者视角验收提交前运行git show --stat --oneline HEAD和针对性测试确认消息说明“为什么”diff 只含主题相关文件。模拟从父提交应用该提交验证它能独立构建。恢复演练则在临时仓库制造一次错误 reset再用 reflog 建分支找回熟悉流程胜过出事时搜索命令。下一篇进入 Shell 脚本自动化把函数提升为带严格输入、临时目录、清理钩子和可测试输出的独立程序。参考来源Pro GitGit Basicsgitrevisions 手册git reflog 手册 觉得有用就点个赞 收藏方便回头查阅有疑问直接在评论区留言我看到都会回。 本文属于《终端与命令行进阶》系列持续更新关注不迷路。 文章里的代码都能直接跑。想要可直接 clone 的完整工程 配套部署脚本 / 踩坑清单评论一声或发邮件到cj2664qq.com我免费发你。如果你正好在做类似系统、或有工程化难题想找人做也欢迎邮件聊一句——我按实际情况评估能落地的就接单或出方案。评论和邮件都能直接找到我不用跳别的平台。—延伸阅读持续更新我的免费体系专栏《AI Agent 应用实战》《RAG 知识库问答实战》以及付费专栏《提示词工程实战》10 篇 ¥19.9都在博客主页 https://blog.csdn.net/weixin_67153745 文中问题欢迎评论区交流接单/合作可私信。
返回列表