手动关闭bitbucket的pull请求

use*_*612 22 git bitbucket pull-request

我的问题

我做那样的事情:

git clone
git checkout -b new_feature
< work and commit >
git rebase master
< work and commit >
< finish working >
git rebase master
git push origin new_feature
< I create pull request via bitbucket's web interface >
Run Code Online (Sandbox Code Playgroud)

审核更改的人正在执行以下操作:

git pull
git checkout master
git merge --squash new_feature
git push origin master
Run Code Online (Sandbox Code Playgroud)

我希望这会接受拉动请求,但是没有,我错过了什么?

一些背景资料

我阅读了很多bitbucket的文档"使用pull请求",但这对我来说仍然不太清楚.

我可以看到所有来自new_feature分支的提交都已应用于master分支(通过git merge --squash),我可以看到哪些文件已经更改,但是现在当我在bitbucket的pull-request接口上按"merge"时,我在master中有另一个提交,即合并并且这不会更改任何文件(所有更改都已由之前应用git merge --squash)但只是将所有这些提交历史记录放入主文件中,这不是我想要的.

通过:https://confluence.atlassian.com/display/BITBUCKET/Working+with+pull+requests

手动将请求提取到本地系统

有时,在接受拉取请求之前,最好使用工作流来测试本地系统上的变更集.您可以使用任何拉取请求执行此操作.典型的工作流程是:在Bitbucket中接收拉取请求.使用传入的变更集更新本地存储库.调查和/或测试更改集.如果更改集合良好,则将其合并到本地存储库中.您可能必须解决一些冲突.然后,将本地存储库推回Bitbucket.回到Bitbucket,Pull请求在Pull requests选项卡中被标记为已接受.如果您不喜欢更改请求,则在本地放弃更改并拒绝Bitbucket上的pull请求.想法?

Ben*_*mos 14

据我了解,有两种方法可以将Bitbucket拉取请求关闭为"合并".

  1. 单击"合并"按钮.Bitbucket会将您的功能分支合并到目标分支中.(较新版本的Bitbucket允许您在--no-ff和--squash策略之间进行选择.旧版本隐式使用--no-ff.)
  2. 使用git console命令(或其他界面)将您的功能分支合并到目标分支,然后将两者都推送到源.

第一个选项绝对是最简单和最直接的选项,但它不适用于某些开发工作流程.

使第二个选项起作用的关键是您的功能分支必须位于目标分支上.Bitbucket会定期检查已手动合并的拉取请求,并在找到时自动将这些拉取请求标记为合并.注意:Atlassian不会宣传此行为.我无法找到任何支持此声明的官方文档,但至少有一个其他人看到它有效.

根据您描述的工作流程,我猜测审核并推送您的更改的人有一个git历史记录,如下所示:

*   ddddddd (origin/master, master) new feature, squashed
| * ccccccc (origin/new_feature, new_feature) new feature part C
| * bbbbbbb new feature part B
| * aaaaaaa new feature part A
|/
o
Run Code Online (Sandbox Code Playgroud)

在这种情况下,使Bitbucket自动关闭拉取请求的最简单方法是:

git branch --force new_feature ddddddd
git push --force origin new_feature
Run Code Online (Sandbox Code Playgroud)

这也适用于已重新定位的功能分支.

警告!记住这些事实:

  • 并非所有工作流程都允许这种强制推送.
  • 只要其功能分支发生变化,Bitbucket就会自动更新 pull请求所显示的提交.根据您推送分支的顺序,这可能会导致空提交列表.(下面有更多内容.)
  • 关闭拉取请求时,将冻结任何提交历史记录和差异信息.

在推送功能分支之前将目标分支推送到原点时,Bitbucket会首先查找新推送的功能分支上不在目标分支上的任何提交.由于新功能分支是目标分支的祖先,因此结果为空集.Bitbucket因此从pull请求的提交选项卡中删除所有提交,现在读取"没有更改".然后,由于功能分支位于目标分支的历史记录中,Bitbucket会关闭拉取请求,冻结空提交选项卡,如下所示:

没有变化.

奇怪的是,在这种情况下,差异保持完整.

如果上述合并选项均不适合您,则您唯一剩下的选项是:

  • 拒绝拉取请求.
  • 考虑将您的工作流程更改为Bitbucket更容易支持的内容.
  • 使用Bitbucket/Atlassian 浮动功能请求.

另请参阅git-branchgit-push的文档.


Pot*_*rca 12

UPDATE

截至2017年1月31日,已实施一项功能,以解决无法手动关闭PR的问题.

有关详细信息,请参阅(和upvote!)@BenAmos的答案.


原始答案

(为历史目的而保留)

你没有遗漏任何东西.Bitbucket合并后不会自动关闭您的拉取请求.

您必须通过选择"拒绝"选项手动关闭拉取请求.

在此输入图像描述

  • 这会将PR标记为已拒绝,这是不正确的,因为它实际上是合并的. (4认同)
  • 如何手动关闭PR而不下降? (2认同)
  • @RobinGreen 你_不能_。拒绝是唯一的方法:-(我会改写我的答案以使其更清楚。 (2认同)
  • 这是错的!查看@Ben Amos的解决方案 (2认同)