我知道how to delete all local branches that have been merged。但是,我相信这是由于Github的新pull request squash and merge功能,我发现自己留下了许多未合并的本地分支,但如果合并到master中将导致没有变化。
如何修剪这些本地分支,即那些未必合并但不会影响主分支(或更一般地说,当前分支)的本地分支?
答案 0 :(得分:3)
没有完美的解决方案,但你可以接近,也许足够接近。
请务必从干净的工作树和索引开始(请参阅git-sh-setup
中的require_clean_work_tree
)。
对于可能可删除的每个候选分支$branch
:
merge_target=$(git config --get branch.${branch}.merge)
)。查看合并目标。--no-commit
合并;或者在步骤1中,使用--detach
签出,以便在合并成功的情况下获得可以放弃的提交。--detach
),你可以非常简单地完成最后一次测试,没有任何差异:同时运行git rev-parse HEAD^{tree}
和{{1 }} 1 并查看它们是否产生相同的哈希值。如果您不允许提交,您仍然可以git rev-parse HEAD^^{tree}
针对建议的合并进行当前(git diff
)提交。如果您需要从差异中删除一些噪音(例如,配置文件不应该,但无论如何,在提交中),这为您提供了一个位置。HEAD
或类似,具体取决于您决定如何执行步骤1-3)。这只是为了让你的工作树和索引再次清理,以便下一次传递。从本质上讲,这是“实际上是合并,看看会发生什么”,只是完全自动化。
1 这种符号看起来有点奇怪,但它只是git merge --abort; git reset --hard HEAD; git clean -f
- HEAD^
的第一个父 - 后跟HEAD
。替代拼写可能更容易阅读:^{tree}
或HEAD~1^{tree}
,其中${merge_target}^tree
是您在步骤1中检出的分支。请注意,这假定合并成功。合并结果处于${merge_target}
的退出状态:零意味着成功,非零意味着失败并需要手动帮助,可能是由于合并冲突。
答案 1 :(得分:0)
如果你运行git" branch -v"具有变化的跟踪分支将具有"提前"写在他们旁边。
另外两个选项:"背后"如果没有写任何内容,则意味着分支机构没有任何会影响其跟踪分支的更改。
因此你可以运行" git fetch"更新远程跟踪分支然后解析" git branch -v"结果找出哪些分支没有变化,哪些分支有。