繁体   English   中英

显示已“压缩并合并”到 master 中的本地分支

[英]Display local branches that have been "squashed & merged" into master

在我们团队的存储库中,我们通过提交 PR 来工作,我们只使用 github 的压缩和合并功能将它们合并到 master 中。 对我来说,问题是我再也看不到使用git branch --merged合并到 master 中的分支,因为这不会显示已被压缩和合并的分支。 我当地的分支机构堆积如山,要逐一审查它们以查看我可以删除哪些是一件痛苦的事情。 还有其他方法可以列出它们吗?

tl; dr; 很不幸的是,不行。 您必须在GitHub上检查PR的状态,并在合并后用git branch -D强制删除本地分支。

“挤压并合并”说明

GitHub Squash和merge操作实际上并没有合并您的主题分支 -而是将来自该分支的所有提交压缩为一个,然后在目标分支之上对提交进行重新基准化

文档中

当您在GitHub上的请求中选择Squash and merge选项时,请求的提交将被压缩为单个提交。

最重要的部分是:

使用快速转发选项合并具有压缩提交的拉取请求。

快进合并不会创建合并提交-只是将目标分支引用向前移动,使其指向与源分支相同的提交。 仅当源分支指向目标分支的后代时才可以这样做。

因此,如果您的主题分支在本地存储库中看起来像这样:

         master
         v
o--o--o--o
    \
     A--B--C  <- This is the branch you want to merge with a PR
           ^
           topic

当您使用Squash和merge时 ,GitHub将重写 topic分支的历史记录 ,使其看起来像这样:

         master
         v
o--o--o--o
    \
     S  <- This is A, B and C squashed together
     ^
     topic

然后,将GitHub的重订 topic之上master 注意,由于父对象不同 ,这将导致提交与原始压缩的提交S不同。 为了区别它,我们称重定基础的提交S'S prime ):

         master
         v
o--o--o--o
          \
           S'
           ^
           topic

最后, topic分支通过快速合并合并master

            master
            v
o--o--o--o--S'
            ^
            topic

这一切都发生在GitHub服务器托管的存储库中。 同时,在您的计算机上,存储库仍如下所示:

         master
         v
o--o--o--o
    \
     A--B--C
           ^
           topic

完成git pull on master ,您将收到压缩后的重新提交S'

            master
            v
o--o--o--o--S'
    \
     A--B--C
           ^
           topic

Git无法知道提交S'包含ABC的组合更改。 这就是为什么它将仍然报告topic为未合并的原因

实际考虑

莱纳斯·托瓦尔兹曾经写道

人们可以(也许应该)为自己的私有树(他们自己的工作)建立基础。 那是清理工作 但是从来没有其他人编写代码。 那是“毁灭的历史”。

然后,他继续:

您绝对不能破坏他人的历史。 您不得重新基准其他人所做的提交。 基本上,如果没有您的批准,那就超出了限制:您无法将其作为基准,因为它不是您的。

显而易见,GitHub的Squash and merge功能通过完全重写其PR分支破坏了其他人的历史。

我不会在这里告诉您壁球和合并本质上是邪恶的 -我敢肯定它有其用途。

但是,如果您的团队经常发现自己必须处理陈旧的本地分支机构(如您所述),则可能需要考虑切换到合并工作流程的合并工作流程,而不是破坏它,而将PR的历史记录保持原样

git branch --merged master列出合并到master的分支

git branch --merged列出合并到HEAD中的分支(即当前分支的尖端)

git branch --no-merged列出尚未合并的分支

默认情况下,这仅适用于本地分支。 -a标志将显示本地和远程分支,-r标志仅显示远程分支。

希望这会有所帮助。

我使用 PR 和 squash 合并遇到了同样的问题,并根据具有上游分支的分支发出了一个小命令来清理不需要的分支。

它还避免删除主分支,如masterdeveloprelease

git branch -d $(git branch --format "%(refname:short) %(upstream)" | awk '{if ($2) print $1;}' | grep -vE "release|develop|master") -f

我使用这个问题的答案做到了: List all local branches without a remote

暂无
暂无

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

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