在我们团队的存储库中,我们通过提交PR进行工作,并且仅使用github的squash&merge功能将它们合并为master。对我来说,问题在于我再也看不到分支与合并为master git branch --merged,因为这将不会显示已被压缩和合并的分支。我的当地分支机构堆积如山,很难一一查看,看看可以删除哪些分支。还有另一种列出它们的方法吗?
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 pull上master,您会收到挤压和重订基期承诺S':
master
v
o--o--o--o--S'
\
A--B--C
^
topic
Run Code Online (Sandbox Code Playgroud)
Git 无法知道提交S'包含来自A,B和的组合更改C。这就是为什么它仍然会报告topic为unmerged。
Linus Torvalds 曾经写道:
人们可以(并且可能应该)重新定义他们的私有树(他们自己的工作)。那是清理。但从来没有其他人的代码。这就是“破坏历史”。
然后他继续说:
你永远不能摧毁其他民族的历史。你不能 rebase 其他人所做的提交。基本上,如果它没有您的签名,则它是禁止的:您不能对其进行重新设置,因为它不是您的。
很明显,GitHub 的Squash 和合并功能通过完全重写他们的 PR 分支来破坏其他人的历史。
我不会坐在这里告诉你Squash 和 merge本质上是邪恶的?我相信它有它的用途。
但是,如果您的团队经常发现自己不得不处理陈旧的本地分支(如您所描述的),您可能需要考虑切换到合并工作流程,该工作流程按原样合并 PR 的历史记录,而不是销毁它。
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |