1

目前,我的 git 存储库中有以下情况。

HEAD -- 0 -- 1 -- ... -- 3 -- 5 master
         \-- 2 -- ... -- 4 --/  branch-1

分支“branch-1”已在一段时间前从 master 分叉(参见提交 5)。

在提交 0 时,我想将其合并回 master,但是在提交 1 和 3 之间在 master 中发生的所有更改都被覆盖了。有效地创造

0 -- 2 -- ... -- 4 -- 5 master

由于我的同事无法在此状态下继续他们的工作,我已恢复合并提交。因此,我确实将 HEAD 设置为与 1 相同。使用的命令将是“git revert -m 2 0”。

但现在我希望我的更改再次合并。这一次,我希望它会成功。我需要创建类似的东西:

-2 -- HEAD -- 0 -- 1 -- ... -- 3 -- 5 master
  \            \-- 2 -- ... -- 4 --/
   \--- -1 ------/

这将是一个新的提交 -1,它避免了失败的合并 0 并返回到我在合并之前拥有的干净状态(我通过恢复获得的干净状态)。

然而,仅仅试图将 2 合并到 HEAD 是行不通的。我认为这是因为它们已经在 0 处合并。

4

1 回答 1

1

问题是您使用git revert而不是git reset --HARD. git revert创建一个新的提交,重做先前提交的更改。git reset做同样的事情,但不是通过创建新的提交,而是通过丢弃错误的提交。因此,错误的提交仍然存在于您的历史记录中。

将 2 合并到 HEAD 不起作用,因为您正在尝试与自己的历史合并。这就像试图将 4 合并为 2。

您需要做的是,扔掉 0 并制作一个新的。

首先,使用以下命令将 master 重置回 1:

git reset --HARD 1

然后,在那里达到一个干净的、可以合并的状态(如果需要,您可以进行提交)。

之后,确保 branch-1 指向 2:

git checkout branch-1
git reset --HARD 2

在那里也达到一个干净的、可以合并的状态。然后,将它们合并:

git checkout master
git merge branch-1

检查合并的结果。如果它没有按您的意愿工作,请通过重新设置 master 和 branch-1 重新开始。如果你不能让合并工作,你也可以尝试一个变基。这会将您的历史扁平化为如下所示:

2' -- .. -- 4' -- 1 -- .. -- 3 -- 5

在将两个分支合并或重新设置基础之后,您可以重新设置在还原提交之后引入的任何更改(替换2'为您创建的新合并/重新设置的最新提交,不要使用 HEAD,因为它会在命令运行后更改) :

git rebase 2' -2

之后,您的历史记录应如下所示:

-2' -- .. -- 2' -- .. -- 4' -- 1 -- .. -- 3 -- 5

或者,如果您合并而不是变基:

-2' -- .. -- 0' -- 1 -- ... -- 3 -- 5
              \ -- 2 -- ... -- 4 --/
于 2013-09-06T12:21:43.923 回答