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



我需要知道如何告诉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而不发生冲突。问题是,要么56中的更改与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仍然没有56的变化;所以你的DevOps进入

git checkout qa
git merge dev

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

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

它将56的变化添加到qa但也从qa中删除4的变化。

即使你避开了快进,你也会在不同的历史中得到同样的结果。(只有当这是真的时才使用fast-forward。(要评估完整的3路合并,您需要将4识别为合并基础(它是从两个分支都可以到达的最新提交(,4为";我们的";,并且CCD_ 28为"0";他们的";。

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

这意味着合并将完全包括应用它们的更改("从46的差异"(作为4的补丁。。。这意味着您可以在6中获得状态的副本。同样,这意味着qa特定的更改将通过合并删除。

要改变这一点,您必须执行一些操作,使git将3识别为合并基础(就像在将qa合并到dev之前一样(。。。但这意味着冲突又回来了。

最新更新