获取分支中的提交的提交哈希

时间:2019-05-30 20:45:52

标签: bash git

在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)

谢谢!

3 个答案:

答案 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之后,但是IK都是彼此的祖先,它们仅彼此相关是H的后代和合并提交M的祖先(在本例中为祖父母)。使用git rev-list --ancestry-path ^<anything-identifying-H> <anything-identifying-branchX>将列出提交IJKLMN。列表将从N开始,然后移回到M作为第二个条目,但是此时,Git现在可以选择列出J还是L。这是您选择的排序选项生效的地方。默认排序是按提交者日期和时间的时间顺序排列。

列出了JL之后,Git现在可以列出列出的任何提交的父项,或者列出其他历史分支中的其余提交。 Git将列出其中之一。如果选择先列出J,然后列出I,则现在必须依次列出LK;如果它选择先列出L,然后列出K,则现在必须依次显示IJ。但是,例如,它们也可能按照JLKI的顺序列出;或JLIK。添加--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}'