如何判断一个分支是否已合并到master分支

如何判断一个分支是否已合并到master分支

技术背景

在使用Git进行版本控制时,经常会创建多个分支进行并行开发。开发完成后,需要将这些分支合并到主分支(通常是master)。但有时我们需要确认某个分支是否已经成功合并到master,这对于代码管理和清理未合并分支非常重要。

实现步骤

使用git branch --mergedgit branch --no-merged命令

  • git branch --merged master:列出已合并到master的分支。
  • git branch --merged:列出已合并到HEAD(当前分支的尖端)的分支。
  • git branch --no-merged:列出未合并的分支。

默认情况下,这些命令仅适用于本地分支。使用-a标志将显示本地和远程分支,-r标志仅显示远程分支。

示例:

1
2
3
4
5
6
7
8
# 列出所有已合并到master的本地分支
git branch --merged master

# 列出所有已合并到master的本地和远程分支
git branch -a --merged master

# 列出所有未合并的远程分支
git branch -r --no-merged

使用git merge-base命令

git merge-base命令可用于找到两个分支之间的最新公共提交。如果该提交与分支的头部相同,则表示该分支已完全合并。

示例:

1
2
3
4
5
6
7
8
9
# 找到分支feature和master的最新公共提交
common_commit=$(git merge-base feature master)
branch_head=$(git rev-parse feature)

if [ "$common_commit" = "$branch_head" ]; then
echo "分支feature已完全合并到master"
else
echo "分支feature未完全合并到master"
fi

使用图形界面工具

可以使用gitk --all命令打开一个图形界面,它会以图形方式展示整个仓库的提交历史,这样很容易判断一个分支是否已合并。

1
gitk --all

使用git for-each-ref命令

可以使用git for-each-ref命令列出已合并或未合并到指定远程分支的本地分支。

列出已合并到远程origin/integration分支的本地分支

1
git for-each-ref --merged=origin/integration --format="%(refname:short)" refs/heads/

列出未合并到远程origin/integration分支的本地分支

1
git for-each-ref --no-merged=origin/integration --format="%(committerdate:short) %(refname:short)" --sort=committerdate refs/heads

其他方法

  • 搜索提交消息
    • 拉取并清理所有远程分支:git remote update -p
    • 找到功能分支上最后一次提交的消息
    • 查看主分支上是否有相同消息的提交

示例:

1
2
3
4
5
6
7
8
# 拉取并清理所有远程分支
git remote update -p

# 查看功能分支上最后一次提交的消息
last_commit_msg=$(git log -1 --pretty=format:%s origin/feature/foo)

# 在主分支上搜索相同消息的提交
git log -i --grep="$last_commit_msg"
  • 检查当前分支是否包含远程分支的更新
1
git fetch && git branch -r --merged | grep -q origin/master && echo "Incorporates origin/master" || echo "Out of date from origin/master"

核心代码

自定义bash函数判断分支是否合并

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git-is-merged () {
merge_destination_branch=$1
merge_source_branch=$2

merge_base=$(git merge-base $merge_destination_branch $merge_source_branch)
merge_source_current_commit=$(git rev-parse $merge_source_branch)

if [[ $merge_base = $merge_source_current_commit ]]; then
echo "$merge_source_branch is merged into $merge_destination_branch"
return 0
else
echo "$merge_source_branch is not merged into $merge_destination_branch"
return 1
fi
}

.gitconfig中添加别名检查当前分支是否包含指定远程分支的更新

1
2
[alias]
current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :

最佳实践

  • 养成在合并功能分支时同时删除本地和远程分支的习惯,这样可以更方便地管理分支。
  • 使用自定义别名和函数来简化检查分支合并状态的操作。

常见问题

  • 无法使用git branch --merged检查使用压缩提交合并的分支git branch --merged命令无法正确判断使用压缩提交合并的分支。如果通过GitHub Pull Request合并分支,可以使用gh工具进行检查。
1
diff <(git branch -l | grep -Ev '(main|master)') <(gh pr list --state closed | awk -F '\t' '{print $3}') | grep -E '^>' | awk '{print $NF}'
  • 远程分支已变基导致提交消息不可识别:如果远程分支进行了变基操作,如压缩提交或更改提交消息,通过提交消息搜索来判断分支是否合并可能会不准确。

如何判断一个分支是否已合并到master分支
https://119291.xyz/posts/how-to-check-if-branch-is-merged-into-master/
作者
ww
发布于
2025年6月17日
许可协议