ARTICLE DETAIL

资讯详情

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

git-tips 实战手册:Log 与 History 的 40 个高效命令详解

git-tips 实战手册:Log 与 History 的 40 个高效命令详解 文档教程版本控制【免费下载链接】tipsMost commonly used git tips and tricks.项目地址https://gitcode.com/gh_mirrors/ti/tips点击查看免费下载本篇技术指南以开源仓库ti/tipsMost commonly used git tips and tricks中 docs/log-and-history.md 为骨架系统整理 Git 在日志查看、历史检索、差异对比与文件追踪四大场景下的高频命令。你将掌握如何按内容/作者/时间检索提交、区分三种工作区状态、可视化提交树、定位冲突文件、统计作者代码量并获得每个命令的参数语义、替代写法与适用版本说明可直接复制进终端实战。适用前提本文所有命令均可直接运行于 Git 2.x 版本仓库 README 注明各命令曾在git version 2.7.4 (Apple Git-66)上验证本仓库开发环境为git version 2.39.5。涉及旧版兼容性的差异会在对应小节标注。一、先学会求助Git 自带的指南入口查看 Git 随附的帮助指南git help -g-gguide 的缩写会列出 Git 内置的面向场景的指南而非逐条命令的手册页。输出通常包含attributes定义属性cliGit 命令行约定core-tutorial核心入门教程everyday日常 20 条左右的高频命令glossary术语表hooks钩子机制这与 docs/miscellaneous.md 中的git help everyday用大约 20 条命令覆盖日常开发互为补充是排查问题时最快的官方入口。二、按内容、作者与时间检索提交按内容搜索变更pickaxe 搜索git log -Sa term in the source-S又称 pickaxe 选项只显示字符串出现次数发生变化的提交。它与-G的区别是-S关注字符串实例数量的增减-G关注任意正则匹配的行变化。例如追踪某个函数被删除或引入的时刻git log -Sgit-tips --oneline搜索提交信息git log --all --grepgiven-text--grep按提交信息中的文本过滤--all把搜索范围从当前分支扩展到所有分支。配合-i可忽略大小写配合--author可缩小到特定作者。排除指定作者git log --perl-regexp --author^((?!excluded-author-regex).*)$利用 PCRE 的负向前瞻(?!...)列出作者名不匹配excluded-author-regex的所有提交。注意--perl-regexp需要 Git 在编译时启用了 PCRE 支持。限定日期范围git log --sinceFEB 1 2017 --untilFEB 14 2017--since/--until别名--after/--before支持多种日期格式绝对日期2017-02-01、相对时间2 weeks ago、yesterday、2 days ago。查看最近两周改了什么的完整姿势见下文git log --no-merges --raw --since2 weeks ago--raw输出每个提交的文件级原始变更格式--no-merges剔除合并提交聚焦真实改动。替代写法git whatchanged --since2 weeks agogit whatchanged是历史遗留命令逻辑上等价于git log --raw在新版本中仍可用但官方更推荐直接使用git log。限定提交数量git log -n-n是-n n的简写例如git log -5只显示最近 5 条提交。替代写法git log -n n三、文件级历史谁、何时、为何改了这一行查看指定文件的完整变更历史git log -p file_name-ppatch输出每个相关提交的完整差异补丁是这个文件一路走来发生了什么最直观的答案。追踪含重命名历史的文件变更git log --follow -p -- file_path--follow会跨文件重命名继续追踪——当文件被git mv或重命名后普通git log -p会在重命名点中断而--follow能一路追到最初版本。注意--用于分隔路径与选项避免路径名被误解析为选项。逐行追责git blame file-namegit blame逐行显示最后修改该行的提交哈希、作者、时间。这是代码评审与定位历史改动最常用的工具之一。只 blame 指定行区间git blame -L start,end-L限定行范围例如只查看第 10 到 40 行git blame -L 10,40 src/main.py查看最近一次提交的完整信息git show不带参数的git show等价于git show HEAD展示最近一次提交的作者、时间、提交信息与完整 diff是git log -1 -p的便捷替代。直接从另一个分支提取文件git show branch_name:file_name该命令在不切换分支的情况下读取任意分支上任意路径的文件内容适合看一眼其他分支的配置改成了什么样这类场景git show feature/login:config/app.yaml四、三种工作区状态diff 全解Git 有三种状态已修改working tree、已暂存index/staging、已提交HEAD。以下命令分别回答改了什么、暂存了什么、整体差了什么。未暂存的改动工作区 vs 暂存区git diff不带参数的git diff只比较工作区与暂存区的差异即上次git add之后又改了什么。已暂存的改动暂存区 vs 上一次提交git diff --cached比较暂存区与 HEAD即马上要提交的内容。替代写法git diff --staged--staged与--cached完全等价只是更符合语义直觉。全部改动工作区 vs 上一次提交git diff HEAD同时显示已暂存和未暂存的改动即自上次提交以来这个仓库全部变了什么。逐词而非逐行对比git diff --word-diff默认 diff 以行为单位一行里只改了一个单词也会整行标红/标绿。--word-diff改为按词高亮审阅长行内的细微修改时阅读体验极佳。只暂存非空白改动git diff --ignore-all-space | git apply --cached先用--ignore-all-space生成忽略全部空白差异的补丁再通过git apply --cached把它应用到暂存区。效果只暂存真正的代码改动把纯格式/缩进变化留在工作区。用外部工具查看差异git difftool [-t tool] commit1 commit2 pathgit difftool把 diff 交给外部 GUI 工具渲染如 meld、kdiff3、Beyond Compare、vimdiff-t指定工具名也可通过git config diff.tool tool永久配置git difftool -t vimdiff HEAD~1 HEAD src/五、冲突定位与批量处理列出所有冲突文件git diff --name-only --diff-filterU合并/变基产生冲突时冲突文件会带有未合并Unmerged状态。--diff-filterU只筛选状态为 U 的文件--name-only只输出文件名。相比git status的冗长输出这是最干净的一行式冲突清单。一键打开所有冲突文件git diff --name-only | uniq | xargs $EDITOR把上一命令的产物交给xargs批量喂给$EDITOR环境变量指定的编辑器uniq去重防止同一文件重复打开。注意此处使用git diff --name-only列出所有已修改文件若只想打开冲突文件可将前文命令组合使用。六、分支间提交对比列出 Branch1 有而 Branch2 没有的提交git log Branch1 ^Branch2^Branch2表示排除 Branch2 可达的所有提交等价于三点表示法的单侧形式Branch1..Branch2方向相反。这是日常开发中我的分支领先主分支多少提交的标准查法。查看 fork 出 master 之后的所有提交git log --no-merges --stat --reverse master..master..省略第二个引用默认指向 HEAD即当前分支相对 master 的所有提交。--stat附加文件变更统计--reverse按从旧到新的时间顺序输出。只看主干root 与 merge提交git log --first-parent--first-parent只沿每个合并提交的第一个父提交行走忽略合并进来的旁支细节。查看主干演进史或生成 release 变更日志时非常实用。查看一个分支的第一个提交git log --oneline master..branch-name | tail -1tail -1取分支独有提交中最旧的一条即该分支 fork 自 master 后的第一个提交。替代写法git log --reverse master..branch-name | head -6--reverse后取head效果相同示例中取前 6 条是作者演示用实际取 1 条即可。列出尚未推送的提交git log --branches --not --remotes筛选存在于本地分支、但任何远程分支都不存在的提交即本地领先于远端的部分。替代写法git log {u}..{u}是上游upstream引用等价于当前分支相对其跟踪的远程分支多出的提交。git cherry -vgit cherry -v以/-前缀逐条标注本地有而远程没有的提交表示未在远程找到等价补丁。七、追踪 / 未追踪 / 被忽略文件清单查看所有被追踪文件git ls-files -t-t给每个文件加状态标签Hcached已缓存、Sskip-worktree、M未合并等输出格式如H docs/README.md。查看所有未追踪文件git ls-files --others列出工作区中未被追踪的文件相当于git status中 Untracked files 部分的完整清单适合批量确认新增了哪些文件还没 add。查看所有被忽略文件git ls-files --others -i --exclude-standard三个选项组合的语义--others未追踪-iignored被忽略--exclude-standard遵守.gitignore、.git/info/exclude及全局 exclude 标准。结果即因 .gitignore 规则被 Git 无视的文件常用于核对忽略规则是否生效。八、提交树可视化图形化展示提交树git log --prettyoneline --graph --decorate --all--graph以 ASCII 线条绘制分支合并拓扑--decorate在提交旁标注分支名、标签名如(HEAD - master, origin/master)--all覆盖所有分支与引用--prettyoneline每个提交一行。这是纯终端环境下理解分支合并关系的最佳方案。替代写法GUI 版gitk --allgitk是 Git 自带的图形界面历史浏览器支持点击提交查看 diff、搜索提交适合需要精细交互的场景。替代写法自定义格式版git log --graph --prettyformat:%C(auto) %h | %s | %an | %ar%d用format自定义每行输出%h短哈希、%s提交主题、%an作者名、%ar相对时间、%d引用装饰%C(auto)按内容自动着色。展示仅被 reflog 引用的提交树git log --graph --decorate --oneline $(git rev-list --walk-reflogs --all)git rev-list --walk-reflogs --all会把reflog 记录过的所有 HEAD 位置作为起点列出将结果作为参数传给git log就能看到常规分支图上不可见、但曾经被 checkout 或 reset 过的提交比如被git reset抛弃但仍留在 reflog 里的提交。可视化最近 30 天 HEAD 的每次移动git refloggit reflog记录 HEAD 的每一次移动checkout、commit、reset、rebase、merge是撤销误操作的最后防线。输出形如a1b2c3d HEAD{0}: checkout: moving from feature to master即使分支被删、提交被 reset只要 reflog 未过期都能用git reset --hard HEAD{n}找回。九、查看指定提交包含的文件列出某提交中所有变更文件git diff-tree --no-commit-id --name-only -r commit-ish--no-commit-id不输出提交 ID 前缀--name-only只输出文件名-r递归进入子树。效果等价于这个提交改了哪些文件git diff-tree --no-commit-id --name-only -r HEAD配合git rev-parse可批量处理先拿到某次提交的完整哈希git rev-parse commit-ish再用diff-tree展开文件清单。获取仓库根目录路径git rev-parse --show-toplevel输出当前仓库的顶层绝对路径即包含.git的目录无论你在多深的子目录中执行都有效。它是脚本中定位仓库根目录的标准方式。十、作者贡献统计统计某作者的增删行数git log --author_Your_Name_Here_ --prettytformat: --numstat | gawk { add $1; subs $2; loc $1 - $2 } END { printf added lines: %s removed lines: %s total lines: %s\n, add, subs, loc } -分解这条管道命令git log --author...筛出该作者的提交--prettytformat:抑制提交信息输出--numstat每行输出新增行数TAB删除行数TAB文件名gawk累加add为新增行、subs为删除行、loc为净增行数add - subs。替代写法macOS 版git log --author_Your_Name_Here_ --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf added lines: %s, removed lines: %s, total lines: %s\n, add, subs, loc } - # on Mac OSXmacOS 默认没有gawk改用 POSIXawk且printf格式串中的逗号有细微差异。十一、签名、注释与逻辑变量查看提交的 GPG 签名git log --show-signature若仓库启用了 GPG 签名提交git commit -S--show-signature会在每个提交旁输出签名验证结果Good signature或警告。审计提交是否真的来自声称的作者时使用。查看所有 git-notesgit log --show-notes*git notes允许给提交附加注释而不修改提交本身典型用法如 CI 评审意见、发布说明。--show-notes*显示所有命名空间的注释。仓库 docs/basic-operations.md 中的git notes add -m Note on the previous commit....即为写入端命令。显示 Git 逻辑变量git var -l | variablegit var输出 Git 内部计算的逻辑变量如GIT_AUTHOR_IDENT、GIT_COMMITTER_IDENT、GIT_EDITOR。-l列出全部管道过滤可只看单个变量git var -l | grep GIT_EDITOR十二、实践组合把这些命令串成日常流将上述命令组合即可覆盖一次典型的代码评审与排查闭环# 1. 我改了什么、暂存了什么、与上次提交差多少 git diff git diff --cached git diff HEAD # 2. 最近两周哪些非合并提交改了哪些文件 git log --no-merges --raw --since2 weeks ago # 3. 某个文件最近被谁、为什么改 git log --follow -p -- src/main.py git blame -L 1,50 src/main.py # 4. 我的分支领先 master 多少尚未推送多少 git log master.. --oneline git log {u}.. --oneline # 5. 冲突了列出冲突文件并批量打开 git diff --name-only --diff-filterU git diff --name-only | uniq | xargs $EDITOR # 6. 出问题了用 reflog 找回丢失的提交 git reflog本文所有命令均以 docs/log-and-history.md 为基准整理数据源与其在仓库 tips.json 中 Log and History 分类下的结构化条目一一对应该 JSON 是仓库的单一数据源npm run generate会据此自动生成 README 与文档参见 package.json 与 contributing.md。Git 的命令体系博大建议把本文当作速查索引先按场景找到命令再对不确定的参数执行git help command查阅完整手册。赞分享文档教程版本控制【免费下载链接】tipsMost commonly used git tips and tricks.项目地址https://gitcode.com/gh_mirrors/ti/tips点击查看免费下载相关推荐Git 分支管理实战手册git-tips 仓库 Branching 篇 17 条高频命令深度解析Git 分支管理实战手册git tips 仓库 Branching 篇 17 条高频命令深度解析 导读 分支是 Git 工作流的核心载体分支的查看、清理、跟文档教程版本控制Git日志可视化终极指南掌握5个高效git log格式化输出技巧 Git日志可视化终极指南掌握5个高效git log格式化输出技巧 Git作为最流行的版本控制系统其 git log 命令是开发者的必备工具。在hell教程文档Git高手进阶指南5个复杂Git命令实战解析Git高手进阶指南5个复杂Git命令实战解析 Githug是一个创新的Git学习游戏通过实践关卡帮助你掌握Git命令。对于想要进阶的开发者来说rebase教程开发工具上一篇Vue2迁移Vue3vue-ueditor-wrap适配指南与注意事项下一篇推荐开源项目XMLCoder —— 简化Swift中的XML编码与解码创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表