Git merge场景下如何获取当前合并的源分支?(含Shell脚本开发)
嘿,这个问题问到点子上了!不管是手动排查还是写Git扩展脚本,搞清楚合并时的分支状态都很重要,我给你一步步拆解:
一、手动确认当前正在合并的分支
当你处于合并流程中(比如有冲突待解决),有几个快速的方式能查到当前的合并信息:
- 看Git状态提示:直接跑
git status,输出最顶部会明确显示类似Merge branch 'feature/login-fix' into main的内容,前面的就是要合并进来的「源分支」,后面是当前所在的目标分支。 - 查看Git内部文件:Git会在
.git目录下生成几个临时文件记录合并状态:.git/MERGE_HEAD:里面存的是源分支最新提交的哈希值,你可以用cat .git/MERGE_HEAD查看,再配合git name-rev --name-only $(cat .git/MERGE_HEAD)把哈希转成可读的分支名。.git/MERGE_MSG:里面是默认的合并提交消息,第一行就是Merge branch 'xxx' into yyy,直接看这个也能快速拿到分支名。
二、在Bash脚本中获取合并的「源分支」
作为Git扩展脚本,你需要可靠地提取这个信息,同时还要先判断当前是否处于合并状态,避免报错。这里给你两种靠谱的方案:
方案1:从MERGE_HEAD转换为分支名
这个方法最准确,因为MERGE_HEAD直接记录了被合并分支的顶端commit:
# 先检查是否处于合并状态 if [ -f .git/MERGE_HEAD ]; then # 获取源分支的commit哈希 merge_head_hash=$(cat .git/MERGE_HEAD) # 把哈希转换为分支名(如果是远程分支会显示origin/xxx,本地分支直接显示名字) source_branch=$(git name-rev --name-only "$merge_head_hash") # 如果你只想要本地分支名,可以过滤掉origin/前缀(可选) # source_branch=${source_branch#origin/} echo "当前合并的源分支是:$source_branch" else echo "当前没有正在进行的合并操作" exit 1 fi
方案2:从MERGE_MSG中提取分支名
如果MERGE_MSG的格式是默认的(大部分场景都是),可以用正则直接提取:
if [ -f .git/MERGE_MSG ]; then # 用正则匹配出单引号里的分支名 source_branch=$(grep -oP 'Merge branch '\''\K[^'\']+' .git/MERGE_MSG) echo "当前合并的源分支是:$source_branch" else echo "当前没有正在进行的合并操作" exit 1 fi
⚠️ 注意:如果是合并多个分支、合并单个commit或者自定义了合并消息,这个方法可能失效,所以优先用方案1。
中止合并后重新启动的流程
拿到源分支后,你可以这样实现你的需求:
# 先获取源分支(用上面的方案1) if [ -f .git/MERGE_HEAD ]; then merge_head_hash=$(cat .git/MERGE_HEAD) source_branch=$(git name-rev --name-only "$merge_head_hash") # 中止当前合并 git merge --abort # 重新启动合并 git merge "$source_branch" else echo "没有正在进行的合并,无需操作" fi
内容的提问来源于stack exchange,提问作者Robin Green
相关产品推荐
相关产品推荐

