我知道how to delete all local branches that have been merged .但是,我相信这是由于 Github 的新 pull request squash and merge。功能,我发现自己留下了很多未 merge 的本地分支,但如果 merge 到 master 将不会导致任何更改。
我如何修剪这些本地分支,即那些不一定被 merge 但不会影响 master(或者更一般地,当前分支)的本地分支?
最佳答案
没有完美的解决方案,但您可以接近,也许足够接近。
一定要从干净的工作树和索引开始(参见 git-sh-setup
中的 require_clean_work_tree
)。
对于每个可能可删除的候选分支 $branch
:
- 找到它的 merge 目标(大概是
merge_target=$(git config --get branch.${branch}.merge)
)。检查 merge 目标。 - 使用
--no-commit
进行 merge ;或者在第 1 步中,使用--detach
检查,这样如果 merge 成功,您将获得可以放弃的提交。 - 测试 git 是否认为 merge 成功,如果是,则当前树是否与前一棵树匹配,即没有带来任何变化。如果你可以测试完全匹配,并且允许提交发生(通过
--detach
),你可以非常简单地完成最后的测试,没有任何差异:同时运行git rev-parse HEAD^{tree}
和git rev-parse HEAD^^{tree}
1 看看它们是否产生相同的散列。如果您不允许提交,您仍然可以git diff
当前 (HEAD
) 提交反对提议的 merge 。如果您需要从 diff 中移除一些噪音(例如,不应该但无论如何都在提交中的配置文件),这为您提供了执行此操作的地方。 - 重置(
git merge --abort;git reset --hard HEAD;git clean -f
或类似的,具体取决于您决定如何实现步骤 1-3)。这只是为了让您的工作树和索引再次干净,以备下一次通过。 - 如果第 3 步中的 merge 有效且未引入任何更改,您可以删除本地分支。否则,保留它。
本质上,这是“实际进行 merge ,看看会发生什么”,只是完全自动化。
1这个符号看起来有点奇怪,但它只是 HEAD^
——HEAD
的第一个父级——紧随其后的是 ^ {树}
。替代拼写可能更易于阅读:HEAD~1^{tree}
或 ${merge_target}^tree
,其中 ${merge_target}
是您在步骤 1 中 checkout 的分支。请注意,这假定 merge 成功。 merge 结果在git merge
的退出状态:0表示成功,非0表示失败,需要人工协助,估计是 merge 冲突。
关于git - 如果 merge 到 master,如何删除所有不会导致更改的本地分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36428948/