我有主项目和一个分支。当我合并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会告诉你有冲突,并且不会自动合并这些文件。
这可能会帮助你理解概念。基本上,因为master
自branch
创建以来没有任何更改,所以git可以假定您所做的任何更改都是故意的。
合并分支意味着您想要add
分支所建议的changes
。NOT可以选择性地合并分支。它被合并为一个整体。
要查看合并前检查两个分支的差异,请运行
git diff master my_branch
如果您觉得my_branch
中的代码不符合您的标准或有错误,请不要合并。