有没有办法在请求请求git中包含旧提交?

时间:2018-07-02 15:51:09

标签: git

因此,我有点弄乱了,并在进行审查之前将我的一些更改推送到了master中。要解决此问题,我将合并的版本拆分为自己的分支,然后再次检出master版本,将其还原,然后推回。

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

Diagram of commits

基本上,我希望将“ d”拉入“ c”,但是Git只能识别与“ d”的区别,即使对“ b”所做的更改应包括在“ d”中,而不是“ c”的一部分。

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

编辑:为了明确起见,“还原还原”将不起作用,因为我希望差异显示在请求请求中,而不仅仅是成功合并。

2 个答案:

答案 0 :(得分:1)

之所以会出现此问题,是因为就git而言,b已经在master中(以及最近发生的撤消b的更改)。这不仅会影响审核,还会干扰实际的合并结果。

有两种通常用于解决此问题的技术。有时您“还原还原”;有时,您复制B来创建一个新的提交B',该提交与B的功能相同,但在拓扑上还不是“已在master中。”

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

所以你有

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

(我将您的图片中的c重命名为!b,以更好地描述其内容-还原了b。)

您需要一些解析为a的表达式。

  • 这可以是a的提交哈希(或提交哈希的缩写形式);如果你有空的话,我会用。

  • 或者,在本示例中,您可以使用your_branch~2,因为your_brancha之后有2次提交(分别是bd)。

  • 如果不确定your_branch上有多少次提交,则可以使用类似$(git merge-base your_branch master)^的名称(请注意末尾的^)。这取决于b是您的分支机构和master的共同祖先的事实,但是如果两个分支之间以后有任何合并,将失败。

无论如何,无论您想到什么表达式,我都会在以下命令中使用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。)

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

答案 1 :(得分:0)

最简单(也是最皱眉)的方法是覆盖主服务器,而不是还原任何内容。

使用git reset --hard HEAD~N从本地主服务器删除提交,其中N是您要删除的最后提交的数量。然后git push -f origin HEAD:master覆盖远程主分支。本质上,这将使分支恢复到“陷入困境”之前的状态。

但是,这种方法有些危险并且不被接受,因为如果有人已经拉过master的“混乱”版​​本,他们以后可能会遇到麻烦。