我有一个包含多个分支的git存储库。
我如何知道哪些分支已合并到主分支?
答案 0 :(得分:1580)
git branch --merged master
列出合并到 master
git branch --merged
列出合并到 HEAD 的分支(即当前分支的提示)
git branch --no-merged
列出尚未合并的分支
默认情况下,这仅适用于本地分支。 -a
标志将显示本地和远程分支,-r
标志仅显示远程分支。
答案 1 :(得分:94)
您可以使用git merge-base
命令查找两个分支之间的最新常见提交。如果该提交与您的分支头相同,则分支已完全合并。
请注意git branch -d
已经做了这类事情,因为它会拒绝删除尚未已完全合并的分支。
答案 2 :(得分:25)
还有一个图形界面解决方案。只需输入
即可 gitk --all
新的应用程序窗口将提示您整个仓库的图形表示,如果分支已经合并,很容易实现
答案 3 :(得分:13)
使用git merge-base <commit> <commit>
。
此命令查找两次提交之间的最佳共同祖先。并且如果共同的祖先与&#34;分支的最后一次提交相同&#34; ,那么我们可以放心地假设一个&#34;分支&#34;已经合并到主人。
以下是步骤
git merge-base <commit-hash-step1> <commit-hash-step2>
。 有关git merge-base https://git-scm.com/docs/git-merge-base的更多信息。
答案 4 :(得分:13)
我正在使用以下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
}
答案 5 :(得分:12)
关于清理远程分支的主题
git branch -r | xargs -t -n 1 git branch -r --contains
这列出了每个远程分支,然后是最新的SHA所在的远程分支。
这有助于辨别哪些远程分支已合并但未删除,哪些远程分支尚未合并且因此已经衰减。
如果您正在使用'tig'(它类似于gitk但基于终端),那么您可以
tig origin/feature/someones-decaying-feature
查看分支的提交历史记录而无需git checkout
答案 6 :(得分:5)
当我需要弄清楚某个分支是否已合并时,以下是我的技术,即使它已被重新定位为与我们的主分支最新,这是功能分支的常见方案。
这些方法都不是万无一失的,但我发现它们很有用。
使用像gitk或TortoiseGit这样的可视化工具,或者简单地使用--all进行git log,浏览历史记录以查看到主分支的所有合并。您应该能够发现是否已合并此特定功能分支。
如果您习惯在合并功能分支时始终同时删除本地和远程分支,则只需更新并修剪其他计算机上的远程分支,功能分支就会消失。
为了帮助记住这样做,我已经在使用git flow extensions (AVH edition)在本地创建和合并我的功能分支,所以我添加了以下git flow hook来询问我是否还想自动删除远程分支
示例创建/完成功能分支
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"
}
答案 7 :(得分:2)
这里有一点点内容,可以让您知道当前分支是否合并或缺少远程Origin / master分支的数据:
$ 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
检查我是否最新。
答案 8 :(得分:0)
为了验证哪些分支合并到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中的远程存储库。
答案 9 :(得分:0)
我使用git for-each-ref来获取已合并或未合并到给定远程分支(例如origin/integration
)中的分支的列表
迭代所有与
匹配的引用,并根据给定的 集对它们进行排序,然后根据给定的 显示它们。
注意:如果您倾向于使用origin/integration
而不是integration
,请用git pull
替换git fetch
。
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
引用(即分支)