Git 对多个分支上的单行进行更改并保留所有更改

Git make changes to single line on multiple branches and keep all changes

我的代码中有很长一行包含某些东西的 ID。这是该行的示例

const IDs="0,1,2,3,4"

我想在多个分支上添加到这一行。这是一个例子

分支机构 1:

const IDs="0,1,2,3,4,87"

分支机构 2:

const IDs="0,1,2,3,4,95"

我在分支 1 上添加了 87,在分支 2 上我添加了 95。这些一旦合并,就会出现合并冲突。

解决此问题的一种简单方法是保留其中一项更改,然后手动添加来自其他分支的更改。但在我的实际情况下,这一行要长得多,添加了更多的 ID,但并没有全部附加到最后。它们大多散布在中间。

有没有一种方法可以解决冲突,以便添加两个添加项,而无需我自己手动添加它们,使其看起来像这样?

const IDs="0,1,2,3,4,87,95"

您可以编写自己的合并驱动程序。

当Git遇到可能导致合并冲突的情况时,它会运行合并驱动程序。 Git 的默认内置合并驱动程序会发现冲突,将其声明为冲突,并将冲突标记留在工作树中的文件副本中。那是你一直在手动解决的问题。

如果您使用 the gitattributes file 将源文件标记为具有 合并驱动程序 ,但是,Git 使用您定义的合并驱动程序 而不是 的内置的。 Git 已在索引中包含文件的所有三个副本:

  • 合并基础副本,来自共同的共享提交;
  • --oursHEAD 提交/当前分支复制;和
  • 您要合并的提交的 --theirs 副本。

Git 会将所有三个副本提取到临时文件,并使用这些临时文件的名称调用合并驱动程序。您的合并驱动程序必须:

  • 找到基础文件与ourstheirs副本的区别,以及
  • 合并这些差异,将结果写入 ours 副本。

如果您的驱动程序发现冲突,您的驱动程序应该报告非零退出状态。如果没有,您的驱动程序应通过以零状态退出来报告成功。

也就是说,您需要重复标准低级驱动程序所做的工作。关键区别在于,如果有一行在两者中都发生了变化,并且 you 可以通过计算机程序解析,那么 standard低级驱动不行,你先解决吧

如果您不想重新编写所有标准的低级驱动程序,您可以先调用Git的低级合并驱动程序。它可以作为独立命令使用,git merge-file。它会做与 Git 的内置低级驱动程序相同的事情,并且 return 也会有同样的退出状态。然后您可以检查该状态,如果它说存在合并冲突,您可以让您的程序尝试就地解决它们。如果您的程序成功,您的程序可以报告零退出状态。

(编写良好的合并驱动程序并非易事,但对于您的特定情况,如果您使用 git merge-file 完成大部分工作,它可能不会那么糟糕。)