我可以压缩 _other peoples_ git 在已提交的 PR 中的提交吗?

Can I squash _other peoples_ git commits in a submitted PR?

我收到了 PR 并希望压缩提交,这样很好。

我不确定 可以做到还是各自的作者必须做到?当然,我希望保留作者的名字来引用他们的 squash 提交。

注意:这个问题不是关于 me squashing my own commits

Git 中的 PR 如下所示:

或通过 cli:

c:\Projects\Foo>git log --pretty=oneline
7fab9ae1031c13414909668f342582bdc8081f5a <Author - Red>
a02270b2014fd3995456773cd7badc7df0c72cf6 <Author - Blue>
6ae3d6c8b5a8b037c0e4dc88d24ec5598ff1933e <Author - Blue>
100f6513aacbe431b56f3082597749cddca284c8 <Author - Blue>
d263a5c8924053678f455b5ee8515bbb16aacf49 <Author - Blue>
c3cc5dbc13ac77e0a552a2d3132d255df3c7a6e4 <Author - Blue>
71f89b3f3dd583cd97d4a0806a973a4d1af64fe9 <Author - Red>
f14ef616a852f3a7311f4f7b9e05d460e0574422 <Author - Red>
015f30b3828828404b5549ee8a7df2aefdfa9424 <Author - Red>
9b22a4d2ded54cb754883d9d6418a39eb34df7cf <Author - Red>
33a10e9828d04cf82439a6c60b8cf4c0c2f122a3 <Author - Red>
4615c7747c4546809b29e063986c697c7c64cbc4 Added Specific naming rules, section.
b8ee154e38338022649caef40945c6f0297a59ce Added method parameters, section.
bc860c7609cc80caf41fc5944c1b39201019a80e Added Input and View Models, section.
ad6b3e4bee1cb9d8afcf9cd1fa8815769d80133b Fixed bad markdown formatting.
5929d5b38aad8bb7cc3da4976dd81883eab0f999 Added more testing info.
18b64dfc3769766ac2bb841e6346b555d00751f1 Create README.md
d7761e57a5bbd7de587b766c83d2a3134c0bc58b Added xUnit and Shouldly NuGet packages.
7f2ea8cdd97958d347df8079ef2eebb6b7f1647c We need unit tests....
ee31bbfe0572e0e49872edcf1a6fc2c426ed0d15 :money_with_wings: We are alive!

那里有消息的提交,那些是我的,不是这个 PR 的一部分。

有什么我可以做的吗?还是我需要其他作者做的?

评论最终变成了答案,所以我将在这里总结一下:

I'm not sure if I can do it or the respective authors have to do it? Of course, I wish to keep the author's name referencing their squash commit.

如果你压缩任何提交,你最终只会有一个提交,并且一个提交只能有一个作者。它们可能仍会在提交消息中被引用(Git 默认情况下)但是你将失去对文字提交作者的个性。

So can't I squash the blue commits (into one) and then the red commits (into one) ? so there's two in the PR?

是的,你完全可以做到这一点,压缩应该是你在拉取请求中建议的事情,这样你每次只保留一个提交。如果您将所有蓝色提交压缩为一个,将所有红色提交压缩为一个,您将实现我认为您想要的,即清理您的 git 日志,同时仍保留作者历史记录。

Great! .. any suggestions how this can be done?

当然可以。您可以交互式地变基以将多个提交压缩在一起。当您在蓝色提交的两侧都有红色提交时,您的问题就会出现,这会限制您的压缩能力。

对于蓝色提交,您可以在执行 git rebase -i HEAD~11 时将它们压缩到列表中的第一个提交中(加载最后 11 个提交以进行交互式变基)。

我模拟了一些虚拟提交作为示例:

$ git log --oneline
7e8be9c Red
b740f97 Blue
325b375 Blue
553d733 Red
bb5599b Red

在您的控制台中,为列表中的第一个蓝色提交 (bd63d63) 选择 "p" 或 "pick",为所有其他提交选择 "f" 或 "fixup" 丢弃他们的提交消息,或者 "s" 或 "squash" 如果你想为他们保留提交消息:

$ git rebase -i HEAD~5
pick bb5599b Red
pick 553d733 Red
pick 325b375 Blue
fixup b740f97 Blue
pick 7e8be9c Red

变基完成后,您的蓝色提交将全部压缩在一起:

$ git log --oneline
a341d97 Red
488c19e Blue
553d733 Red
bb5599b Red

这里可能会变得复杂,具体取决于红色和蓝色是否触及了相同的文件。

如果他们还没有,那么你最好的选择是 cherry-pick 将 Blue 提交到一个单独的分支(没有 Red 或 Blue)或将其变基,变基原始分支并压缩 Red 提交,同时 丢弃 Blue提交,然后合并临时分支,例如:

$ git checkout -b tempbranch
$ git reset --hard XXXXXXX # this is the commit BEFORE any red or blues
$ git cherry-pick 488c19e

Git 日志现在会告诉您您有一个压缩的 Blue 提交。

切换回主分支并再次变基,这次跳过蓝色提交并将红色提交压缩在一起:

$ git rebase -i HEAD~4
pick bb5599b Red
fixup 553d733 Red
drop 488c19e Blue
fixup a341d97 Red

Git 日志现在将显示您只有一个红色提交。现在你 cherry-pick 蓝色的又回来了:

$ git cherry-pick 488c19e
$ git log --oneline
fc96b04 Blue
0280ef9 Red

如果这些提交都涉及相同的文件,您将遇到问题。在这种情况下,您可能只需要保持红色和蓝色的分离。

重要

我强烈建议您建议 Github 项目的所有贡献者将他们的所有提交压缩为一个,作为拉取请求过程的一部分,这样您就不必处理这些问题你自己。

HTH.