Git多分支关联同一提交时如何获取最新分支名及相关问题
Git提交关联多分支时的分支名获取问题
为什么git name-rev始终返回develop?
git name-rev的分支匹配逻辑是按Git引用的字典序优先返回,而非分支创建或更新时间。develop的字典序比stage靠前,所以即便当前提交关联多个分支,它也会优先返回字典序更靠前的分支名。另外,当本地分支与远程分支指向同一提交时,该命令也可能优先选择字典序靠前的引用。
如何获取所有关联分支并按时间排序?
要列出当前HEAD提交关联的所有本地/远程分支,并按分支最后更新时间倒序排列,可执行以下命令:
git for-each-ref --format='%(committerdate:iso8601) %(refname:short)' refs/heads/ refs/remotes/ | grep $(git rev-parse HEAD) | sort -r
各部分作用:
git for-each-ref遍历所有本地分支(refs/heads/)和远程分支(refs/remotes/)%(committerdate:iso8601)输出分支最后提交的时间,%(refname:short)输出简化后的分支名grep $(git rev-parse HEAD)过滤出指向当前HEAD提交的分支sort -r按提交时间倒序排列,最新更新的分支排在最前
如果只需要分支名列表,可简化为:
git for-each-ref --format='%(refname:short)' refs/heads/ refs/remotes/ | grep $(git rev-parse HEAD)
检出stage分支未提交时git name-rev仍返回develop的解决办法
当从develop检出stage分支但未做任何提交时,两个分支指向同一提交,git name-rev仍会按字典序返回develop。但你需要的是当前实际检出的分支名,此时应该用git rev-parse --abbrev-ref HEAD——它会直接返回当前所在分支名(比如stage),不受提交是否与其他分支重合的影响。
如果需要构建包含当前分支+关联分支信息的版本字符串,可组合命令实现:
# 获取当前所在分支名 current_branch=$(git rev-parse --abbrev-ref HEAD) # 获取其他关联分支(可选) related_branches=$(git for-each-ref --format='%(refname:short)' refs/heads/ refs/remotes/ | grep $(git rev-parse HEAD) | grep -v "$current_branch" | tr '\n' ',' | sed 's/,$//') # 生成版本字符串 version_str="v1.0.0-$current_branch${related_branches:+ ($related_branches)}" echo $version_str
这样的版本字符串会优先显示当前构建所在的分支,同时附带其他关联分支信息,更清晰反映代码来源。
内容的提问来源于stack exchange,提问作者sagi
相关产品推荐
相关产品推荐

