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

Le *_*ite 5 git branch github

在我们团队的存储库中,我们通过提交PR进行工作,并且仅使用github的squash&merge功能将它们合并为master。对我来说,问题在于我再也看不到分支与合并为master git branch --merged,因为这将不会显示已被压缩和合并的分支。我的当地分支机构堆积如山,很难一一查看,看看可以删除哪些分支。还有另一种列出它们的方法吗?

Enr*_*lio 5

tl;博士; 抱歉不行。你必须在 GitHub 上检查你的 PR 的状态,一旦它被合并,用git branch -D.

“挤压和合并”插图

GitHub Squash 和合并操作实际上并未合并您的主题分支?相反,它将来自该分支的所有提交压缩为一个,然后将该提交重新绑定到目标分支之上。

文档

当您在 GitHub 上的拉取请求上选择压缩和合并选项时,拉取请求的提交将压缩为单个提交。

而最重要的部分:

使用快进选项合并压缩提交的拉取请求。

一个快进合并不创建一个合并提交?它只是将目标分支引用向前移动,使其指向与源分支相同的提交。这只能在源分支指向作为目标分支的后代的提交时才能完成。

因此,如果您的主题分支在本地存储库中如下所示:

         master
         v
o--o--o--o
    \
     A--B--C  <- This is the branch you want to merge with a PR
           ^
           topic
Run Code Online (Sandbox Code Playgroud)

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

         master
         v
o--o--o--o
    \
     S  <- This is A, B and C squashed together
     ^
     topic
Run Code Online (Sandbox Code Playgroud)

然后,将GitHub的底垫 topic之上master。请注意,由于父项不同,这将导致与原始压缩提交S不同的提交;为了区分它,我们称重基提交S'S prime):

         master
         v
o--o--o--o
          \
           S'
           ^
           topic
Run Code Online (Sandbox Code Playgroud)

最后,topic分支被合并到master一个快进合并中

            master
            v
o--o--o--o--S'
            ^
            topic
Run Code Online (Sandbox Code Playgroud)

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

         master
         v
o--o--o--o
    \
     A--B--C
           ^
           topic
Run Code Online (Sandbox Code Playgroud)

你这样做后git pullmaster,您会收到挤压和重订基期承诺S'

            master
            v
o--o--o--o--S'
    \
     A--B--C
           ^
           topic
Run Code Online (Sandbox Code Playgroud)

Git 无法知道提交S'包含来自A,B和的组合更改C。这就是为什么它仍然会报告topicunmerged

实际考虑

Linus Torvalds 曾经写道

人们可以(并且可能应该)重新定义他们的私有树(他们自己的工作)。那是清理。但从来没有其他人的代码。这就是“破坏历史”。

然后他继续说:

你永远不能摧毁其他民族的历史。你不能 rebase 其他人所做的提交。基本上,如果它没有您的签名,则它是禁止的:您不能对其进行重新设置,因为它不是您的。

很明显,GitHub 的Squash 和合并功能通过完全重写他们的 PR 分支来破坏其他人的历史。

我不会坐在这里告诉你Squash 和 merge本质上是邪恶的?我相信它有它的用途。

但是,如果您的团队经常发现自己不得不处理陈旧的本地分支(如您所描述的),您可能需要考虑切换到合并工作流程,该工作流程按原样合并 PR 的历史记录,而不是销毁它。