Git 合并时分支会覆盖主控而不提供冲突
Git branch overwrites master when merging without offering conflicts
我有一个主项目和一个分支。当我将 master 与 branch 合并时,branch 中的代码会覆盖 master 中的代码,我只想从 master 中的分支插入不同的代码,或者至少被问到我想保留哪些代码。这是我如何设置所有内容的一个简单示例:
mkdir project
cd project
git init
在项目目录中,我有一个名为 index.php 的文件,代码如下:
<?php
/**
* This is master code.
*/
class ClassName extends AnotherClass
{
function __construct(argument)
{
// this is from master
}
}
然后我创建分支:
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的代码。在我的主人中,我将拥有与分支中相同的代码。 git 不应该让我选择要保留的代码,还是有什么办法可以强制这样做?如果不是,我做错了什么?
如果我在分支代码中进行此更改:
class ClassName extends AnotherClass => class ClassName extends MyClass
然后 git 将执行递归策略合并,并从分支中获取 MyClass
并保留其他所有内容。
我不知道我是否向您展示了很好的例子,让我再次尝试解释一下情况:
1) 我在 master
中有一些代码在 branch
.
中不存在
2) 我在 branch
中有一些代码在 master
中不存在。
我应该如何处理这个问题而不丢失 master 和 branch 中的不同代码?如果这不能以某种干净、良好的计划方式发生,我是否可以至少强迫 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会告诉你有冲突,不会自动合并这些文件。
This 可能会帮助您理解这个概念。基本上,因为自 branch
创建以来 master
根本没有改变,git 可以假设您所做的任何更改都是有意的。
合并分支意味着您想要add
分支建议的changes
。您可以 NOT 有选择地合并一个分支。它被合并为一个整体。
要查看差异是什么 b/w 两个分支在合并前进行审查,运行
git diff master my_branch
如果您觉得 my_branch
中的代码不符合您的标准或者有错误,请不要合并它。
我有一个主项目和一个分支。当我将 master 与 branch 合并时,branch 中的代码会覆盖 master 中的代码,我只想从 master 中的分支插入不同的代码,或者至少被问到我想保留哪些代码。这是我如何设置所有内容的一个简单示例:
mkdir project
cd project
git init
在项目目录中,我有一个名为 index.php 的文件,代码如下:
<?php
/**
* This is master code.
*/
class ClassName extends AnotherClass
{
function __construct(argument)
{
// this is from master
}
}
然后我创建分支:
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的代码。在我的主人中,我将拥有与分支中相同的代码。 git 不应该让我选择要保留的代码,还是有什么办法可以强制这样做?如果不是,我做错了什么?
如果我在分支代码中进行此更改:
class ClassName extends AnotherClass => class ClassName extends MyClass
然后 git 将执行递归策略合并,并从分支中获取 MyClass
并保留其他所有内容。
我不知道我是否向您展示了很好的例子,让我再次尝试解释一下情况:
1) 我在 master
中有一些代码在 branch
.
中不存在
2) 我在 branch
中有一些代码在 master
中不存在。
我应该如何处理这个问题而不丢失 master 和 branch 中的不同代码?如果这不能以某种干净、良好的计划方式发生,我是否可以至少强迫 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会告诉你有冲突,不会自动合并这些文件。
This 可能会帮助您理解这个概念。基本上,因为自 branch
创建以来 master
根本没有改变,git 可以假设您所做的任何更改都是有意的。
合并分支意味着您想要add
分支建议的changes
。您可以 NOT 有选择地合并一个分支。它被合并为一个整体。
要查看差异是什么 b/w 两个分支在合并前进行审查,运行
git diff master my_branch
如果您觉得 my_branch
中的代码不符合您的标准或者有错误,请不要合并它。