【问题标题】:Git : Find all remote branches eligible* for deletion (* last commit is a merge to master )Git:查找所有符合条件的远程分支*删除(*最后一次提交是合并到 master)
【发布时间】:2016-04-22 15:53:25
【问题描述】:

我知道这个问题已经以类似的方式提出。但是,我正在寻找更严格的资格标准,即 .我只对

的分支感兴趣
  1. 已合并到master
  2. 合并后没有进一步的提交 掌握

这是为了避免删除有一些进一步(可能有价值)工作但尚未合并到 master 的分支(通过可能的遗漏、放弃的拉取请求等)

【问题讨论】:

    标签: git merge git-branch branching-and-merging


    【解决方案1】:

    简单得多,对于这种特殊情况(检查哪些远程跟踪分支已完全合并到master):

    git branch -r --merged master
    

    (当然还有--no-merged,对于那些可能仍需要处理它们的人,根据other answer 上的cmets)。

    【讨论】:

      【解决方案2】:

      这是建议的解决方案:

      假设:假设最古老的祖先是 origin/master 。这是标准做法,但大声疾呼也无妨。

      git branch -r --list --contains `git rev-list  --max-parents=0 origin/master`| grep -v origin\/master | sed 's/^..\(.*\)/\1/' | xargs -I {}  sh -c "echo -n {}' : '; git log --graph -n 1 {} | grep -c '^|[\]\ \ Merge'"
      

      一步一步

      1. 查找所有具有初始主提交的远程分支 后代。
      2. 对于每个分支,检查最新提交是否合并回最旧的祖先。

      输出报告如下所示。分支旁边的 1 表示它可以删除

      origin/0.2016.02-release : 1
      origin/0.2016.03-release : 1
      origin/Fix-for-NPE-schedule-master : 0
      origin/Fix-possible-infinite-loop-master : 0
      origin/Fixing-unit-tests-master : 0
      origin/NoBodyRequiredForActivity-master : 0
      origin/Removing-not-needed-dependency-master : 0
      origin/updateDevServiceConfig-master : 0
      origin/updateServerPort-master : 0
      origin/updatedPom : 1
      

      希望这可以帮助任何寻找类似东西的人。欢迎任何建议和改进

      【讨论】:

      • 您不必担心根提交 (--max-parents=0),只需担心每个最尖端的提交。任何合并都会导致所有合并的提交都可以从该路径访问,并且根据定义,所有前任都可以从其后继者访问。 git branch--merged 谓词(现在也可在 git for-each-ref 中使用)为您处理此问题,因此 git branch -r --merged master 为您提供列表。
      • 但是git branch -r --merged master 不会区分在最新合并到 master 后有进一步提交的分支和没有的分支,这不是真的吗?这就是我感兴趣的问题。
      • 不,这不是真的:--merged 表示“测试$theirs 的提示提交与$ours 的提示提交,$ours$theirs 的含义很明显,和由“是祖先”组成的测试(由git merge-base --is-ancestor执行的相同测试)。例如,假设origin/good指向提交Xorigin/bad指向提交Y,其中X要么在master 的尖端后面,要么在master 的尖端,但Y 无法从master(的尖端)到达。--is-ancestor 测试通过X (Xmaster) 尖端的祖先,但对于 Y 失败。
      • 还有一点值得注意:所有这些测试(你的和我的)都假设你刚刚得到的origin/foo 的任何结果仍然有效。可能在您测试它和发送删除请求之间,其他人更新了origin/foo 以更改结果。我还没有测试过--force-with-lease 选项是否适用于--delete,但在执行这些删除操作时可能会使用这种方法。
      • 谢谢 Torek 我已经验证你所说的确实是正确的。您的第二点也很重要,因为它提醒了我问题的真正意义在于首先确定我们不想删除的分支,因为我们需要查看其中尚未删除的额外代码合并到 master 。考虑到这一点,我们可以使用补充命令git branch -r --list --no-merged master 列出我们需要管理其代码的分支。随意提供一个答案,我可以将其标记为已接受的答案。否则我可以编辑上面的答案。
      猜你喜欢
      • 2019-09-26
      • 2012-08-31
      • 2019-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多