使git在不覆盖现有代码的情况下进行更改

使git在不覆盖现有代码的情况下进行更改,git,merge,rebase,Git,Merge,Rebase,分支A是主要的开发分支。 分支B包含我们需要保留的更改,但我们希望通过应用于A的错误修复来维护B 所以问题是:我们如何告诉git接受A中的更改,而不使用A的代码覆盖B中的所有内容 我们尝试了各种合并策略以及重新定基,但都没有成功。要么B被A完全覆盖,要么A根本不做任何更改。1-在A的提交历史记录中找到开始的点:“A继续” 2-将头部复位到该点 3-从该点创建新分支(我们称之为C) 4-将A的头部复位到原来的位置 5-将B合并到C中(现在C是一个基于A的“升级B”) 6-将C合并到A中1-在A的提

分支A是主要的开发分支。 分支B包含我们需要保留的更改,但我们希望通过应用于A的错误修复来维护B

所以问题是:我们如何告诉git接受A中的更改,而不使用A的代码覆盖B中的所有内容


我们尝试了各种合并策略以及重新定基,但都没有成功。要么B被A完全覆盖,要么A根本不做任何更改。

1-在A的提交历史记录中找到开始的点:“A继续”

2-将头部复位到该点

3-从该点创建新分支(我们称之为C)

4-将A的头部复位到原来的位置

5-将B合并到C中(现在C是一个基于A的“升级B”)


6-将C合并到A中

1-在A的提交历史记录中找到开始的点:“A前进”

2-将头部复位到该点

3-从该点创建新分支(我们称之为C)

4-将A的头部复位到原来的位置

5-将B合并到C中(现在C是一个基于A的“升级B”)


6-将C合并为A

以下是我从您的情况中了解到的:

             "then on"
               v
*--*--*--*--*--x--*--*--*--a <- A
    \
     -*--*--*--b <- B
  • 在分支
    B
    上创建一个合并提交,它不会更改
    B
    ,但会向git指示应该忽略
    x
    之前的所有更改
您现在可以从
B
合并
A

git merge A

只有“then on”的更改才会包括在内。

以下是我从您的情况中了解到的:

             "then on"
               v
*--*--*--*--*--x--*--*--*--a <- A
    \
     -*--*--*--b <- B
  • 在分支
    B
    上创建一个合并提交,它不会更改
    B
    ,但会向git指示应该忽略
    x
    之前的所有更改
您现在可以从
B
合并
A

git merge A

只有“then on”的更改才会被包括在内。

您所描述的理想结果,我将其重新表述为合并工作或合并更改,这就是git merge所做的。不过有一个关键的考虑因素:我们必须找出“从何时开始”的部分,因为Git不存储更改,而是存储整个快照。因此,您的问题缺少的是Git将在您的两次提交的合并基提交中找到的信息。您能否详细介绍失败的“各种合并策略”?(他们是如何失败的)?在A上重定B的位置应该可以。我喜欢LeGEC的回答,如果他正确理解了你的情况,但有一个更简单的方法可以考虑:如果你想从a修复bug,而不是从a修复特性,cherry将错误修复从A提交到B对您来说是一种更好的方法吗?您所描述的理想结果,我将重新表述为组合工作或组合更改,这就是git merge所做的。不过有一个关键的考虑因素:我们必须找出“从何时开始”的部分,因为Git不存储更改,而是存储整个快照。因此,您的问题缺少的是Git将在您的两次提交的合并基提交中找到的信息。您能否详细介绍失败的“各种合并策略”?(他们是如何失败的)?在A上重定B的位置应该可以。也合并。我喜欢LeGEC的回答,如果他正确理解了你的情况,但有一个更简单的方法可以考虑:如果你想从a中修复bug,而不是从a中修复特性,那么cherry从a中选择bug修复提交到B中对你来说是更好的方法吗?如果a中的特性永远不会合并到B中,这应该是一个好方法。但是,如果在未来的开发周期中,您希望对a和B进行全功能合并,我认为Git将永远忽略原始合并基础和“then on”之间的提交;事实上,从我的理解来看,这就是OP所要求的(尽管我的理解可能是错误的:))是的,这可能是我们的问题。最后,我们只是手动将文件树复制到一个全新的分支中。这是一个可怕的黑客围绕git,但它的工作!如果a中的功能永远不会合并到B中,那么这应该是一个好方法。但是,如果在开发周期的未来某个时候,您希望对a和B进行完整的功能合并,我认为Git将永远忽略原始合并基础和“then on”之间的提交;事实上,从我的理解来看,这就是OP所要求的(尽管我的理解可能是错误的:))是的,这可能是我们的问题。最后,我们只是手动将文件树复制到一个全新的分支中。这是一个可怕的黑客围绕git,但它的工作!