部分合并两个 Git 分支

Partially merge two Git branches

我看到 git 教程的存储库,其中包含与教程每一章对应的分支。 因此,例如,在第一章中教程教如何创建主页,在第二章中教如何将它连接到后端。

第 1 章在 git 存储库中有一个只有主页的第 1 章分支

第 2 章有包含主页的第 2 章分支 + 调用 API 的脚本,依此类推。

现在假设在某一时刻(第 3 章)我们想要更改主页的颜色和样式,并且我们希望这反映在第 1 章、第 2 章和第 3 章的所有分支中。

合并在第 3 章中对样式所做的更改也不会将所有更改合并回第 1 章,因此第 1 章和第 3 章分支将相同。我们不想要的。

除了手动复制和粘贴所需的更改之外,还有其他方法吗?

有很多方法可以完成您所描述的内容。将 chapter3 合并到前面的章节不是其中之一。 (你可以近似地理解“只更新一些文件”的想法,但它是非常手动的,并且可能会导致错误。同样值得注意的是,在大多数教程中,后面的章节可能会修改前一章介绍的文件,所以合并 file-by-file 不一定有效。)

所以你得到的是这样的:

O -- x -- x <--(chapter1)
           \
            x -- x <--(chapter2)
                  \
                   x -- x -- x <--(chapter3)

最简单的方法是在 chapter1 分支上更改颜色,然后将它们向前合并。

这会给你这样的历史

O -- x -- x --------------- A <--(chapter1)
           \                 \
            x -- x ---------- M1 <--(chapter2)
                  \             \
                   x -- x -- x - M2 <--(chapter3)

这将是最简单的方法;这是使用分支和合并来做你想做的事情的自然方式。其他一切都是关于尝试使用看起来与这张图片不同的历史获得相同的效果,可能以一些手动步骤为代价。

如果您只是不想合并提交,您可以在将更改从 chapter1 合并到其他分支时使用 --squash 选项。这会给你类似

的东西
O -- x -- x -- A <--(chapter1)
           \
            x -- x -- A' <--(chapter2)
                  \
                   x -- x -- x - A'' <--(chapter3)

您可以通过挑选或重新设置添加的提交来获得类似的效果。不利的一面是,git 不“知道”chapter2chapter3 包含来自 A 的更改。因此,如果您返回并第二次向 chapter1 添加更改,并希望将这些更改也向前传播,则可能会遇到不必要的合并冲突。

第三种方法是重写历史,使其“看起来”在创建其他章节分支之前已经存在更改。虽然出于美观原因,我通常不太喜欢重写历史记录,但在应该通过教程跟踪回购历史记录的情况下,这是一个相当合理的选择。在这种情况下,历史可以说是您正在制作的内容的一部分,因此当然可以对其进行修改。

如何最好地进行此类重写取决于存储库的复杂程度。

做一系列变基可能很简单(如果一切都是线性的)。 (也就是说,您可以签出 O,进行更改,使用 --amend 提交,然后将 chapter1 变基到修改后的提交,然后变基 chapter2,等等。

如果步骤太多,或者回购更复杂,那么可以使用 filter-repo 之类的东西一次重写整个历史记录。