Git分支在合并时覆盖master而不提供冲突


Git branch overwrites master when merging without offering conflicts

我有主项目和一个分支。当我合并master和branch时,branch中的代码会覆盖master中的代码,我只希望在master中插入与branch不同的代码,或者至少要问我想保留哪些代码。下面是我如何设置所有内容的一个简单示例:

mkdir project
cd project
git init

在项目目录中我有一个名为index.php的文件,代码如下:

<?php
/**
 * This is master code.
 */
class ClassName extends AnotherClass
{
    function __construct(argument)
    {
        // this is from master
    }
}

然后生成branch:

git checkout -b my_branch

我将这段代码放入index。php:

<?php
/**
 * This is branch code.
 */
class ClassName extends AnotherClass
{
    function __construct(argument)
    {
        // this is from branch
    }
}

然后签出到master并尝试合并:

git checkout master
git merge my_branch

然后分支代码将覆盖主代码。在我的master中,我将有与branch相同的代码。git不应该让我选择保留哪个代码吗,还是有办法强制我选择?如果没有,我做错了什么?

如果我在分支代码中做这个改变:

class ClassName extends AnotherClass => class ClassName extends MyClass

然后git会进行递归策略合并,并且会从分支中获取MyClass,而将其他所有内容保留在master中。

我不知道我是否给你展示了好的例子,让我再试着解释一下情况:

1)我有一些代码在master不存在于branch
2)我在branch中有一些代码在master中不存在。

我应该如何处理这个问题,而不是在主和分支中丢失不同的代码?如果这不能以一种干净、良好的计划方式发生,我能不能至少强迫git问我,我想如何处理这些差异?我只能设法使分支重写为主,这是糟糕的。

如果我理解正确,那么您正在检查branch,替换master中的一些代码,然后将branch合并到master中。

创建分支的全部意义在于您可以对代码进行更改,然后将这些更改合并到。

也许举个例子会有帮助。

假设你在master上有一个只有

内容的文件
This is good code

然后检查branch并将文件更改为

This is great code

现在,再次签出master。现在,文件是

This is good code

如果合并,则文件将更改为

This is great code

但是,如果在合并之前将文件更改为

This is really amazing code

然后尝试合并,git会告诉你有冲突,并且不会自动合并这些文件。

这可能会帮助你理解概念。基本上,因为masterbranch创建以来没有任何更改,所以git可以假定您所做的任何更改都是故意的。

合并分支意味着您想要add分支所建议的changesNOT可以选择性地合并分支。它被合并为一个整体。

要查看合并前检查两个分支的差异,请运行

git diff master my_branch

如果您觉得my_branch中的代码不符合您的标准或有错误,请不要合并。