我如何 git reset --hard 使用 PR?

How can I git reset --hard with a PR?

我想将 master 重置为之前的提交,但我也想要一个 PR 供我的团队批准。

到目前为止我这样做了:

  1. 从 master 创建本地分支
  2. git 重置 --hard d94kjf8
  3. 推送到远程

现在,当我进入 github 创建 PR 时,它说“master 是最新的,包含来自 mybranch 的所有提交”,因此创建 PR 没有区别。

在使用我们的审核流程时,我应该做些什么不同的事情来重置 master?

你不能。

无法使用合并或 PR 执行 git reset。相反,您有两个选择:

  1. 在本地某处重置master,然后强制推送到远程。 (您可能需要特殊权限,即使只是临时权限,也可以强制推送 master。)这通常是不受欢迎的,这就是它经常受到限制的原因。
  2. 您可以改为对您希望“撤消”的每个提交(或合并提交)使用 revert 命令。还原创建新的提交,这与还原的提交相反。然后你可以将这些新提交 PR 到 master.

了解 git 分支是 不是 一系列补丁或指令,它们是 指向单个提交的指针,这一点至关重要。从那个指针,可以通过遵循“父”指针及时向后访问历史的其余部分。

命令 git reset --hard d94kjf8 将当前分支的指针移动到提交 d94kjf8。这不是可以记录在历史记录、审查或合并中的操作 - 它只是 git 的直接指令,用于更改记录“分支 X 当前指向提交 Y”的文件。

要移动远程服务器上的分支指针,您可以使用“强制推送”,告诉远程服务器“忘记您的指针指向什么,指向取而代之”。同样,这里没有审查过程:你发出命令,服务器服从(或拒绝基于服务器上配置的限制),然后就完成了。

移动共享分支的分支指针会对在该分支上构建工作的每个人产生影响。有时,这绝对是正确的做法,但您和您的同事需要了解您在做什么,以及之后还需要解决什么问题。

具体来说,在您进行更改之前从 master 创建的任何分支都将在其历史记录中包含您想“跳过”的提交。这些分支中的每一个都需要“重新定位”,创建一个新的历史记录,就好像 master 在创建它们时已经提交了 d94kjf8。