Git:通过将分支标记为已合并来忽略传入的更改

Git: Ignore incoming changes by marking a branch as merged

我需要知道如何告诉 git 将分支标记为已合并,同时忽略传入的更改。我将尝试演示问题:

创建新分支“dev”
分支开发有更改 1、2、3。
创建分支“qa”(来自开发)
分支 qa 有更改 4(此更改将永远存在于 qa)
切换到分支 dev
分支 dev 获得更改 5、6 需要在没有冲突的情况下将分支 dev 合并到 qa(DevOps 正在执行此合并)

通常我会说将 qa 合并回 dev,使用“take mine”来解决冲突。 在这种情况下,我永远不会想要来自 qa 的更改。

标记 qa 更改以使其永远不会复制到开发分支的最简单方法是什么?我正在尝试为我的数据仓库团队构建一个简化的工作流程。

tl;dr - 如果两组更改发生冲突,您无法在不执行手动冲突解决的情况下创建反映两组更改的状态。您想要这样做的理由可能是合理的,但这并不能改变无法完成的事实。


“将分支标记为已合并”很容易;但它不会执行您希望它执行的操作。

你的起点看起来像

... 1 -- 2 -- 3 -- 5 -- 6 <--(dev)
                \
                 4 <--(qa)

现在您想将 dev 合并到 qa 而不会发生冲突。问题是,56 中的更改与 4 中的更改冲突,或者不冲突。如果他们这样做了,“将分支标记为已合并”将不会改变任何东西。所以你可以说

git checkout dev
git merge -s ours qa

这将创建一个“合并”提交,保留提交 6 中的确切内容,而不管是否存在冲突,正如您所要求的那样。 (请注意,-s ours 更改了 合并策略 ,这与 -X ours 不同,后者传递了一个 合并策略选项 。后者就是您所说的“使用 'take mine' 解决冲突”。-X ours 更改了冲突处理但仍执行非冲突更改的合并;但 -s ours 忽略了“他们的”内容完全。)

所以现在你有

... 1 -- 2 -- 3 -- 5 -- 6 -- M <--(dev)
               \            /
                 ---- 4 --- <--(qa)

其中 M6 的内容相同。但是现在 qa 仍然没有 56 的变化;所以你的 DevOps 去

git checkout qa
git merge dev

问题是,由于您的第一次合并,现在可以从 dev 访问 qa。所以默认情况下这将快进 qadev

... 1 -- 2 -- 3 -- 5 -- 6 -- M <--(dev)(qa)
               \            /
                 ---- 4 ---

56 更改添加到 qa 但也从 qa[= 中删除了 4 更改82=].

即使您避免快进,您也会得到相同的结果但历史记录不同。 (fast-forward 仅在为真时使用。)要评估完整的三向合并,您会将 4 识别为合并基础(它是两个分支均可访问的最新提交),4 作为“我们的”,M 作为“他们的”。

所以你计算“我们的变化”;但是“我们的”是与合并基础相同的提交,所以这是一个空补丁。

这意味着合并将完全包括应用他们的更改(“从46的区别”)作为对[=的补丁19=]... 这意味着您获得了 6 处的状态副本。再次说明,这意味着 qa 特定的更改已被合并删除。

要更改此设置,您必须执行一些操作,使 git 将 3 识别为合并基础(就像在将 qa 合并到dev)...但这意味着冲突又回来了。