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

4
团队成员间存在一些争议:
1. 有些人喜欢在合并之前压缩拉取请求。 2. 有些人喜欢能够查看特性开发的提交历史记录。
作为一个倾向于第二种观点的人,我认为第一种观点的主要反对意见集中在 `git blame` / `git annotate` 显示更改发生的提交与引入当前分支的提交不同。
我无法找到任何 `git blame` / `git annotate` 的命令行选项可以停留在合并到当前分支之处。
这个问题可以通过回答以下问题来解决:我是否缺少某些次要命令,还是需要提出一个功能请求?
(更新:同事们还抱怨视觉化具有许多 PR 的历史记录很麻烦,但我相信有一些标志可以针对 gitk 等解决这个问题)
3个回答

1
尽管我自己倾向于第二个阵营,但我不知道有任何选项可以使用git annotate来实现这一点。因此,回答您的问题,您可能需要提交一个功能请求。但是,根据文档的说法,我怀疑它不会被接受,因为:

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


我在git blame中也没有看到这个功能。只要这个功能存在,无论是在annotate还是blame中,我都不介意...只是在git blame中没有看到这个选项。 - Stephen Connolly
@StephenConnolly 我并不是在暗示 git blame 有这个功能,但是我同意它没有这个功能。这只是一个想法,也不完全符合你的需求,但是 -L <start>,<end> 不是可以实现吗? - U r s u s
请参见 https://github.com/git/git/commit/7580f6b122e68c0ce4939c6a67e7f8f06e756fc6,此功能正在添加到 git blame - Stephen Connolly
@StephenConnolly 不错 :) - U r s u s

1
这里是一个命令链,可以产生所需的输出:
git rev-list --first-parent HEAD | awk '{print p " " $0}{p=$0}' > tmpfile && \
 git blame -b -S tmpfile HEAD -- path && rm tmpfile

我也向git项目提交了一个功能请求,我们会看看它的进展如何


git blame --first-parent 的修复正在前往主分支:https://github.com/git/git/commit/7580f6b122e68c0ce4939c6a67e7f8f06e756fc6 - Stephen Connolly
该修复现在似乎与“--reverse”合并了。请参见我的回答 - VonC

0

除了Stephen Connolly所请求的修复{{link1:}之外,将first-parent与reverse结合应该会在Git 2.7(2015年11月/12月)中发布。

查看 commit 700fd28, commit 1b0d400, commit ec35240 (2015年10月30日) 由 Max Kirillov (max630) 提交。
(由 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 再进行一次 blame 就能找到所需的提交 b0
但是在 95a4fb0 (Git 2.6.2) 中,将 --reverse--first-parent 结合使用是被禁止的,因为错误指定的范围可能会产生意外和无意义的结果。
测试目标是找到 A1:
创建如下所示的历史记录。
'*' 标记了合并中的第一个父级。
仅在提交 B2 中更改了 file.t 的唯一行。
        +---C1
       /      \
 A0--A1--*A2--*A3
   \     /
    B1-B2

"git blame --first-parent"(man)选项以前没有文档记录,但是现在在Git 2.29(2020年第四季度)中已经有了。

请查看提交 11bc12a(2020年8月6日)由Raymond E. Pasco (juped)提交。
(由Junio C Hamano -- gitster --合并于提交 5707ac4,2020年8月13日)

blame-options.txt:文档化--first-parent选项

签署者:Raymond E. Pasco

blame/annotate提交95a4fb0eac("blame: handle --first-parent")以来已支持--first-parent。这将在文档中添加有关该选项的说明。

blame-options现在包括在其手册页面中:

--first-parent

仅跟随合并提交时的第一个父提交。
此选项可用于确定特定集成分支引入某行的时间,而不是整个历史记录引入的时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接