繁体   English   中英

如何删除所有本地分支,如果合并为主分支将导致无变化?

[英]How can I delete all local branches which would result in no changes if merged into master?

我知道如何删除已合并的所有本地分支 但是,我相信这是由于Github的新拉动请求压缩和合并功能,我发现自己留下了许多未合并的本地分支,但如果合并到master中将导致没有变化。

如何修剪这些本地分支,即那些未必合并但不会影响主分支(或更一般地说,当前分支)的本地分支?

没有完美的解决方案,但你可以接近,也许足够接近。

一定require_clean_work_tree干净的工作树和索引开始(请参阅git-sh-setup require_clean_work_tree )。

对于可能可删除的每个候选分支$branch

  1. 找到它的合并目标(大概是merge_target=$(git config --get branch.${branch}.merge) )。 查看合并目标。
  2. --no-commit合并; 或者在步骤1中,使用--detach检查,以便在合并成功时获得可以放弃的提交。
  3. 测试git是否认为合并成功,如果是,则当前树是否与前一棵树匹配,即没有带来任何变化。 如果你可以测试完全匹配,并且你允许提交(通过--detach ),你可以非常简单地完成最后一次测试,没有任何差异:运行git rev-parse HEAD^{tree}git rev-parse HEAD^^{tree} 1并查看它们是否产生相同的哈希值。 如果不允许犯,你仍然可以git diff的电流( HEAD )提交反对提出的合并。 如果你需要从diff中删除一些噪音(例如,配置文件不应该,但无论如何,在提交中),这给你一个地方去做。
  4. 重置( git merge --abort; git reset --hard HEAD; git clean -f或类似,具体取决于你决定如何实现步骤1-3)。 这只是为了让您的工作树和索引再次清理,以便下一次传递。
  5. 如果步骤3中的合并有效并且未引入任何更改,则可以删除本地分支。 否则,保持它。

实质上,这是“实际上合并,看看会发生什么”,只是完全自动化。


1这个符号看起来有点怪异,但它只是HEAD^的-the第一个父HEAD通过-followed ^{tree} 替代拼写可能更容易阅读: HEAD~1^{tree}${merge_target}^tree ,其中${merge_target}是您在步骤1中检出的分支。请注意,这假设合并成功。 合并结果处于git merge的退出状态:零表示成功,非零表示失败,需要手动帮助,可能是由于合并冲突。

如果你运行git“branch -v”,那些有变化的跟踪分支将在它们旁边写下“前面”。

另外两个选项:“后面”并且如果没有写入,则意味着分支没有会影响它们跟踪的分支的更改。

因此,你可以运行“git fetch”来更新远程跟踪分支,然后解析“git branch -v”结果,找出哪些分支没有变化,哪些分支有。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM