如何通过squash and merge后的提交SHA获取分支最后一次提交SHA?
我创建了分支A并发起Pull Request,执行Squash and merge操作后生成新的提交SHA(qe55a1a)并合并至master分支。现在需要通过master上的qe55a1a,以编程方式获取分支A在squash and merge前的最后一次提交SHA(ca10b2d)。已知普通合并提交可通过父节点获取对应提交,但不清楚squash and merge场景下适用的Git命令。
提交关系如下:
Branch A ca10b2d - last commit qe55a1a - squash and merge commit Master qe55a1a - squash and merge commit
Squash and merge的本质是将原分支的多个提交压缩成一个全新的提交并合并到目标分支,这个新提交没有直接的Git父节点关联原分支的提交,所以无法通过普通的父节点查询命令(比如git rev-parse qe55a1a^)获取原分支的最后提交。可以通过以下几种方式解决:
1. 从 squash merge 的提交信息中提取
大多数Git托管平台(如GitHub、GitLab)在执行Squash and merge时,会自动在新提交的信息中添加关联的Pull Request编号,或者保留原分支提交的相关痕迹。先查看该提交的完整信息:
git show qe55a1a --pretty=format:%B
如果提交信息中包含PR编号(比如#123),可以通过平台的API查询该PR的详情,从中获取原分支的最后提交SHA;如果提交信息里直接包含原分支的提交SHA,直接提取即可。
2. 直接查询原分支(若分支未被删除)
如果本地仓库或远程仓库中还保留着分支A,直接执行命令获取其最后一次提交:
# 本地分支 git rev-parse branchA@{0} # 远程分支 git rev-parse origin/branchA@{0}
3. 利用Git Reflog(本地仓库有效)
如果合并操作发生在本地且未过太久,Git的reflog会记录仓库的操作历史。查看master分支的reflog,找到qe55a1a对应的合并记录,从中追溯原分支提交:
git reflog show master
找到包含qe55a1a的记录,通常会标注合并来源(比如merge branch 'branchA' into master),再结合分支A的历史即可找到最后提交。注意:reflog有过期时间,默认90天会清理旧记录。
4. 通过托管平台API查询(编程场景推荐)
如果代码托管在GitHub/GitLab等平台,最可靠的编程方式是调用平台的API:
- GitHub:通过提交SHA查询对应的PR(
GET /search/commits?q=sha:qe55a1a),从PR数据中获取head.sha字段,即为原分支的最后提交。 - GitLab:通过提交SHA查询关联的合并请求(
GET /projects/:id/commits/qe55a1a/merge_requests),从返回结果中提取原分支的最后提交SHA。
内容的提问来源于stack exchange,提问作者PurpleChef2022

