尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

til 仓库 Git 技巧:用 git log -p 在提交历史中直接查看文件 Diff

til 仓库 Git 技巧:用 git log -p 在提交历史中直接查看文件 Diff 文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载在日常代码审查与历史追溯中我们经常需要同时确认这次提交改了什么与具体是怎么改的。默认的git log只展示提交元信息作者、时间、提交说明而git log -p可以在浏览提交历史的同时把每个提交对应的文件 Diff 一并展示出来无需再逐个执行git show。本文以本仓库tilToday I Learned 系列笔记仓库为实例完整讲解git log -p的用法、输出结构并结合仓库中积累的 Git 技巧笔记介绍--stat、路径过滤、范围语法、分页器与外部 Diff 工具等配套玩法帮助你把这一个命令用好、用透。git log -p基础用法提交历史与 Diff 同屏展示在 show-file-diffs-when-viewing-git-log.md 中记录的核心技巧非常简洁为git log命令加上-p标志即可把每个提交的 Diff 与其余信息一并输出。$ git log -p在本仓库中运行这条命令会得到类似下面的输出截取自仓库历史中的一个提交$ git log -p commit b9809a329acd8150b2474168f8faaf008f376e35 Author: jbranchaud jbranchaudgmail.com Date: Wed Oct 11 07:27:53 2017 -0500 Add Inline Style Attributes Should Be Camel Cased as a react til diff --git a/README.md b/README.md index c982f8e..6ee7d32 100644 --- a/README.md b/README.md -10,7 10,7 smart people at [Hashrocket](http://hashrocket.com/). For a steady stream of TILs from a variety of rocketeers, checkout [til.hashrocket.com](https://til.hashrocket.com/). -_574 TILs and counting..._ _575 TILs and counting..._ ---输出结构逐段解读git log -p的输出实际上是若干段提交信息 若干段 diff的交替组合每段提交对应一组 diff提交头commit header完整 SHA、作者、时间戳、提交说明。命令默认按时间倒序排列最新的提交在最前面。diff 文件头diff --git a/README.md b/README.md标明变更的文件index c982f8e..6ee7d32 100644给出文件在两个版本中的 blob 哈希与文件模式。---与行分别对应旧文件a/与新文件b/。hunk 头 -10,7 10,7 表示旧文件第 10 行起共 7 行、新文件第 10 行起共 7 行后随上下文片段。变更内容-前缀为删除行前缀为新增行无前缀为上下文行。以上例来说这是一个标准的计数递增提交作者新增一篇 react 主题的 TIL 笔记同时把 README 中的_574 TILs and counting..._更新为_575 TILs and counting..._。这种新增文件 更新计数的提交模式在 til 仓库中十分常见用git log -p一条命令就能完整复盘整个改动过程。等价形式与注意事项-p与--patch等价git log --patch写法同样合法-p只是简写。git log -p输出的完整字段diff 头、index 行、hunk 头等与git diff保持一致因为两者底层复用同一套 diff 渲染逻辑。当提交涉及多个文件时每个文件会依次输出一段独立的diff --git ...块。若某提交是一次 merge合并提交git log -p默认不展开合并差异需配合-m或--first-parent等参数处理可查阅man git-log了解详情。用--stat先看统计再决定要不要看全文git log -p的信息量最大但也最容易刷屏。如果想先快速掌握每个提交动了哪些文件、增删了多少行可以改用--stat标志只输出每个提交的 diffstat 统计摘要而不输出具体 diff 内容。这一点在 include-some-stats-in-your-git-log.md 中有完整示例$ git log --stat commit 66e67741a1cd6857a4467d1453c9f17ef5849f20 Author: jbranchaud jbranchaudgmail.com Date: Mon Nov 13 21:24:41 2017 -0600 Add Focus The URL Bar as an internet til README.md | 3 - internet/focus-the-url-bar.md | 10 2 files changed, 12 insertions(), 1 deletion(-) commit 9241e3919ef1e4f68b71a1491d368ae6361084aa Author: jbranchaud jbranchaudgmail.com Date: Sat Nov 11 11:41:40 2017 -0600 Add Freeze An Object, Sorta as a javascript til README.md | 3 - javascript/freeze-an-object-sorta.md | 44 2 files changed, 46 insertions(), 1 deletion(-) ...每个文件后的竖线柱状图直观展示相对改动量末尾的2 files changed, 12 insertions(), 1 deletion(-)是汇总。这与git log -p是互补的两档输出粒度先用--stat扫一遍改动规模再用-p聚焦细看。类似的show-the-diffstat-summary-of-a-commit.md 记录了对单个提交执行git show sha --stat的用法$ git show 8a1f36a1ce --stat commit 8a1f36a1ce71d708d1d82afbc2191de9aefba021 Author: Derek Parker derek.parkercoreos.com Date: Wed Jan 27 23:47:04 2016 -0800 dlv: Flag to print stacktrace on trace subcommand cmd/dlv/main.go | 45 ----------------------------------- terminal/command.go | 7 -- 2 files changed, 15 insertions(), 37 deletions(-)diffstat 工具的本质是读取 diff 输出按文件绘制插入、删除、修改的直方图——git log --stat、git show --stat都是 Git 内置的 diffstat 呈现方式。如需更细的字段控制git log --stat还支持--stat-width、--stat-name-width等参数调整列宽。只要文件名、不要 diff--name-only与--name-status如果只关心这个提交改了哪些文件连统计行数都嫌多可以使用--name-only。相关技巧记录在 list-filenames-without-the-diffs.md$ git show HEAD --name-only commit c563bafb511bb984c4466763db7e8937e7c3a509 Author: jbranchaud jbranchaudgmail.com Date: Sat May 16 20:56:07 2015 -0500 This is my sweet commit message app/models/user.rb README.md spec/factories/user.rb该技巧以git show为例但同样适用于git loggit log --name-only会为每个提交列出涉及的文件清单。若还想知道每个文件的变更类型新增 A / 修改 M / 删除 D / 重命名 R可改用--name-status$ git log --name-status--name-only、--name-status、--stat、-p构成了从文件名 → 统计 → 全文 diff的完整信息阶梯可按场景任意组合选用。缩小 Diff 范围路径过滤、范围语法与行号追踪git log -p全量输出在历史较长的仓库中会非常冗长。本仓库的多个技巧笔记给出了三种实用的瘦身手段。按路径/目录过滤show-changes-for-files-that-match-a-pattern.md 指出可以在命令末尾追加路径参数只展示匹配文件的变更# 只看 CSS 文件的变更 $ git show abcd1234 *.css # 只看 src/css 目录内的变更 $ git show abcd1235 src/css同样的路径过滤pathspec语法可直接用于git log例如本仓库中只想看git/目录下的笔记变更$ git log -p -- git/甚至可以叠加--follow跟踪文件重命名或结合 show-changes-in-the-compose-commit-message-view.md 的思路按模式匹配文件。用..与...限定提交范围two-kinds-of-dotted-range-notation.md 详细区分了两种点号范围语法。两点语法A..B表示在 B 中但不在 A 中的提交❯ git log master..some-feature-branch --oneline 9e50bff (some-feature-branch) Add second feature change b11bb0b Add first feature change把两侧换位即可反过来查看另一分支的新增提交❯ git log some-feature-branch..master --oneline c2880f8 (HEAD - master) Add description to README三点语法A...B表示两侧各自独有的提交全集对称差❯ git log master...some-feature-branch --oneline c2880f8 (HEAD - master) Add description to README 9e50bff (some-feature-branch) Add second feature change b11bb0b Add first feature change将范围语法与-p组合例如git log -p master..some-feature-branch就能只查看某个分支相对另一分支的全部差异细节是 Code Review 前的高频操作。按行号追踪特定代码的演化Git 1.8.4 起git log支持-L标志按文件的行号范围过滤提交相关用法记录在 show-only-commits-that-touch-specific-lines.md# 查看所有改动过 README.md 第 13 行的提交 $ git log -L13,13:README.md # 查看改动过第 1945 行的提交 $ git log -L19,45:README.md-L非常适合追溯某行代码/某条依赖是什么时候引入的。该笔记作者提到曾用它定位package.json中某个依赖的引入提交尽管该行最近的改动只是版本号升级。-L同样可以与-p等效地展示每个命中提交的具体 diff。控制阅读体验分页器、外部 Diff 工具与 Diff 算法git log -p输出通常很长Git 默认用less分页器展示支持上下滚动与/搜索。本仓库记录了三种优化阅读体验的方式。配置分页器configuring-the-pager.md 说明Git 会为git-diff、git-log这类大输出命令自动启用分页器默认是less可以替换# 换用 more $ git config --global core.pager more # 彻底关闭分页器适合管道输出场景 $ git config --global core.pager 接入外部 Diff 工具use-external-diff-tool-like-difftastic.md 记录了两步接入法通过-c diff.external二进制指定外部 diff 工具同时必须加上--ext-diff标志才会真正生效$ git -c diff.externaldifft show --ext-diff关键陷阱是仅配置diff.external而忘记--ext-diff仍会回退到默认的 diff 渲染。这一规则同样适用于git log --ext-diff。另一条更主流的思路记录在 better-diffs-with-delta.md把delta同时配置为分页器与 diff 过滤器可获得语法高亮、行内变更高亮等视觉增强[core] pager delta [interactive] singleKey true # unrelated, but nice to have diffFilter delta --color-only更换 Diff 算法如果默认算法在大改动集上产生错位噪声diffing-with-patience.md 建议使用patience算法——它聚焦于两侧各只出现一次的高信息量行作为特征签名来做最长公共子序列匹配diff 结果通常更整洁代价是略慢$ git config --global diff.algorithm patience或直接写入~/.gitconfig[diff] algorithm patience该配置对所有 diff 渲染包括git log -p的 diff 部分全局生效。在本仓库中的实战场景以 til 仓库本身为例git log -p的典型应用场景包括回顾新增笔记类提交这类提交通常同时包含新增的.md笔记文件与 README 计数更新如文档示例中的_574 TILs and counting..._→_575 TILs and counting..._一条命令即可完整看到新笔记 计数更新的全貌确认特定目录的改动配合git log -p -- git/之类路径过滤只审查某个主题目录的笔记变更审查分支差异配合git log -p master..feature查看分支之间的全部内容差异。更多配套技巧可继续查阅本仓库的 git 目录 下的笔记例如 show-changes-for-files-that-match-a-pattern.md、list-filenames-without-the-diffs.md 等。关于-p标志的完整语义与可组合参数可参阅man git-log。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐LeetCode 1152 Analyze User Website Visit Pattern 题解哈希表聚合 三重循环枚举用户访问序列LeetCode 1152 Analyze User Website Visit Pattern 题解哈希表聚合 三重循环枚举用户访问序列 本篇技术指南围文档教程知识库TIL 项目实战使用 git log --stat 在提交历史中查看增减统计TIL 项目实战使用 git log stat 在提交历史中查看增减统计 git log 默认只展示提交哈希、作者、日期与提交信息当我们需要评估每次提交的改文档教程知识库大麦网抢票脚本手把手指南从环境配置到自动下单大麦网抢票脚本手把手指南从环境配置到自动下单 这个仓库是一个大麦网抢票脚本先用 Selenium一个用 Python 控制真实浏览器的库相当于替你的手在网页爬虫工作流自动化上一篇终极IPXWrapper教程5分钟让经典游戏在现代Windows系统重获联机功能下一篇Autoclick终极指南如何用Mac自动点击工具1秒完成900次点击创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表