我有一个具有多个分支的git存储库。
我如何知道哪些分支已经合并到主分支中?
我有一个具有多个分支的git存储库。
我如何知道哪些分支已经合并到主分支中?
您可以使用git merge-base命令来查找两个分支之间的最新公共提交。如果该提交与分支头相同,则该分支已经完全合并。
注意,git branch -d已经做了这类事情,因为它将拒绝删除尚未完全合并的分支。
Git branch -merged master列出并入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签出
以下是我需要确定一个分支是否已经合并时的技巧,即使它可能已经与我们的主分支重新基础,这是功能分支的常见场景。
这两种方法都不是万无一失的,但我多次发现它们很有用。
1显示所有分支的日志
使用可视化工具,如gitk或TortoiseGit,或简单地使用git log with——all,查看历史记录,查看所有合并到主分支的操作。您应该能够发现这个特定的特性分支是否已经合并。
当合并一个特性分支时,总是移除远端分支
如果你有一个好习惯,当你合并到一个功能分支时,总是同时删除本地和远程分支,那么你可以简单地更新和修剪另一台计算机上的远程,功能分支就会消失。
为了帮助记住这一点,我已经使用git流扩展(AVH版)来创建和合并本地的特性分支,所以我添加了以下git流钩子来询问我是否也想自动删除远程分支。
创建/完成特性分支
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)$
. / / post-flow-feature-finish hook
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按提交消息搜索
如果您不总是删除远程分支,您仍然可以搜索类似的提交,以确定分支是否已合并。这里的陷阱是,如果远程分支被重基于到无法识别的状态,比如压缩提交或更改提交消息。
取并修剪所有遥控器 在特性分支上找到最后一次提交的消息 看看是否可以在主分支上找到具有相同消息的提交
主分支的命令示例:
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 merge-base <commit> <commit>。
该命令在两个提交之间查找最佳共同祖先。如果公共祖先与“分支”的最后一次提交完全相同,那么我们可以安全地假设“分支”已经合并到主分支中。
以下是步骤
在主分支上查找最后一次提交哈希 查找“分支”上的最后一次提交哈希 执行命令git merge-base <commit-hash-step1> <commit-hash-step2>。 如果步骤3的输出与步骤2的输出相同,则“分支”已经合并到master中。
更多关于git merge-base https://git-scm.com/docs/git-merge-base的信息。
我使用以下bash函数:git-is-merged development 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 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 count并入master的所有分支的数量。
标志是:
-a flag - (all)显示远程分支和本地分支 -r flag - (remote)仅显示远程分支 <emptyFlag> -只显示本地分支
例如:git branch -r——merged master将显示所有合并到master的远程存储库。
我使用git for-each-ref来获得一个分支列表,这些分支要么被合并,要么没有合并到给定的远程分支中(例如origin/integration)。
遍历所有匹配<pattern>的引用,并根据给定的<format>对它们进行排序,然后根据给定的<key>集对它们进行排序。
注意:如果你倾向于使用git pull而不是git fetch,请将origin/integration替换为integration。
合并到远程起源/集成分支的本地分支列表
git for-each-ref --merged=origin/integration --format="%(refname:short)" refs/heads/
# ^ ^ ^
# A B C
branch1
branch2
branch3
branch4
答:只取合并到远程原点/集成分支中的分支 B:打印分支机构名称 C:只看头部(即树枝)
未合并到远程起源/集成分支的本地分支列表
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
答:只取未合并到远程原点/集成分支的分支 B:打印分支名称和最后提交日期 C:按提交日期排序输出 D:只看头部(即树枝)
要检查源分支是否已经合并到主分支,可以使用以下bash命令:
git merge-base --is-ancestor <source branch name> master && echo "merged" || echo "not merged"
我区分git分支对git分支-合并的主要如下:
diff <(git branch) <(git branch --merged main)
然后,您将看到尚未合并到main中的任何本地分支。