首页 > 解决方案 > 有没有办法在 pull request git 中包含旧的提交?

问题描述

所以我搞砸了一点,在审查之前将我的一些更改推送到 master 中。为了修复它,我将合并后的版本拆分到自己的分支中,然后再次签出 master,还原它,然后将其推回。

我现在希望人们审查我的代码,但在 PR 中它只包括我在拆分两个分支后所做的更改,而不是我所做的原始更改。我意识到这有点令人困惑,所以我做了一张照片:

提交图.

基本上,我希望将 'd' 拉入 'c',但 Git 只识别与 'd' 的区别,即使在 'b' 中所做的更改应该包含在 'd' 中并且不是 ' C'。

你知道我如何让 git 认识到还有其他差异吗?

编辑:澄清一下,“revert the revert”不起作用,因为我希望差异显示在拉取请求中,而不仅仅是成功合并。

标签: git

解决方案


出现问题是因为就 git 而言,b它已经存在master(以及最近发生的 undo 更改b)。这不仅会干扰审查,还会干扰实际的合并结果。

有几种常用的技术可以解决这个问题。有时你“revert the revert”;有时您复制B以创建与B'执行相同操作B但在拓扑上“已经在master.”中的新提交。

在你的情况下,你想要后者。(“revert the revert”的唯一干净方法是 on master,这将再次绕过审查。您希望更改B反映在您的分支上。)

所以你有了

... a -- b -- d <--(your_branch)
          \
           !b <--(master)

(我c已从您的图片重命名为!b以更好地描述它是什么 - 恢复b。)

您需要一些解析为a.

  • 这可能是提交哈希a(或提交哈希的缩写形式);如果您有可用的,我会使用它。

  • 或者,在此示例中,您可以使用your_branch~2because your_branchhas 2 commits after a(那些是band d)。

  • 如果你不确定有多少次提交your_branch,你可以使用类似的东西$(git merge-base your_branch master)^(注意^最后的)。这取决于b您的分支和主分支的共同祖先这一事实,但如果两个分支之间有任何以后的合并,则会失败。

无论如何,无论您想出什么表达式,我都会a在以下命令中用作占位符。所以你会做一个“强制变基” your_branch

git rebase -f a your_branch

这应该给你

       d
      /
a -- b -- !b <--(master)
 \
  b' -- d' <--(your_branch)

(我仍然在此图中显示原始d提交,但默认的 git 输出将不再显示它,因为它无法访问。一段时间后,它将被垃圾收集器删除。 b'就像b除了它无法访问之外master; 并且d'是就像d除了它的父母是b'.

这是对 的历史重写your_branch,因此鉴于您之前已经push编辑过,your_branch您现在必须强制推送它 ( git push --force-with-lease)。如果有其他人fetch编辑过的机会your_branch——尤其是如果他们可能已经基于它进行了工作——那么你需要与他们就你正在做的事情进行沟通。(请参阅git rebase“从上游变基中恢复”下的文档。)(如果这可能是一个问题,您可以通过创建一个从未被push编辑过的新分支来避免此问题,并对其进行变基而不是直接变基your_branch。)

完成此操作后,您应该能够执行拉取请求。


推荐阅读