在git分支中,我使用
存储最新的提交哈希SHA workflows:
version: 2
build_nodejs:
parallelism: 5
jobs:
- build-node8
- build-node9
- build-node10
- build-node11
- build-node12
在该分支中进行了一堆提交之后,如何获取latest_sha之后的下一个提交SHA。
说在$ latest_sha之后是否有5次对该分支的提交。
我想始终获取last_sha之后第一次提交的SHA。
latest_sha=$(git log --pretty=oneline | head -1 | cut -d ' ' -f 1)
谢谢!
答案 0 :(得分:3)
从某种意义上说, 是最新的哈希ID。也就是说,如果git log branchX
显示您首先提交b8eead8ba4ff375911af6
,则branchX
是代表b8eead8ba4ff375911af6
的名称,并且:
git show branchX
将显示与以下内容相同的提交:
git show b8eead8ba4ff375911af6
如果出于某种原因(例如,由于要更改分支名称所指向的哈希ID)而需要添加哈希ID,则可以通过添加新的提交(最简单的命令来获取它)是git rev-parse
:
hash=$(git rev-parse refs/heads/$branch)
有关其他信息,请参见alfunx's answer。请注意,如果提交形成菱形图,例如:
I--J
/ \
...--G--H M--N <-- branchX
\ /
K--L
然后有{em>两个提交紧随H
之后,但是I
和K
都是彼此的祖先,它们仅彼此相关是H
的后代和合并提交M
的祖先(在本例中为祖父母)。使用git rev-list --ancestry-path ^<anything-identifying-H> <anything-identifying-branchX>
将列出提交I
,J
,K
,L
,M
和N
。列表将从N
开始,然后移回到M
作为第二个条目,但是此时,Git现在可以选择列出J
还是L
。这是您选择的排序选项生效的地方。默认排序是按提交者日期和时间的时间顺序排列。
列出了J
或L
之后,Git现在可以列出列出的任何提交的父项,或者列出其他历史分支中的其余提交。 Git将列出其中之一。如果选择先列出J
,然后列出I
,则现在必须依次列出L
和K
;如果它选择先列出L
,然后列出K
,则现在必须依次显示I
和J
。但是,例如,它们也可能按照J
,L
,K
,I
的顺序列出;或J
,L
,I
,K
。添加--topo-order
会约束git rev-list
,以避免交叉两条腿的提交。
复杂图中的线性化顺序通常是有问题的:没有一种解决方案可以处理所有情况。这就是git rev-list
提供多种排序选项的原因。
答案 1 :(得分:2)
您可以使用rev-list
来做到这一点:
git rev-list --ancestry-path HEAD ^${latest_sha} | tail -n1
rev-list
列出给定分支/提交的所有可逆提交(按时间倒序排列)。插入符(^
)在这里的意思是“不是”,这使得Git排除了从给定提交开始的所有可到达的提交。
具体意味着:包括HEAD
可以到达的所有提交,排除${latest_sha}
可以到达的所有提交,然后使用tail
取最古老的提交。
编辑:添加--ancestry-path
以确保仅使用指定提交之间直接祖先路径中的提交(如@jthill所述)。
答案 2 :(得分:0)
git日志具有一个父提交字段,因此您可以执行类似的操作
git log --pretty=format:"%P %H" | awk '$1 == "<YOUR_HASH>" {print $2}'