【问题标题】:Is it possible to annotate "git diff"?是否可以注释“git diff”?
【发布时间】:2012-10-26 11:22:36
【问题描述】:

我试图总结代码库的“旧”和“新”状态之间的区别。

  • 我可以只执行“git log”,但遗憾的是提交消息并不总是足够的。
  • 我可以执行“git diff”,但我希望看到对我所看到的差异的一些解释,或者至少提交哈希以备后用
  • 我可以对已更改的文件执行“git diff --stat”,然后执行“git annotate”,但我不知道如何要求 annotate 仅显示自特定提交以来的更改。

理想情况下,我希望获得“git diff”的输出,其中所有“+”和“-”行都将使用有关上次引入这些更改的提交的信息进行注释;理想情况下,采用 git pretty 格式(例如哈希、作者和日期)。

如何做到这一点?

【问题讨论】:

    标签: git version-control


    【解决方案1】:

    请注意,您可以向git blame提问:

    • 从某个提交注释 见“Git blame — prior commits?”:git blame -c fe25b6d^ -- src/options.cpp
    • 或从某个日期注释:
      git blame -c --since=3.weeks -- foo

    注意之二:比起git annotate,我更喜欢git blame -c

    此命令和git-blame 之间的唯一区别是它们使用的输出格式略有不同,并且此命令的存在只是为了向后兼容以支持现有脚本,并为来自其他 SCM 系统的人提供更熟悉的命令名称。

    【讨论】:

    • 是的,我看到了这个选项,但它仍然输出完整的文件(只是在指定的提交之前未触及的行标记为那个确切的提交而不是更早的提交),我仍然需要做 git diff --stat 知道要注释哪些文件。
    【解决方案2】:

    我不知道是否有一种简单的方法可以获得带注释的 git diff 结果(如“被指责的差异”)。

    您可以使用 git log -p--full-diff 选项来获取提交消息 + 差异。

    【讨论】:

      【解决方案3】:

      你可以写一个小脚本来做类似的事情

      git blame before > before
      git blame after > after
      diff -u before after
      

      :)

      请参阅man 1 git 回复:GIT_EXTERNAL_DIFF

      【讨论】:

      • 我试着写了一些模型,但是需要考虑的案例太多了。但是,在我看来,这应该是要走的路。
      • 在与未提交的更改进行比较时,我发现 git-annotate 比 git-blame 效果更好。 git-blame 更改了未提交更改的列对齐方式,因此每一行都是一个差异。 YMMV。
      • 这个解决方案的问题是行号包含在责备中。因此,当您区分这两个责任时,偏移行号会导致包含太多内容。唯一不会出现问题的情况是,如果唯一更改了 CHANGED 行(没有添加或删除)。我想你可以做一些其他的魔法来删除行号......
      【解决方案4】:

      我认为目前这并不容易。但是,如果您想查看包含责备信息的文件提交差异的上下文,您可以执行以下操作:

      $ sha1=$(git rev-parse --short HEAD); git blame $sha1 -- filename |grep -C5 --color ^$sha1
      

      git blame 将照常注释文件,grep 将为该提交中引入的每个更改显示五行上下文。

      【讨论】:

        【解决方案5】:

        git-diff-blame 似乎相关。

        在作者和提交等责备信息旁边显示差异

        【讨论】:

          【解决方案6】:

          我开发了一个工具(基于 python)来做到这一点......甚至计算删除的行对反向注释执行 close 的操作(反向注释并不是完全需要的,因为它将显示一行存在的最后一个修订,它实际上不会指向该行被删除的修订,因此它实际上需要更多的分析才能弄清楚)。希望能满足你的需求

          https://github.com/eantoranz/difflame

          【讨论】:

          • 唯一的问题是 difflame 的输出我无法获得删除行的哪个提交(它显示了删除行但提交 ID 不是删除此行的那个)
          • 应该的。有趣的。有我可以查看的公共访问回购吗?
          • 公共访问示例 repo,如 android.googlesource.com/a/platform/system/core 分支:android-12.0.0_r3。 git-diff-责备 cc25244b7^..cc25244b7 ;给出的结果就像' - ^a21c4c1a8' ,a21c4c1a8 是原始提交行,而不是删除该行的提交(cc25244b7),我想我们想知道为什么删除该行而不是添加方式
          • 我正在尝试找出 AOSP 版本之间的真正变化(使用 git log rev..rev 查找 dup 更改),使用 git -C $repo_path --no-pager diff --name-only tag1..tag2 的组合获取差异列表和 git -C $repo_path blame -l -w -C tag1..tag2 -- $file_path | egrep '^[^\^]' | awk -F ' ' '{print $1}' 到使用提交 id 获取更改的行。使用git -C $repo_path log --full-history --no-merges --oneline -1 --pretty='%H' -- $file_path 可以找到全部删除的文件,但是只删除行的提交无法获取
          【解决方案7】:

          我对单个文件有同样的问题,我发现 Visual Studio Code (vscode) 很有帮助。

          • 查看不同目录中的 2 个分支
          • 在一个分支中打开一个文件
          • 比较(ctrl-shift-p)与另一个目录中的相同文件
          • 将鼠标悬停在差异 的提交信息上以查看额外的提交信息

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-10-19
            • 2018-09-18
            • 2016-02-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-12
            相关资源
            最近更新 更多