因此,我有点弄乱了,并在进行审查之前将我的一些更改推送到了master中。要解决此问题,我将合并的版本拆分为自己的分支,然后再次检出master版本,将其还原,然后推回。
我现在希望人们查看我的代码,但是在PR中,它仅包括我从两个分支分开以来所做的更改,而不包括我所做的原始更改。我意识到这有点令人困惑,所以我拍了张照片:
。
基本上,我希望将“ d”拉入“ c”,但是Git只能识别与“ d”的区别,即使对“ b”所做的更改应包括在“ d”中,而不是“ c”的一部分。
您知道我如何让git认识到其他差异吗?
编辑:为了明确起见,“还原还原”将不起作用,因为我希望差异显示在请求请求中,而不仅仅是成功合并。
答案 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_branch
在a
之后有2次提交(分别是b
和d
)。
如果不确定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的“混乱”版本,他们以后可能会遇到麻烦。