git - 如果 merge 到 master,如何删除所有不会导致更改的本地分支?

标签 git github branch branching-and-merging squash

我知道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:

  1. 找到它的 merge 目标(大概是 merge_target=$(git config --get branch.${branch}.merge))。检查 merge 目标。
  2. 使用--no-commit 进行 merge ;或者在第 1 步中,使用 --detach 检查,这样如果 merge 成功,您将获得可以放弃的提交。
  3. 测试 git 是否认为 merge 成功,如果是,则当前树是否与前一棵树匹配,即没有带来任何变化。如果你可以测试完全匹配,并且允许提交发生(通过 --detach),你可以非常简单地完成最后的测试,没有任何差异:同时运行 git rev-parse HEAD^{tree}git rev-parse HEAD^^{tree}1 看看它们是否产生相同的散列。如果您不允许提交,您仍然可以 git diff 当前 (HEAD) 提交反对提议的 merge 。如果您需要从 diff 中移除一些噪音(例如,不应该但无论如何都在提交中的配置文件),这为您提供了执行此操作的地方。
  4. 重置(git merge --abort;git reset --hard HEAD;git clean -f 或类似的,具体取决于您决定如何实现步骤 1-3)。这只是为了让您的工作树和索引再次干净,以备下一次通过。
  5. 如果第 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/

相关文章:

git - 如何浏览不同的 git 分支而不检查它

git rebase : fixup commits but use latest message

ruby-on-rails - 卡皮斯特 pull 诺 + Git : repository local to production server

javascript - Github Pages 中是否有允许您将单页应用程序的所有内容重定向到 index.html 的配置?

git - 我可以运行一个使用一个 git 分支的程序,同时在另一个分支上工作吗?

git - 重新排序提交

git - 设置使用 TR 将反斜杠转换为正斜杠的 Git 别名

git - 是否有可能获得已提交特定文件的人员列表?

javascript - 在我执行 git rebase 后,应该只有一次提交

git - 如何将 git 存储库回滚到特定提交?