我能在提交的PR中压缩别人的git提交吗?

7

我收到了PR并希望压缩提交,使其更好。

我不确定是我自己做还是各自的作者做?当然,我希望保留作者的姓名来引用他们的压缩提交。

注意:这个问题不是关于我自己压缩提交的。

以下是在Git中PR的样子:

enter image description here

或者通过命令行界面:

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的一部分。

我能做些什么吗?还是需要让其他作者来做?


如果你压缩任何提交,你最终只会得到一个提交,而一个提交只能有一个作者。它们仍然可以在提交消息中被引用(Git默认情况下会这样做),但是你将失去字面上的提交作者的个性。 - scrowler
那我不能把蓝色的提交(合并成一个)和红色的提交(合并成一个),然后在PR中只有两个提交吗? - Pure.Krome
是的,你完全可以这样做,并且压缩应该是你在拉取请求中建议的一种方法,这样你只需要每个拉取请求携带一个提交。如果你将所有蓝色提交压缩成一个,将所有红色提交压缩成一个,你就能达到我认为你想要的效果,即清理你的git日志,同时保留作者历史记录。 - scrowler
太好了!有什么建议可以实现这个吗? - Pure.Krome
1个回答

8

评论最终变成了一个答案,所以我会在这里总结它们:

我不确定是我可以做还是各自的作者必须做?当然,我希望保留作者的姓名和他们的压缩提交。

如果您压缩任何提交,则最终只会得到一个提交,一个提交只能有一个作者。它们仍可能在提交消息中引用(Git默认情况下会这样做),但您将失去文字提交作者的个性。

那么我不能将蓝色提交压缩成一个,然后将红色提交压缩成一个吗?这样就有两个PR了?

是的,您完全可以这样做,并且在拉取请求中建议压缩,以便每个拉取请求只携带一个提交。如果您将所有蓝色提交压缩成一个,并将所有红色提交压缩成一个,您将实现我认为您想要的目标,即清理git日志并仍然保留作者历史记录。

太好了!..有没有建议如何做到这一点?

当然。您可以交互式地重新排列以将多个提交压缩在一起。在蓝色提交位于红色提交两侧时,您的问题将出现在这里,这会限制您的可压缩性。

对于蓝色提交,您可以将它们压缩到列表中的第一个提交中,当您执行 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

这可能会变得复杂,具体取决于Red和Blue是否接触了相同的文件。
如果他们没有接触过,则最好的选择是将Blue提交(cherry-pick)到一个单独的分支中(不包括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 log 现在会告诉您只有一个已压缩的蓝色提交。

回到您的主分支,再次进行变基操作,这一次跳过蓝色提交并将红色提交压缩在一起:

$ 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项目的贡献者在拉取请求过程中将所有提交合并为一个,这样您就不必自己处理这些问题了。

希望有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接