一个解决方案
基于git show-branch的解决方案不太适合我(见下文),所以我把它与基于git log的解决方案结合起来,最终得到了这个:
git log --decorate --simplify-by-decoration --oneline \ # selects only commits with a branch or tag
| grep -v "(HEAD" \ # removes current head (and branch)
| head -n1 \ # selects only the closest decoration
| sed 's/.* (\(.*\)) .*/\1/' \ # filters out everything but decorations
| sed 's/\(.*\), .*/\1/' \ # picks only the first decoration
| sed 's/origin\///' # strips "origin/" from the decoration
限制和注意事项
可以分离HEAD(许多CI工具这样做是为了确保它们在给定的分支中构建正确的提交),但是起源分支和本地分支都必须与当前HEAD相同或“高于”当前HEAD。
不能有标签挡道(我想;我还没有测试在子分支和父分支之间使用标签提交的脚本)
脚本依赖于“HEAD”总是被log命令列为第一个装饰的事实
在master上运行脚本并开发结果(大部分)在<SHA>初始提交
结果
A---B---D---E---F <-origin/master, master
\ \
\ \
\ G---H---I <- origin/hotfix, hotfix
\
\
J---K---L <-origin/develop, develop
\
\
M---N---O <-origin/feature/a, feature/a
\ \
\ \
\ P---Q---R <-origin/feature/b, feature/b
\
\
S---T---U <-origin/feature/c, feature/c
尽管存在本地分支(例如,只有origin/topic存在,因为提交O是由它的SHA直接签出的),脚本应该打印如下:
对于提交G, H, I(分支热修复)→master
对于提交M, N, O(分支特征/a)→开发
对于提交S, T, U(分支功能/c)→开发
对于提交P, Q, R(分支特征/b)→特征/a
对于提交J, K, L(分支开发)→<sha>初次提交*
对于提交B, D, E, F (master分支)→<sha>初次提交
* -或者master,如果develop的提交在master的HEAD的顶部(~ master将是快速前进的开发)
为什么show-branch对我没用
基于git show-branch的解决方案在以下情况下被证明是不可靠的:
分离头-包括分离头情况意味着替换grep '\*' \为' grep '!——而这只是所有麻烦的开始
在master和develop上运行脚本的结果分别为develop和' '
主分支(hotfix/ Branches)上的分支最终以develop作为父分支,因为它们最近的主分支父分支被标记为!而不是*是有原因的。