我需要知道如何告诉git将分支标记为已合并,同时忽略传入的更改。我将尝试并演示问题:
创建新分支"dev">
Branch-dev有更改1、2、3。
Create Branch"qa";(来自dev(
分支qa有更改4(此更改只存在于qa中(
Switch to Branch dev
Branch dev得到更改5,6需要在没有冲突的情况下将分支开发合并到qa上(DevOps正在进行此合并(
通常,我只会说将qa合并回dev,使用"拿我的";以解决冲突。在这种情况下,我永远不想从qa.中进行更改
对我来说,标记qa更改以使其永远不会复制到dev分支的最简单方法是什么?我正在尝试为我的数据仓库团队构建一个简化的工作流程。
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
不同,后者传递了merge策略选项。后者就是您所描述的"使用‘take-mine’来解决冲突"。-X ours
更改了冲突处理,但仍然执行非冲突更改的合并;但-s ours
完全忽略了"它们的"内容。(
所以现在你会有
... 1 -- 2 -- 3 -- 5 -- 6 -- M <--(dev)
/
---- 4 --- <--(qa)
其中CCD_ 11具有与CCD_ 12相同的内容。但现在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
的变化。
即使你避开了快进,你也会在不同的历史中得到同样的结果。(只有当这是真的时才使用fast-forward
。(要评估完整的3路合并,您需要将4
识别为合并基础(它是从两个分支都可以到达的最新提交(,4
为";我们的";,并且CCD_ 28为"0";他们的";。
所以你计算";我们的改变";;但是";我们的";是与合并基相同的提交,所以这是一个空补丁。
这意味着合并将完全包括应用它们的更改("从4
到6
的差异"(作为4
的补丁。。。这意味着您可以在6
中获得状态的副本。同样,这意味着qa
特定的更改将通过合并删除。
要改变这一点,您必须执行一些操作,使git将3
识别为合并基础(就像在将qa
合并到dev
之前一样(。。。但这意味着冲突又回来了。