在github提交PR时会显示已经被MR过的commit的问题的探究

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战

提交github的PR时会显示所有commit的问题解决方案

起因

最近在空闲的时候给开源仓库提交代码,我发现会出现 之前提交并合并到 upstream 里的 commit仍然存在的现象。 具体现象如下图: 第一次PR

Pasted image 20220119180416.png

第二次PR

Pasted image 20220119180548.png 第三次PR

Pasted image 20220119180707.png ...

这样虽然对提交效果没有任何影响,但是却很影响我们在提交时的心情和检查提交记录的状态。所以我决定一探究竟,看看如何解决这个问题。

找原因

于是我在网上查了查看看有没有人遇到同样的问题,发现这个问题困扰的人还不少。当然也有不少好哥哥写了很多关于问题的解决方案,但是反反复复一直没有找到好的解决办法。 怎么办呢? 好吧,自己把提交的所有过程都模拟复现一遍,然后分析结果,看看能不能找到一个比较好的解决方案。 说干就干,我记得自己刚申请 github的时候,第一个库就是用来学习如何使用 git 进行提交的。嗯,看来现在再使用它正合适。同时我也建立了一个lessIsMore-ing的组织。 那么我可以 让 lessIsMore-ingfork我自己的learngit仓库,然后就可以模拟向开源代码 PR的情形了。 接下来我进行了如下测试。

  1. 测试只有一条commit然后PR的情况

fork的仓库下,新增一个文件,然后提交上传,最后进行PR,过程如下。 fork仓库提交代码, 然后 PR,见下图 Pasted image 20220120010910.png

upstream仓库 进行 MR,见下图. Pasted image 20220120011303.png

upstream仓库的 commit记录增加了两条,一条 fork仓库的 84aedf, 一条为 MR的操作 99f017d

Pasted image 20220120011554.png

这个是完全符合预期的。

  1. 测试只有一条commit然后PR的情况

fork仓库下建立两条commit然后进行PR操作,过程如下。 fork 仓库提交两次commit,然后PR Pasted image 20220120012308.png

upstream仓库 进行 MR. 此时会给我们三个选项分别为Create a merge commit Squash and mergeRebase and merge 我们一个一个实验, Pasted image 20220120014642.png

我们先选择第一种Create a merge commit,建立普通的MR,让所有的commit保留.

Pasted image 20220120012618.png

然后再观察upstream仓库的commit记录,和第1步的记录类似,如下。 Pasted image 20220120012807.png

此时当我们再次 PR的时候,并未出现显示已经MR过的commit的情况。

  1. 我们继续再次重复步骤2的过程,这次我们MR的方式采用Squash and merge.

省略commitPR过程,直接看MR

Pasted image 20220120013223.png 然后再观察upstream仓库的commit记录 Pasted image 20220120013344.png

比着刚才的commit记录,只多了一条MR信息。我们的commit记录都被抹去了。

此时当我们再次 PR 的时候,会出现显示已经MR过的commit的情况。 嗯,看来这个就是出现重复commit情况的原因了。 为了保持严谨,我们继续实验第三种MR的情况,然而此时已经产生冲突,无法进行 Rebase and merge

为了能继续实验Rebase and merge,我们先在fork分支进行rebase把冲突解决掉,然后提交代码(由于此步相比于实验流程为多余操作,故省略)

  1. 我们继续再次重复步骤2的过程,这次我们MR的方式采用Rebase and merge.

省略commitPR过程,直接看MR

Pasted image 20220120021142.png

然后再观察upstream仓库的commit记录 Pasted image 20220120021217.png

我们可以发现,在MR过后,并没有MR的信息,只有我们提交的commit信息。

经过上面四步,我们可以确定产生提交github的PR时会显示已经被MR过的commit的原因是 upstream上游仓库在进行MR时采用了squash and merge策略,导致authorcommit信息被抹除

如何解决

方法一:rebase

# in your local master

# rebase,如果有冲突,解决冲突
git rebase upstream/master

# --force 是因为和远端分支出现分歧,会被拒绝
git push origin master --force

复制代码

其他方法

由于在网上查的其他方法,经过我的真机测试,都不能完全解决fork仓库向upstream仓库PR时会显示已经MR过的 commit问题,在此我就不写了。如果有小伙伴有其他办法也可以留言互动。

后记

在向开源仓库贡献代码时,由于出于对整体分支一致性和连贯性的考虑,很多仓库管理者都会优先考虑用squash and merge的形式处理PR, 因此我们学会如何处理上面的问题还是有一定的必要的。同时我们也一定要在提PR时,尽量处理好commit的信息,保证合并时的流畅性。 希望这篇文字能够帮助到你,Bye。

文中的参考开源地址

my learngit

lessIsMore-ing learngit

猜你喜欢

转载自juejin.im/post/7055089505727938591