如何在 GitHub 上更改 PR 的所有者/如何征用开放的 GitHub PR

How to change the owner of a PR on GitHub / How to commandeer an open GitHub PR

我发现 GitHub 中缺少的这个功能令人沮丧,所以我在这里记录我的变通方法以帮助下一个人。欢迎使用其他更好的解决方法。

这个问题 不是 的重复 ...因为这个问题不清楚是否是询问如何重写一些提交的作者并将它们推送到 github,或者实际更改最初创建整个 PR 的名称。而且,该问题的可接受答案是对本地 .git/config 文件的简单修复,这显然不会解决我在这里谈论的 GitHub 问题。


在 GitHub PR 的顶部,您会看到类似这样的内容:

username wants to merge 1 commit into base_branch from their_feature_branch

Example PR (chosen "at random" from GitHub, just to show the PR author line in the image below)。图片:

那个username:我们怎样才能改变它?用例示例:

  1. 开这个PR的队友刚刚离开公司,我们想征用(接管)并为他们完成PR。
  2. 工作量的变化使您不得不从另一个队友那里接手部分完成的 PR。你怎么能把那个 PR 改成你的名字?

假设每个人都拥有对整个 repo 的完全推送访问权限,这意味着您可以 push/pull to/from 彼此的分支。

有时,任务会从一个团队成员传递给另一个团队成员,或者团队成员离开团队。发生这种情况时,最好“征用”或接管他们的 PR,使其成为您的 PR。 然而,据我所知,这在 GitHub 上是不可能的。

Phabricator (a paid alternative to GitHub, and originally an internal tool used at Facebook), this is as simple as clicking a button to "Commandeer Revision" (see old documentation here under "Take over another author's change" 上)。这被称为“征用某人的 diff”,这里的“diff”是 Phabricator-相当于 GitHub PR,或“Pull Request”。

如何在GitHub

中征用(接管)别人的 PR

即:如何更改打开的 PR 的所有者,使其看起来像是您打开了 PR,而不是他们。

因此,由于 GitHub 不允许征用 PR,这里有一些选项:

  1. 继续使用他们的公开 PR,在这种情况下,他们的名字,而不是你的名字,在你使用“Squash并合并”选项来完成 PR。如果他们完成了大部分工作,那很好。但是,如果您正在接手 PR 并且您正在做大部分工作,您可能希望将您的名字附加到工作中。所以,改为:
  2. 只需关闭他们打开的 PR 并打开您自己的。

要执行上面的选项 1:只需继续使用他们的公开 PR,其中 他们的 名称附加到最终的压缩合并提交中:

  1. 查看他们在本地的分支机构
    git fetch origin their_branch_name
    git checkout their_branch_name
    
  2. 可选地,将他们分支的本地副本重命名为您喜欢的名称
    git branch -m new_branch_name
    
  3. 设置这个分支的上游,这样当你git push它会推送到他们的远程分支名称,它附加到他们的 公开公关:
    git push --set-upstream origin new_branch_name:their_branch_name
    
    注意:我在这里学习了 git push -u origin local_FROM_branch:remote_TO_branch 语法:How can I push a local Git branch to a remote with a different name easily? 另见 my own new answer to that question here.
  4. 现在,要推送您只需调用:
    git push
    
  5. 并且要从该分支中​​拉取,以防其他队友也向其推送更改,您可以指定:
    git pull origin their_branch_name
    

现在,只要 PR 完成并经过审核,您就可以通过 GitHub 合并它。如果您选择常规合并选项,您将获得您的提交的信用。如果您选择“压缩并合并”选项,原作者,您将无法获得整个合并的全部功劳。这是愚蠢的,应该由 GitHub 修复,但是,就是这样。

以上选项 2 的操作方法如下:关闭他们的 PR 并打开您自己的 PR:

  1. 转到他们的 PR 底部并单击“关闭拉取请求”:
  2. 查看他们在本地的分支机构
    git fetch origin their_branch_name
    git checkout their_branch_name
    
  3. 可选,但推荐,将您的分支的本地副本重命名为您喜欢的名称。
    git branch -m new_branch_name
    
  4. 将此作为新分支推送到 GitHub 上的远程 origin。这会推送到 你的 远程分支,并允许你在 GitHub 上以你的名字打开一个新的 PR:
    git push --set-upstream origin new_branch_name
    # Note: if you didn't rename the branch to `new_branch_name` above, 
    # and it is therefore still called `their_branch_name` locally, just
    # use `their_branch_name` here instead.
    
  5. 第一次这样推送后,GitHub会在你推送的终端输出一个URL,你可以点击在下打开一个新的PR你的名字。 (如果您没有此功能,只需转到 Github.com 并在那里手动打开一个 PR)。打开 PR 瞧!现在是您的 PR,您刚刚“征用”了他们的 PR!
  6. 现在,要推送您只需调用:
    git push
    
  7. 并且要从该分支中​​拉取,以防其他队友也向其推送更改,您可以指定:
    git pull origin new_branch_name
    

现在,当 PR 完成并审核后,您可以在 GitHub 上合并它。如果您选择“压缩和合并”选项,您的 名称现在将用于最终的单个提交,该提交将合并到 base_branch.

另请参阅:

  1. How can I push a local Git branch to a remote with a different name easily?
  2. [我刚刚添加的我自己的新答案]How can I push a local Git branch to a remote with a different name easily?

只是举一个例子,当这个能力将是一个必要的特征时: 我拥有的其中一个 PR 有状态错误,这不是分支的一部分,但已本地化到 PR:

>> git checkout -b new_name; 
>> git push origin new_name;
>> opened new PR without errors. 

错误不在GitHubper-se,而是在我们为测试环境制作的一些插件和扩展中。

但我希望 IT 团队调试 state-corruption,所以我想将我的 PR 传递给他们(显然是 PR 而不是代码或分支)。