如何知道分支是否已合并到master?

我有一个带有多个分支的git存储库。

我如何知道哪些分支已经合并到主分支?

407381 次浏览

您可以使用#0命令查找两个分支之间最新的共同提交。如果该提交与您的分支头相同,则该分支已完全合并。

请注意,git branch -d已经做了这种事情,因为它将拒绝删除没有已经完全合并的分支。

git branch --merged master列出合并到大师的分支

git branch --merged列出合并到HEAD的分支(即当前分支的尖端)

git branch --no-merged列出尚未合并的分支

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

关于清理偏远分支机构的话题

git branch -r | xargs -t -n 1 git branch -r --contains

这将列出每个远程分支,然后列出其最新SHA所在的远程分支。

这有助于识别哪些远程分支已合并但未删除,哪些尚未合并并因此正在衰减。

如果您使用的是'tig'(它类似于gitk,但基于终端),那么您可以

tig origin/feature/someones-decaying-feature

查看分支的提交历史,而无需git签出

还有一个图形界面解决方案。只需键入

gitk --all

一个新的应用程序窗口将提示您的整个存储库的图形表示,如果一个分支已经合并或不合并,则很容易实现

当我需要弄清楚一个分支是否已经合并时,以下是我的技术,即使它可能已经重新基于我们的主分支,这是功能分支的常见场景。

这两种方法都不是万无一失的,但我发现它们很有用。

1显示所有分支的日志

使用gitk或TortoiseGit等可视化工具,或者简单地使用--all进行git log,查看历史以查看主分支的所有合并。你应该能够发现这个特定功能分支是否已合并。

2在功能分支中合并时始终删除远程分支

如果您有一个好习惯,在合并功能分支时总是删除本地和远程分支,那么您只需更新和修剪其他计算机上的远程分支,功能分支就会消失。

为了帮助记住这一点,我已经使用git flow扩展(AVH版)在本地创建和合并我的功能分支,所以我添加了以下git flow挂钩来询问我是否还想自动删除远程分支。

示例创建/完成功能分支

554 Andreas:MyRepo(develop)$ git flow start tmpSwitched to a new branch 'feature/tmp'
Summary of actions:- A new branch 'feature/tmp' was created, based on 'develop'- You are now on branch 'feature/tmp'
Now, start committing on your feature. When done, use:
git flow feature finish tmp
555 Andreas:MyRepo(feature/tmp)$ git flow finishSwitched to branch 'develop'Your branch is up-to-date with 'if/develop'.Already up-to-date.
[post-flow-feature-finish] Delete remote branch? (Y/n)Deleting remote branch: origin/feature/tmp.
Deleted branch feature/tmp (was 02a3356).
Summary of actions:- The feature branch 'feature/tmp' was merged into 'develop'- Feature branch 'feature/tmp' has been locally deleted- You are now on branch 'develop'
556 Andreas:ScDesktop (develop)$

. g it/hoks/post-flow-功能-完成

NAME=$1ORIGIN=$2BRANCH=$3
# Delete remote branch# Allows us to read user input below, assigns stdin to keyboardexec < /dev/tty
while true; doread -p "[post-flow-feature-finish] Delete remote branch? (Y/n) " ynif [ "$yn" = "" ]; thenyn='Y'ficase $yn in[Yy] )echo -e "\e[31mDeleting remote branch: $2/$3.\e[0m" || exit "$?"git push $2 :$3;break;;[Nn] )echo -e "\e[32mKeeping remote branch.\e[0m" || exit "$?"break;;* ) echo "Please answer y or n for yes or no.";;esacdone
# Stop reading user input (close STDIN)exec <&-exit 0

3按提交消息搜索

如果您不总是删除远程分支,您仍然可以搜索类似的提交以确定分支是否已合并。这里的陷阱是远程分支是否已重新定位为无法识别的,例如压缩提交或更改提交消息。

  • 获取并修剪所有遥控器
  • 在需求分支找到上一次提交信息
  • 查看是否可以在master分支上找到具有相同消息的提交

master分支上的示例命令:

grugls origin/feature/fooglf "my message"

在我的bash配置文件中

alias gru='git remote update -p'alias glf=findCommitByMessage
findCommitByMessage() {git log -i --grep="$1"}

使用git merge-base <commit> <commit>

此命令在两次提交之间找到最佳共同祖先。如果共同祖先与“分支”的最后一次提交相同,那么我们可以安全地假设“分支”已经合并到master中。

这是步骤

  1. 查找master分支上的最后一次提交哈希
  2. 查找“分支”上的最后一次提交哈希
  3. 运行命令git merge-base <commit-hash-step1> <commit-hash-step2>
  4. 如果第3步的输出与第2步的输出相同,则“分支”已合并到master中。

有关git merge-basehttps://git-scm.com/docs/git-merge-base的更多信息。

我正在使用以下bash函数:git-is-merged develop feature/new-feature

git-is-merged () {merge_destination_branch=$1merge_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 ]]thenecho $merge_source_branch is merged into $merge_destination_branchreturn 0elseecho $merge_source_branch is not merged into $merge_destination_branchreturn 1fi}

这是一个小单行代码,它将让您知道您当前的分支是否包含或没有来自远程源/主分支的数据:

$ git fetch && git branch -r --merged | grep -q origin/master && echo Incorporates origin/master || echo Out of date from origin/master

我在处理功能分支时遇到了这个问题,并且经常希望确保我将最新的工作合并到我自己的独立工作分支中。

为了推广这个测试,我在我的~/. gitconfig中添加了以下别名:

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

然后我可以打电话:

$ git current origin/master

检查我是否是当前的。

为了验证哪些分支合并到master,您应该使用以下命令:

  • git branch <flag[-r/-a/none]> --merged master合并到master的所有分支的列表。
  • git branch <flag[-r/-a/none]> --merged master | wc -l计数合并到master的所有分支的数量。

旗帜是:

  • -a标志-(全部)显示远程和本地分支
  • -r标志-(远程)仅显示远程分支
  • <emptyFlag>-仅显示当地个分支

例如:git branch -r --merged master将显示合并到master中的所有远程存储库。

我使用每个引用的操作git获取合并或未合并到给定远程分支的分支列表(例如origin/integration

遍历所有匹配的引用,并根据给定的格式显示它们,然后根据给定的集对它们进行排序。

注意:如果您倾向于使用git pull而不是git fetch,请将origin/integration替换为integration

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

git for-each-ref --merged=origin/integration --format="%(refname:short)" refs/heads/#                ^                           ^                           ^#                A                           B                           Cbranch1branch2branch3branch4

A:只取合并到远程origin/integration分支的分支
B:打印分支名称
C:只看heads引用(即分支)

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

git for-each-ref --no-merged=origin/integration --format="%(committerdate:short) %(refname:short)" --sort=committerdate refs/heads#                ^                              ^                                                  ^                    ^#                A                              B                                                  C                    D2020-01-14 branch102020-01-16 branch112020-01-17 branch122020-01-30 branch13

A:只取未合并到远程origin/integration分支的分支
B:打印分支名称和上次提交日期
C:按提交日期对输出进行排序
D:只看heads引用(即分支)

要检查源分支是否已合并到master分支,可以使用以下bash命令:

git merge-base --is-ancestor <source branch name> master && echo "merged" || echo "not merged"

我将git branchgit branch --merged main进行比较如下:

diff <(git branch) <(git branch --merged main)

然后,您将看到尚未合并到main中的任何本地分支。