我有一个包含多个分支的git代码库。
如何知道哪些分支已经合并到主分支(master branch)中?
git branch --merged master
会列出已经合并到 master 分支的分支列表。
git branch --merged
会列出已经合并到当前分支末端(也就是HEAD)的分支列表。
git branch --no-merged
会列出还未被合并的分支列表。
默认情况下,这只适用于本地分支。-a
标志会显示本地和远程分支,而 -r
标志则仅显示远程分支。
您可以使用git merge-base
命令找到两个分支之间最新的公共提交。如果该提交与您的分支头相同,则分支已完全合并。
请注意,git branch -d
已经实现了这种功能,因为它会拒绝删除尚未完全合并的分支。
git branch -d
命令拒绝删除尚未合并到当前分支的分支,不会删除当前分支。 - Greg Hewgillgit branch <flag[-r/-a/none]> --merged master
列出所有合并到主分支的分支。git branch <flag[-r/-a/none]> --merged master | wc -l
统计合并到主分支的所有分支数量。标志位包括:
-a
标志 - 显示本地和远程分支 (all)-r
标志 - 显示远程分支 (remote)<emptyFlag>
- 只显示本地分支 local例如: git branch -r --merged master
将会展示所有合并到主分支的远程仓库。
git branch --merged master
命令时,它会输出 "master"。但如果我对我的 develop 分支执行相同的命令,它会列出一些功能分支以及 develop 和 master 分支。 - Ken Hadden还有一个图形界面的解决方案。只需要输入
gitk --all
一个新的应用程序窗口将出现,其中显示了你的整个存储库的图形表示,非常容易判断分支是否已经合并。
git
客户端的应用程序。在 Ubuntu 上,可以使用命令 apt-get install gitk
进行安装。 - metame使用 git merge-base <commit> <commit>
命令,查找两个提交之间的最佳共同祖先。如果共同祖先与 "分支" 的最后一个提交相同,则可以安全地假定该 "分支" 已经合并到主分支中。
以下是步骤:
git merge-base <commit-hash-step1> <commit-hash-step2>
有关 git merge-base 的更多信息,请参见https://git-scm.com/docs/git-merge-base。
master
已经合并到branch
,然后又添加了4次提交到branch
。 - mkobitgit log -1 $(git merge-base base-branch feature-branch)
,如果在输出中看到feature-branch
,那么你就知道它们已经合并了。 - Carl G我正在使用下面的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
}
git branch -r | xargs -t -n 1 git branch -r --contains
tig origin/feature/someones-decaying-feature
无需 git checkout 即可查看分支的提交历史记录
origin/master
但是没有在远程删除的分支? - Chris Fgit remote prune origin
命令来更新本地机器上已删除和未删除的内容。 - xxjjnn我使用git for-each-ref获取已合并或未合并到给定远程分支(例如origin/integration
)的分支列表。
遍历所有与<pattern>匹配的引用,按照给定的<key>集进行排序,并根据给定的<format>显示它们。
注意:如果你倾向于使用git pull
而不是git fetch
,请将origin/integration
替换为integration
。
origin/integration
分支的本地分支列表git for-each-ref --merged=origin/integration --format="%(refname:short)" refs/heads/
# ^ ^ ^
# A B C
branch1
branch2
branch3
branch4
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 D
2020-01-14 branch10
2020-01-16 branch11
2020-01-17 branch12
2020-01-30 branch13
A: 只获取未合并到远程 origin/integration
分支的分支
B: 输出分支名和最后一次提交日期
C: 按提交日期对输出进行排序
D: 仅查看 heads
引用(即分支)
git merge-base --is-ancestor <source branch name> master && echo "merged" || echo "not merged"
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
如果您不总是删除远程分支,则仍然可以搜索类似的提交以确定该分支是否已合并。这里的陷阱是,如果远程分支已被重新设置为不可识别的状态,例如压缩提交或更改提交消息。
主分支上的示例命令:
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"
}
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]"
- angularsengit log
中,您可以添加 --merges
以仅显示合并提交。https://dev59.com/618e5IYBdhLWcg3wNIFp#25986615 - angularsengit log -i --grep="<summary>"
方法,因为它似乎对于已经被 rebase 到主分支的分支也很有效(只要你要查找的提交没有被压缩在一起)。使用这种方法,我可以轻松地检查该查询在我的主分支上输出的提交作者和日期与我的次要分支日志相匹配。 - TafT
git branch --merged
确认状态,然后删除了本地和远程分支。 - Kenneth Kalmergit branch -a --merged/no-merged
也可以使用,而无需在此过程中创建本地跟踪分支。 - fresskomagit branch -r --merged/--no-merged
命令来查找远程分支。 - Asfand Qazi--merged/--no-merged
在其后可以接受一个可选的提交参数。至少在我的git版本(1.9.1)中,在其后添加-a
或-r
标志会导致致命错误。应该在--(no-)merged
之前添加-a
或-r
标志。 - jgawrych