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

时间:2016-04-05 14:15:05

标签: git github branch branching-and-merging squash

我知道how to delete all local branches that have been merged。但是,我相信这是由于Github的新pull request squash and merge功能,我发现自己留下了许多未合并的本地分支,但如果合并到master中将导致没有变化。

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

2 个答案:

答案 0 :(得分:3)

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

请务必从干净的工作树和索引开始(请参阅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}和{{1 }} 1 并查看它们是否产生相同的哈希值。如果您不允许提交,您仍然可以git rev-parse HEAD^^{tree}针对建议的合并进行当前(git diff)提交。如果您需要从差异中删除一些噪音(例如,配置文件不应该,但无论如何,在提交中),这为您提供了一个位置。
  4. 重置(HEAD或类似,具体取决于您决定如何执行步骤1-3)。这只是为了让你的工作树和索引再次清理,以便下一次传递。
  5. 如果步骤3中的合并有效且未引入任何更改,则可以删除本地分支。否则,请保留它。
  6. 从本质上讲,这是“实际上是合并,看看会发生什么”,只是完全自动化。

    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"结果找出哪些分支没有变化,哪些分支有。