`git blame / annotate`:在合并提交时终止

时间:2015-09-08 16:50:52

标签: git

团队成员之间存在争议:

  1. 有些人喜欢在合并之前看到拉动请求被压扁
  2. 有些人喜欢能够看到功能开发的提交历史。
  3. 作为倾向于第二阵营的人,我看到第一阵营的主要反对意见集中在git blame / git annotate,显示更改所针对的提交与引入更改的提交不同目前的分支。

    我找不到git blame / git annotate上的任何命令行选项,它会在合并到当前分支时停止。

    这个问题可以通过以下答案解决:是否有一些我缺少的辅助命令或者这是我需要提交的功能请求?

    (更新:同事们还抱怨说,用许多PR可视化历史是一种痛苦,但我相信gitk等有解决这个问题的标志)

3 个答案:

答案 0 :(得分:1)

虽然我自己确实倾向于第二阵营,但我不知道有git annotate实现这一目标的任何选择。

因此,要回答您的问题,您可能需要提交功能请求。但是根据the docs

,我怀疑它不会被接受
  

此命令仅用于向后兼容以支持   现有脚本,并为人们提供更熟悉的命令名称   来自其他SCM系统。

答案 1 :(得分:1)

这是一个提供所需输出的命令链:

git rev-list --first-parent HEAD | awk '{print p " " $0}{p=$0}' > tmpfile && \
 git blame -b -S tmpfile HEAD -- path && rm tmpfile

我还向git项目提交了feature request ...我们将会看到这是怎么回事

答案 2 :(得分:0)

除了requested的修复Stephen Connolly之外,将第一父母与反向结合应该会在Git 2.7(Nov / Dev 2015)中出现。

commit 700fd28commit 1b0d400commit ec35240Max Kirillov (max630)(2015年10月30日)。
(由Junio C Hamano -- gitster --合并于commit 6784eb5,2015年11月3日)

  

blame:在有意义时允许blame --reverse --first-parent

     

如果初始提交,则允许合并--reverse--first-parent   指定范围是从最终开始的第一个父链   提交。

长期解释是:

  

反向指责可用于定位删除不会改变相邻行的行。此类编辑不会出现在非反向错误中,因为在编辑之前,相邻行最后更改的提交是较旧的历史记录。

     

对于使用主题分支或类似功能的大型活动项目,例如拉取请求,历史记录可以包含许多并发分支,甚至在编辑合并到目标分支之后,仍有许多(有时几十甚至几百)主题分支不包含它:

 a0--a1-----*a2-*a3-a4...-*a100
 |\         /   /         /
 | b0-B1..bN   /         /
 |\           /         /
 | c0..   ..cN         /
 \                    /
  z0..            ..zN
  

此处,' *标记合并中的第一个父级,大写B1 -   承诺删除被指责的行。
  由于提交cN-zN不包含B1,因此它们仍会在B1中删除该行,反向责备可以报告该行的最后一次提交是zN(意味着它已在a100中删除。事实上它确实会回归   一些非常晚的提交,这使得它无法用于查找B1提交

     

可以通过blame --reverse --first-parent进行搜索   对于范围a0..a100,它将返回a1,然后a0..bN上只有一个额外的责任将返回所需的提交b0
  但是在95a4fb0 (Git 2.6.2)中禁止合并--reverse--first-parent,因为错误指定的范围可能会产生意外且毫无意义的结果。

测试目标是找到A1:

  

创建如下所示的历史记录   ' *标记合并中的第一个父级   file.t的唯一一行在提交B2

中更改
        +---C1
       /      \
 A0--A1--*A2--*A3
   \     /
    B1-B2