Git 恢复主控后合并

Git Merge after Master has been reverted

我在一个名为 BR1 的功能分支中工作,该分支从 master 分支出来。 此时 master 和我的分支有文件 a.js,内容为:

1: console.log(`Hello Duck`);

创建 BR1 大约 20 天后,master 恢复到过去的提交。现在master中a.js的内容改回:

1: console.log(`Hello Dog`);

在此期间,我在我的分支中更改了 a.js,添加了更多代码:

1: console.log(`Hello Duck`); // this line was not changed

2: if (foo === bar) return; // added this line.

如何将我的 BR1 分支合并到主分支中,避免将分支中的内容 a.js 替换到主分支中。我想保留我没有 change/add 行中的主要内容。我想要这样的东西:

1: console.log(`Hello Dog`);

2: if (foo === bar) return; // add this line.

就去做吧。您必须告诉 Git 该对的正确结果,它会(正确地)注意到邻接线的变化,并要求人工判断它们是否相互作用以及如何相互作用。在像这样的“他们不这样做”的情况下,这可能会令人惊讶,但关键是,他们经常这样做,并且 Git 假设他们不这样做将是一个非常糟糕的决定。

熟练使用这些工具,像这样的小案例只需两秒钟即可解决。

git init testmerge; cd $_
echo Hello Duck  >t1; git add .; git commit -m duck
git checkout -b br1
echo new line >>t1; git commit -am newline
git checkout master;
echo Hello Dog >t1; git commit -am dog
git merge br1

和 Git 报告冲突,邻接的行已更改。冲突提交的顺序无关紧要,重要的是两个提示对重叠或邻接的行进行了更改。

在Git中,单词revert与单词reset的含义不同,它们不可互换。您 恢复 通过创建一个新提交来恢复提交,该提交与您要恢复的提交相反,有效地撤消更改。当你 reset 一个分支时,你改变了分支指向的提交,如果你将它向后移动到分支上的旧提交,那么之后的所有提交都将有效地从那个提交中删除分支.

鉴于这些定义,没有意义:

master was reverted to a past commit.

我假设你的意思是:

master was reset to a past commit.

为什么这很重要?

如果更改相关行的提交已在 master 上被 还原 ,那么当您将分支合并到 master 时,您将拥有您可以通过选择您想要的确切结果(采用较旧的第一行和较新的第二行)来解决冲突。但是由于 master 重置 ,你的分支似乎 Git 是所有更新的变化,所以 Git 将 select 你所有的更改而不提示冲突解决。

那你该怎么办呢?

您可以执行多项操作,其中两项是:

  1. 经过深思熟虑,不要选择此选项。 只需更改文件的第一行,使其看起来像当前 master 分支,并在您的分支上提交它,并带有标题消息,如“由于分支重置而更新”,并且可能在提交消息详细信息中提供更多信息。现在,当您合并到您的分支时,您不会影响由于重置而 un-done 的行。 此选项的问题是您将带回从 [=10] 中删除的提交=] 重置,大概是有意删除的。

  2. 执行此操作: 重建您的分支,就好像它来自当前 master 的样子。有多种方法可以做到这一点,但从概念上讲,您从当前 master 创建一个新分支,然后 cherry-pick 您对该分支的每个提交。对于您需要解决的第一个更改,您会在有问题的行上发生冲突。您还可以使用类似于以下内容的方式对您的分支机构进行“花式”变基:

    git rebase --onto current-master old-master

    使用变基,您还需要解决第一行中的冲突。

旁注: 这是重置共享分支(例如 master 不受欢迎的原因之一,因为它会弄乱所有基于关闭的分支其中,这正是您的情况。