自特定日期以来,获取分支中更改列表

3
我们有一个脚本,发送包含所有已部署提交的电子邮件。它是通过保留上次部署日期并针对给定时间范围 (现在-上次部署时间) 进行 git log 实现的。问题在于由于分支,它无法生成所有已部署更改的列表。我创建了一个简单的示例来展示这个问题。我很确定这个问题以前被问过,但显然我没有正确表达。
*   24d9c49 - (HEAD, master) l-m (Wed Mar 19 15:54:48 2014 +0100) <Andrey>
|\  
* \   0f29219 - r-m (Wed Mar 19 15:54:48 2014 +0100) <Andrey>
|\ \  
* | | 73a1f4b - m3 (Wed Mar 19 15:54:48 2014 +0100) <Andrey>
| * | 349c1eb - (right) r1 (Wed Mar 19 15:54:47 2014 +0100) <Andrey>
|/ /  
| * 15c190f - (left) l2 (Wed Mar 19 15:54:46 2014 +0100) <Andrey>
| * 50b8c59 - l1 (Wed Mar 19 15:54:45 2014 +0100) <Andrey>
* | da47211 - m2 (Wed Mar 19 15:54:44 2014 +0100) <Andrey>
|/  
* 581e3a9 - m1 (Wed Mar 19 15:54:43 2014 +0100) <Andrey>

这里是生成给定仓库的代码。

假设我之前在 15:54:48 部署了,现在我想获取将与当前部署一起部署的提交列表。 我执行以下操作:

git log --pretty=format:"%h %s %ad" --since='Wed Mar 19 15:54:48 2014 +0100'

返回:

24d9c49 l-m Wed Mar 19 15:54:48 2014 +0100
0f29219 r-m Wed Mar 19 15:54:48 2014 +0100
73a1f4b m3 Wed Mar 19 15:54:48 2014 +0100

显然这不是真的,因为它错过了提交l1、l2和r1,因为它们在其他分支上的最后一次部署之前就已经提交了,但现在刚刚合并。所以这不仅仅是时间的问题。我想出了一个算法来处理这种情况,但它相当复杂,所以我希望也许有更简单的命令可以生成考虑到分支的日志。

更新,解决方案:根据@user3426575的建议,我发现我需要这样做:

git log --pretty=format:"%h %s %ad" HEAD ^da47211

在部署之前,da47211 是最新提交。因此,在上一次部署之前需要存储最后一次提交的编号,而不是部署的日期。

1个回答

2
您可以指定一个开放的提交范围:
git log --pretty=format:"%h %s %ad" da47211..

这在man gitrevisions中有解释:
历史遍历命令(例如git log)操作的是一组提交,而不仅仅是单个提交。对于这些命令,使用前面一节中描述的符号指定单个修订版意味着从该提交可到达的提交集,按照提交祖先链进行跟踪。
要排除从提交可达的提交,使用前缀^符号。例如,^r1 r2表示从r2可达但从r1可达的提交被排除。
这种集合操作非常常见,因此有一个简写形式。当您有两个提交r1和r2(根据上述“指定修订版”语法命名),您可以通过^r1 r2请求从r2可达但从r1可达的提交,并将其写为r1..r2。
类似的符号r1...r2称为r1和r2的对称差异,定义为r1 r2 --not $(git merge-base --all r1 r2)。它是可从r1或r2中任意一个到达但不能从两者都到达的提交集。
在这两个简写符号中,您可以省略一个端点并将其默认为HEAD。例如,origin..是origin..HEAD的简写,询问“自我从原始分支分叉以来做了什么?”同样,..origin是HEAD..origin的简写,询问“自我从他们分叉以来,原始分支做了什么?”请注意,..表示HEAD..HEAD,这是一个既可达又不可达于HEAD的空范围。

哇,太完美了,这正是我所需要的。Git 的手册对我来说有些晦涩难懂,我并没有完全理解其中的大部分内容,但通过尝试不同的提交编号,我找到了实现我需求的方法。请查看我的更新答案。 - Andrey

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