我怎么知道分支是否已经合并到master中?


1139

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

我怎么知道哪些分支已经合并到master分支中?

Answers:


1792

git branch --merged master列出合并到母版中的分支

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

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

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


2
附带说明一下,当我尝试查看远程分支是否已合并时,我首先设置了一个本地跟踪分支,使用标识了状态,git branch --merged然后删除了本地和远程分支。
2011年

83
显然,git branch -a --merged/no-merged它也可以工作,而无需在该过程中创建本地跟踪分支。
fresskoma 2011年

70
或者只是git branch -r --merged/--no-merged为了找到远程分支。
阿斯潘德·卡齐

5
有什么方法可以删除重新合并后实际上合并的未合并分支?
Ashfame 2014年

9
注意,--merged/--no-merged它后面有一个可选的commit参数。至少在我的git(1.9.1)版本中,在它之后添加-aor -r标志会给我带来致命错误。添加-a-r 之前 --(no-)merged
Jonathan Gawrych'2

113

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

需要注意的是git branch -d做这样的事情已经因为它会拒绝删除该分支还没有已经完全合并。


3
@hari的答案更详细地介绍了如何使用它。
Muhd

我们如何自动/编程地做到这一点?
亚历山大·米尔斯

1
“尚未完全合并” ...完全合并到哪个分支中?
亚历山大·米尔斯

@AlexanderMills:进入您当前的分支。
格雷格·休吉尔

2
@AlexanderMills:git branch -d将拒绝删除尚未合并到当前分支中的分支。不删除当前分支。
Greg Hewgill '18

27

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

gitk --all

一个新的应用程序窗口将提示您整个仓库的图形表示,在这里很容易意识到分支是否已合并


17
需要明确的是,需要安装不属于git客户端的应用程序。在Ubuntu上,apt-get install gitk
metame '17

在macOS上,如果您安装了Homebrew,则将其设置为brew install git-gui,以进入gitk命令行。
program247365

24

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

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
}

3
这实际上是行不通的。如果源分支已经合并到目标分支中,然后目标分支又得到了几次提交,它将不再起作用,但我不知道为什么
Alexander Mills


18

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

该命令在两次提交之间找到最佳的共同祖先。并且如果公共祖先与“分支”的最后一次提交相同,那么我们可以放心地假定“分支”已经合并到母版中。

步骤如下

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

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


2
我认为这只会告诉您技巧是否已合并。例如,它不会告诉您是否master已合并到中branch,然后又向中添加了4个提交branch
mkobit

为什么不呢?git log -1 $(git merge-base base-branch feature-branch)如果feature-branch在输出中看到,那么您知道它们已合并?
卡尔·G

12

关于清理远程分支机构的主题

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

此列表列出了每个远程分支,然后列出了其最新SHA所在的远程分支。

这对于辨别哪些远程分支已被合并但未被删除,以及哪些远程分支尚未被合并从而正在衰减非常有用。

如果您使用的是“ tig”(类似于gitk,但基于终端),则可以

tig origin/feature/someones-decaying-feature

无需git checkout即可查看分支的提交历史记录


3
那个男人干得好!一旦掌握实际显示的内容,该功能就非常有用!GitHub应用程序需要将其合并到分支的可视化显示中,而不是没有层次结构的字母列表!
CMash 2015年

12

为了验证哪些分支合并到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将向您显示所有合并到主数据库的远程存储库。


5

这是我需要确定分支是否已合并的技术,即使该分支可能已被重新建立基础以与我们的主分支保持最新,这是功能分支的常见情况。

这两种方法都不是简单的证明,但是我发现它们非常有用。

1显示所有分支的日志

使用诸如gitk或TortoiseGit之类的可视工具,或者仅使用--all进行git log,浏览历史记录以查看到主分支的所有合并。您应该能够发现此特定功能分支是否已合并。

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

如果您习惯于在合并功能分支时始终删除本地分支和远程分支,那么您只需在另一台计算机上更新和修剪远程对象,功能分支就会消失。

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

示例创建/完成特征分支

554 Andreas:MyRepo(develop)$ git flow start tmp
Switched 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 finish
Switched 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)$

.git / hooks / post-flow-feature-finish

NAME=$1
ORIGIN=$2
BRANCH=$3

# Delete remote branch
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty

while true; do
  read -p "[post-flow-feature-finish] Delete remote branch? (Y/n) " yn
  if [ "$yn" = "" ]; then
    yn='Y'    
  fi
  case $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.";;
  esac
done

# Stop reading user input (close STDIN)
exec <&-
exit 0

3按提交消息搜索

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

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

master分支上的示例命令:

gru                   
gls origin/feature/foo
glf "my message"

在我的bash .profile配置中

alias gru='git remote update -p'
alias glf=findCommitByMessage

findCommitByMessage() {
    git log -i --grep="$1"
}

@anjdeas-步骤1-您如何知道哪些分支已合并到main中。我一直在查看日志和GUI工具-找不到任何明确显示此内容的地方???
赫夫

@TheHuff尝试以下方法:git log --all --color --graph --decorate --topo-order --date=relative --abbrev-commit --pretty=format:"%C(green)%h %C(red bold)[%<(14)%ad] %Creset%s%Cred%d%C(blue) [%an]"
angularsen

@TheHuff在TortoiseGit中,如果您位于主分支上,则应显示所有合并到main的分支。
angularsen

谢谢-但是我怎么知道什么是合并?我假设它们都是提交-是吗?
赫夫

@TheHuff:您应该直观地看到两个提交流/路径合并到一个提交“下游”(在日志视图中位于较高位置)。该提交是合并提交。此外,git log您还可以添加--merges以仅显示合并提交。stackoverflow.com/a/25986615/134761
angularsen

4

这是一个简单的方法,它可以让您知道当前分支是否合并了远程原始/主分支的数据或该数据不在其中:

$ 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

检查我是否最新。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.