我有一个包含多个分支的git存储库.
我怎么知道哪些分支已经合并到主分支中?
git branch --merged master
列表分支合并为主
git branch --merged
列表分支合并到HEAD(即当前分支的尖端)
git branch --no-merged
列出尚未合并的分支
默认情况下,这仅适用于本地分支.该-a
标志将显示本地和远程分支,并且该-r
标志仅显示远程分支.
您可以使用该git merge-base
命令查找两个分支之间的最新常见提交.如果该提交与您的分支头相同,则分支已完全合并.
需要注意的是git branch -d
做这样的事情已经因为它会拒绝删除该分支还没有已经完全合并.
还有一个图形界面解决方案.只需输入
gitk --all
一个新的应用程序窗口将提示您整个仓库的图形表示,如果分支已经合并,很容易实现
我正在使用以下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 merge-base
.
此命令查找两次提交之间的最佳共同祖先.如果共同的祖先与"分支"的最后一次提交相同,那么我们可以安全地假设"分支"已经合并到主分支中.
这是步骤
在master分支上查找最后一次提交哈希
在"分支"上查找上次提交哈希
运行命令git merge-base
.
如果步骤3的输出与步骤2的输出相同,则"分支"已经合并到主设备中.
有关git merge-base https://git-scm.com/docs/git-merge-base的更多信息.
关于清理远程分支的主题
git branch -r | xargs -t -n 1 git branch -r --contains
这将列出每个远程分支,然后是最新的SHA所在的远程分支.
这有助于辨别哪些远程分支已合并但未删除,哪些远程分支尚未合并且因此正在衰减.
如果你正在使用'tig'(它像gitk但是基于终端)那么你可以
tig origin/feature/someones-decaying-feature
查看分支的提交历史,而无需git checkout
为了验证哪些分支合并到master,您应该使用以下命令:
git branch
合并到master的所有分支的列表。
git branch
合并到master的所有分支的数量。
标志是:
-a
标志- (全部)显示远程和本地分支
-r
标志- (远程)仅显示远程分支
- 仅显示本地分支机构
例如: git branch -r --merged master
将向您显示所有合并到主数据库的远程存储库。
当我需要弄清楚一个分支是否已经合并时,这是我的技术,即使它已经被重新定义为与我们的主分支最新,这是特征分支的常见场景.
这些方法都不是万无一失的,但我发现它们很有用.
使用像gitk或TortoiseGit这样的可视化工具,或者简单地使用--all进行git log,浏览历史记录以查看与主分支的所有合并.您应该能够发现此特定功能分支是否已合并.
如果您习惯在合并功能分支时始终同时删除本地和远程分支,则只需更新并修剪其他计算机上的远程分支,功能分支就会消失.
为了帮助记住这样做,我已经在使用git flow扩展(AVH版本)在本地创建和合并我的功能分支,所以我添加了以下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的/钩/流后的功能完成
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
如果您不总是删除远程分支,您仍然可以搜索类似的提交以确定分支是否已合并.这里的缺陷是,如果远程分支已经变为无法识别,例如压缩提交或更改提交消息.
获取并修剪所有遥控器
在功能分支上查找上次提交的消息
查看是否可以在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" }