如何查找没有pull request的推送提交记录?

11

在我的项目中,需要使用从特性分支发起的拉取请求来向主分支添加更改。目前,仓库被配置为禁止直接推送到主分支,但过去允许这样做。

是否可能找到直接推送到master的提交记录,而没有拉取请求呢?

3个回答

3
如果您的拉取请求被保留,您可以简单地检查每个合并到主分支的第二个父提交是否是一个拉取请求。
Github 将拉取请求保存为引用,因此您可以使用 git ls-remote u://r/l refs/pull/*/head 列出它们,尝试在 Atlassian 的服务上找到等效的方法感觉像在油脂中游泳,因此您需要自己解决这个问题。
对于使用 Github 惯例发布拉取请求的存储库,类似以下格式:
awk  'ARGIND==1    { prhead[$1]=1; next}
      !prhead[$3]  { print $0, "was not merged from a pull request" }' \
        <(git ls-remote u://r/l refs/pull/*/head)
        <(git rev-list --first-parent --merges master --parents)

会完成它。

你可以(毫不奇怪地)推送任何设置好接受的仓库,所以在你的限制设置之前,有人可以推送一个快进。这些将显示为主分支上的非合并提交:

git rev-list --first-parent --no-merges master

将列出在主分支上进行的、但尚未合并的每个提交。

0
你的项目中使用的合并策略是什么?rebase还是merge策略?你保留吗?

我不确定。我在哪里可以检查它?据我所知,我们不强制要求合并提交,但通常(如果不是总是)会创建它们。 - pkalinow
1
合并策略可以在两个级别上设置:在您的git配置中 git config --local merge.ff only (有几种方法,建议查阅文档),以及在您的代码仓库(github、bitbucket等)中。 - AElMehdi
还有一件事!你考虑过 git branch --contains=A_GIVEN_BRANCH/COMMIT_ID 吗? - AElMehdi
在 BitBucket 中,合并策略设置为默认值,即“合并提交 --no-ff”。每个开发人员的本地设置可能不同。 - pkalinow
git branch --contains=... 的情况下,我已经尝试过了,但问题是对于 git 而言,从一开始到当前分支指针的历史上的每个提交都被认为包含在该分支中。即使该提交是在分支创建之前创建的。 - pkalinow

-2

这相当于从主分支中删除所有属于PR的提交。要从主分支中删除PR的提交,我可以告诉一个手动方法,不是很高效,但可能还可以:

1)将主分支复制到临时分支以进行操作。

git checkout -b master-sandbox

2) 查找PR的所有提交哈希值(您可以在Bitbucket PR请求等在线平台上找到它们并复制)

3) 根据哈希从master-sandbox中删除提交

git rebase -i HEAD~1000

其中 HEAD~1000 表示最近的 1000 次提交,或者使用提交哈希值进行检查,例如:git rebase -i <hash>。这将打开一个编辑器,其中包含提交列表。找到上面收集的提交哈希值并将其删除。

剩下的提交是不属于 PR 的提交。对所有 PR 重复此操作,剩下的提交即为直接提交的提交。


2
我不明白它如何能帮助我。我不想解决任何冲突! - pkalinow
你的情况是什么,请稍微解释一下?为什么不直接合并你的新功能,为什么需要知道哪些是直接提交的更改?提前致谢。 - gazdagergo
我的情况是,我负责准备“主”分支的新版本。我想确保所有更改都经过了代码审查的批准。不幸的是,直接推送到主分支最近已被阻止,但之前并没有被禁止。 - pkalinow
你在合并已审核的PR时使用了合并提交还是压缩提交?这是另一种值得设置的策略,可以使主分支更加透明。 - gazdagergo
BitBucket 配置为使用合并提交。因此,主分支中存在一些合并分支的痕迹。 - pkalinow
未来,如果没有其他考虑,请使用 squash commit 作为默认选项。在这种情况下,合并提交将代表主分支上的一个 PR,而直接提交的提交(例如快速修复)将保持纯净。对于您当前的情况,我已经创建了一个丑陋的解决方案......它可能比没有好。 - gazdagergo

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