git:具有提交限制的累积差异

2023-11-26

git log有一些非常有用的提交限制选项, 例如--no-merges and --first-parent。我希望能够在为一系列提交生成累积差异补丁/stat/numstat 时使用这些选项。

使用这些命令:

git log --oneline --first-parent --no-merges --patch   29665b0..0b76a27
git log --oneline --first-parent --no-merges --stat    29665b0..0b76a27
git log --oneline --first-parent --no-merges --numstat 29665b0..0b76a27

差异不是累积的(针对每个提交单独列出更改)。

使用这些命令:

git diff --patch   29665b0..0b76a27
git diff --stat    29665b0..0b76a27
git diff --numstat 29665b0..0b76a27

差异is累积起来,但不幸的是git diff不支持提交限制选项。

所以我想要的是累积差异功能git diff结合提交限制功能git log.

我的一个想法是使用git log生成提交哈希列表,然后以某种方式将该列表传输到git diff生成指定提交的累积差异。像这样的东西(显然这种通过管道传输散列的方法git diff实际上不起作用):

git log --pretty=format:%h --first-parent --no-merges 29665b0..0b76a27 | git diff

where --pretty=format:%h输出匹配提交的哈希值。


Update

感谢@torek和@twalberg,我现在明白了git diff的操作更加清晰。范围语法29665b0..0b76a27确实具有误导性,我现在明白它实际上并没有在一系列提交上执行累积差异。纵观整个docs, 我找到了这个:

“diff”是关于比较两个端点,不是范围,以及范围符号 (<commit>..<commit> and <commit>...<commit>)并不表示“指定范围”部分中定义的范围git 修订版(7).

考虑到这一点,我将重新表述我的问题。使用这些命令:

git log --oneline --first-parent --no-merges --patch   29665b0..0b76a27
git log --oneline --first-parent --no-merges --stat    29665b0..0b76a27
git log --oneline --first-parent --no-merges --numstat 29665b0..0b76a27

对于每个匹配的提交,单独列出更改。如何组合这些单独的更改以生成累积补丁/stat/numstat?

链接的答案可能重复的问题很有帮助,建议一个解决方案:创建一个临时分支,挑选相关提交,然后生成差异。

我刚刚发布了一个使用这种技术的答案,但我仍然有兴趣知道是否有一个不需要临时分支的解决方案?


这里至少存在一种基本的误解。具体来说,git diff根本不是真正的累积:相反,它只是成对的。

具体来说,这两个命令执行相同的操作:

git diff rev1 rev2
git diff rev1..rev2

也就是说,在git diff,首先确实不存在范围这样的东西。


With that out of the way, let's take a look behind the scenes at git log. What git log does with a range is really1 to hand the range to git rev-list, which produces a list of every rev in the range, applying the modifiers along the way:

git rev-list 29665b0..0b76a27

吐出每一个可达到的转速0b76a27也无法从以下位置到达29665b0。添加--first-parent, --max-parents=1 (aka --no-merges),依此类推,过滤掉此处列出的一些转速。

最终结果返回给git log,然后查看顺序中的每个修订git rev-list将它们吐出来——这也可以通过以下方式控制--date-order and --topo-order等等;看到git rev-list 的文档- 并显示每个日志条目,可能还包括由git diff-tree(对于单父提交,将提交与其父提交进行比较)。

那么你能做的就是调用git rev-list你自己直接,然后从其输出中剥离顶部和底部的修订。 (在这种特殊情况下,您可能想要--topo-order同样,以确保最后的转数确实是最早的,从图表角度来看,无论日期如何。)例如,在脚本中:

#! /bin/sh
tempfile=$(mktemp -t mydiff)
trap "rm -f $tempfile" 1 2 3 15
git rev-list 29665b0..0b76a27 --first-parent --no-merges --topo-order > $tempfile
# remember that the first rev listed is the last rev in the range
last=$(head -1 $tempfile)
first=$(tail -1 $tempfile)
rm -f $tempfile # done with it, don't leave it around while showing diff
git diff $first $last

你可以通过使用变得更加花哨git rev-parse解析选项并将它们拆分为 diff 选项与 rev-list 选项,但这远远超出了您在这里所需要的。上述改进的主要内容是摆脱硬编码的修订范围。


1Some git commands really really do hand arguments off to git rev-list, as they're just shell scripts that use git rev-list and other git commands to handle this. Others are built together, so that git log and git rev-list are actually a single binary, and one part hands a job off to another part, but without invoking a new program.

无论如何,请注意git log master简单的双手master off to git rev-list,它生成从分支标签可到达的所有转速的列表master。如果你添加--no-walk, git rev-list仅产生一转,因此git log仅显示该修订版。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

git:具有提交限制的累积差异 的相关文章

  • 如何预览 Git 中的隐藏内容?

    我想检查一个存储 并找出如果我将其应用于当前状态的工作树 它会发生什么变化 我知道我可以对存储进行 git diff 但这向我展示了工作树和存储之间的所有差异 而我只是想知道存储应用将改变什么 git stash show将向您显示最近存储
  • 我可以通过链接分享我的私人 GitHub 存储库吗?

    我在 GitHub 上的私人存储库中有一个 Java 应用程序 我想与没有帐户的人共享它 我在网站上没有找到任何与此相关的选项 有没有办法做到这一点 协作者只能是 GitHub 用户 无法在非 Github 用户之间共享私有存储库 您需要
  • 如何查看上次提交和现在之间发生了什么变化(进行一些更改后)

    与此类似question https stackoverflow com questions 1552340 how to list the file names only that changed between two commits但
  • 如何使用 .gitattributes 避免在 git root 中包含文件夹,但在 zip 的 dist 文件夹中包含同名文件夹

    我有一个名为lib在存储库的根目录和另一个名为lib在 dist 文件夹中 我正在尝试使用 gitattributes文件排除除 dist 之外的所有文件夹和文件 以便任何下载为 zip 或 tarball 的人都只会 git 分发文件 我
  • vscode通过SSH连接gitlab的问题

    我在尝试通过 SSH 连接到 GitLab 远程存储库时遇到问题 这里是迄今为止完成的步骤 成功生成 SSH 密钥 管理人员将密钥添加到存储库中 因此当我访问 GitLab 网站时 我可以提交和发布分支 我无法从 VSCODE 发布分支并收
  • git 可以与 Xcode 集成吗?

    有没有办法将 git 存储库与 Xcode 内置的 SCM 功能一起使用 Xcode 4 原生支持 git WWDC 2010 上的开发者工具国情咨文演讲 在这里了解更多 Xcode 4 中的新增功能 http developer appl
  • 使用 TFS 个人访问令牌克隆 Git 存储库

    我正在尝试以编程方式克隆 git 存储库 我的 ASP NET MVC 应用程序正在创建并启动一个进程 处理进程的代码工作正常 但是当尝试使用本地 TFS PAT 克隆 git 存储库时 身份验证失败 我无法使用 NTLM 或要求用户输入凭
  • Git 无效的修订范围 Symfony2 Composer 外部包

    RuntimeException Failed to execute git log 18efcf67d236d5bbf46ac67820250dffd0474b6e 94e2146f525fa1367e15646fa273e5b34f92
  • 忽略 git 中的本地配置文件

    Rails 应用程序中有一些本地文件 属于我们存储库的一部分 我希望 git 忽略它们 基本上 我希望 git 忽略我对 config environments 目录和 config application rb 文件中的任何内容所做的所有
  • 如何使用交互式变基将提交编辑为未提交?

    我想使用交互式变基来编辑以前的提交 但是当我进入该提交的编辑模式时 所有文件都已提交 我知道我可以进行更改并修改提交 但我希望所有更改最初都未提交 暂存或以其他方式 这样我就可以对其进行编辑 就像在最初提交之前一样 这可能吗 Imagine
  • git Push over sshfs 失败,并显示“关闭 sha1 文件时出错:错误的文件描述符”

    我们使用 sshfs 通过 SSH 安装文件系统 并将其用作 git 存储库协作的远程存储 Mac OSX 10 6 6 到 RHEL 3 服务器 SSHFS 版本 2 2 MacFUSE SSHFS 2 2 0 MacFUSE 库版本 F
  • Composer 用于下载私有 GitHub 存储库

    我无法使用 Composer 下载 github 私人存储库 php composer phar update 我收到以下错误 The https api github com repos company private1 https ap
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • Git - 创建拉取请求而不分叉

    使用 git 已经有一段时间了 关于 git pull request 有很多教程和解释 其动机是什么等等 我遇到两种情况 1 分叉 git 仓库 我查看了一些公共 git 存储库并决定我想要做出贡献 所以我 通过以下方式创建重复的存储库F
  • Ansible bitbucket 克隆存储库配置 ssh 错误

    我之前发布过这个问题 但那里的答案不再有效 总之 当使用 Ansible 配置我的 vagrant box 时 在尝试使用 ssh 克隆我的 bitbucket 私有存储库时 我遇到了一个神秘的错误 该错误指出 权限被拒绝 公钥 然而 如果
  • VS 2015 + Bower:在防火墙后面不起作用

    Problem 在 Visual Studio 2015 中 使用 Bower 我的包在防火墙后面时恢复失败 并出现类似以下内容的错误 ECMDERR 无法执行 git ls remote tags heads git github com
  • 无法从 Sourcetree 拉取 Git 远程存储库

    我生成了 ssh 密钥并配置了我的 git 和 SourceTree 我可以 git pull 并从 Git bash 执行其他操作 注意 我在 bashrc 中添加了以下内容以使其正常工作 eval ssh agent ssh add 然
  • 在 Azure DevOps 项目之间移动存储库时保留拉取请求

    我在同一帐户内有两个 Azure DevOps 项目 我想将存储库从一个项目移动到另一个项目 这一页探索如何在具有完全保真历史记录的团队项目之间移动 git 存储库 https learn microsoft com en us azure
  • 使用终端时 Git 推送在总计后卡住了?

    我尝试将一些文件推送到Github 总大小只有22 2M 我不知道为什么它在总行之后卡住了 我读过推送到 Github 时 Git 推送挂起 https stackoverflow com questions 16906161 git pu
  • Netbeans 和 Git,.obj 文件被忽略

    我正在开发一个涉及 obj 文件的小型 git 项目 当我查看 项目选项卡 时 我发现它们被忽略了 但如果我查看我的 gitignore 我无法理解为什么 DepthPeeling nbproject private DepthPeelin

随机推荐