为了进一步解决这个问题- 有没有办法删除所有在基于 master 时没有差异的分支。
虽然该问题的答案适用于标准合并工作流程,但它不会选取上游已“压缩和合并”的分支。因为这些分支在合并之前已被压缩,所以它们没有相同的提交哈希值,因此 git 没有意识到它们已“有效”合并:
$ git branch feature -d
error: The branch 'feature' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature.
Run Code Online (Sandbox Code Playgroud)
但如果我们首先对分支进行变基,它会毫无怨言地删除它们:
$ git checkout feature
Switched to branch 'feature'
Your branch is based on 'origin/feature', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
$ git rebase develop
First, rewinding head to replay your work on top of it...
$ git checkout develop
Switched to branch 'develop'
Your branch is up-to-date with 'origin/develop'.
$ git branch -d feature
Deleted branch feature (was 72214c7).
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法 a) 扫描分支并检查哪些分支可以安全删除,b) 删除这些分支
该库提供了一种执行此操作的方法:https ://github.com/not-an-aardvark/git-delete-squashed
...使用这个 bash 脚本:
git checkout -q master && git for-each-ref refs/heads/ "--format=%(refname:short)" | while read branch; do mergeBase=$(git merge-base master $branch) && [[ $(git cherry master $(git commit-tree $(git rev-parse $branch^{tree}) -p $mergeBase -m _)) == "-"* ]] && git branch -D $branch; done
Run Code Online (Sandbox Code Playgroud)