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
而不会发生冲突。问题是,5
和 6
中的更改与 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)
其中 M
与 6
的内容相同。但是现在 qa
仍然没有 5
或 6
的变化;所以你的 DevOps 去
git checkout qa
git merge dev
问题是,由于您的第一次合并,现在可以从 dev
访问 qa
。所以默认情况下这将快进 qa
到 dev
... 1 -- 2 -- 3 -- 5 -- 6 -- M <--(dev)(qa)
\ /
---- 4 ---
将 5
和 6
更改添加到 qa
, 但也从 qa
[= 中删除了 4
更改82=].
即使您避免快进,您也会得到相同的结果但历史记录不同。 (fast-forward
仅在为真时使用。)要评估完整的三向合并,您会将 4
识别为合并基础(它是两个分支均可访问的最新提交),4
作为“我们的”,M
作为“他们的”。
所以你计算“我们的变化”;但是“我们的”是与合并基础相同的提交,所以这是一个空补丁。
这意味着合并将完全包括应用他们的更改(“从4
到6
的区别”)作为对[=的补丁19=]... 这意味着您获得了 6
处的状态副本。再次说明,这意味着 qa
特定的更改已被合并删除。
要更改此设置,您必须执行一些操作,使 git 将 3
识别为合并基础(就像在将 qa
合并到dev
)...但这意味着冲突又回来了。
我需要知道如何告诉 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
而不会发生冲突。问题是,5
和 6
中的更改与 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)
其中 M
与 6
的内容相同。但是现在 qa
仍然没有 5
或 6
的变化;所以你的 DevOps 去
git checkout qa
git merge dev
问题是,由于您的第一次合并,现在可以从 dev
访问 qa
。所以默认情况下这将快进 qa
到 dev
... 1 -- 2 -- 3 -- 5 -- 6 -- M <--(dev)(qa)
\ /
---- 4 ---
将 5
和 6
更改添加到 qa
, 但也从 qa
[= 中删除了 4
更改82=].
即使您避免快进,您也会得到相同的结果但历史记录不同。 (fast-forward
仅在为真时使用。)要评估完整的三向合并,您会将 4
识别为合并基础(它是两个分支均可访问的最新提交),4
作为“我们的”,M
作为“他们的”。
所以你计算“我们的变化”;但是“我们的”是与合并基础相同的提交,所以这是一个空补丁。
这意味着合并将完全包括应用他们的更改(“从4
到6
的区别”)作为对[=的补丁19=]... 这意味着您获得了 6
处的状态副本。再次说明,这意味着 qa
特定的更改已被合并删除。
要更改此设置,您必须执行一些操作,使 git 将 3
识别为合并基础(就像在将 qa
合并到dev
)...但这意味着冲突又回来了。