Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
合并时git如何解析?_Git_Merge - Fatal编程技术网

合并时git如何解析?

合并时git如何解析?,git,merge,Git,Merge,也许这是个愚蠢的问题。但是当我开始使用Git时,有人告诉我,在处理一个特性分支时,在合并到master之前,我必须合并从master到我的分支的所有内容。现在,我可以从测试的角度来理解。在将代码合并到主代码之前,为了知道我的代码一切都正常工作,我应该首先在我的分支中进行测试,因此我必须从主代码合并到我的分支。 在我当前的项目中,我们有另一个工作流。我有一个功能分支,然后master充当一个暂存分支,然后我们有另一个生产分支。顺便说一句,工作流程不错 但这迫使我开始思考如何在git中进行分支和合并

也许这是个愚蠢的问题。但是当我开始使用Git时,有人告诉我,在处理一个特性分支时,在合并到master之前,我必须合并从master到我的分支的所有内容。现在,我可以从测试的角度来理解。在将代码合并到主代码之前,为了知道我的代码一切都正常工作,我应该首先在我的分支中进行测试,因此我必须从主代码合并到我的分支。 在我当前的项目中,我们有另一个工作流。我有一个功能分支,然后master充当一个暂存分支,然后我们有另一个生产分支。顺便说一句,工作流程不错

但这迫使我开始思考如何在git中进行分支和合并。如果开发人员D1创建一个分支a,开发人员D2随后创建一个分支B。开发人员D1执行一些工作并将分支a合并到主分支。现在D2将他的分支B合并到master。只有D2实际更改的文件才会合并到master,还是git会尝试合并D2创建分支时存在的所有文件,甚至是那些未更改的文件?D2在尝试合并之前是否应该从主分支合并到分支B,或者这无关紧要


我的猜测是git只合并更改的文件,但我不是100%确定:)

合并合并两个开发行的更改。因此,除非您告诉Git,否则它不会用
B
覆盖
master
,但它会将在
master
B
上所做的更改合并为
master
已合并成
A
,这些更改
master

上进行,合并合并了两条开发线的更改。因此,除非您告诉Git,否则它不会用
B
覆盖
master
,但它会将在
master
B
上所做的更改合并为
master
已合并成
A
,这些更改
master

上进行,git中的合并操作始终作用于整个存储库,没有基于文件的合并

这就是说,它是一个每个文件的3路合并(和往常一样)。这意味着,如果将功能分支
A
合并到
master

  • git将在
    A
    master
    之间找到最年轻的公共提交;让我们称之为
    oldmaster
  • git将找到
    oldmaster
    A
    之间的差异,并尝试将这些差异(补丁)应用到当前
    master
    ;一个个文件。如果某个文件没有差异,它当然不会对该文件做任何操作
  • 最后,您得到一个(合并)提交;所有不同文件的所有补丁将作为一个提交;此提交将同时具有
    A
    master
    作为父级
具体回答您的问题:

只有D2实际更改的文件才会合并到主文件

或者git会尝试合并D2创建其分支时存在的每个文件,即使是未更改的文件

是的,也是。git将“尝试”它们,但发现没有任何更改,因此这是不可行的

D2在尝试合并之前是否应该从主分支合并到分支B,或者这无关紧要

这取决于您的工作流程(您实际使用master做了什么),但通常不会,没有技术理由“根据默认值”这样做。git不是svn,它可以进行任何类型的合并;没有(就像在“旧时代”一样,有一些限制,比如在svn中,所有“重新整合”的东西使合并变得复杂)

我猜git只合并更改过的文件,但我不是100%确定:)


这就是“合并”的意思。合并并不意味着将所有内容从A复制到B,而是看看在这两者之间发生了什么变化,与公共父级C有关。

git中的合并操作始终作用于整个存储库,没有基于文件的合并

这就是说,它是一个每个文件的3路合并(和往常一样)。这意味着,如果将功能分支
A
合并到
master

  • git将在
    A
    master
    之间找到最年轻的公共提交;让我们称之为
    oldmaster
  • git将找到
    oldmaster
    A
    之间的差异,并尝试将这些差异(补丁)应用到当前
    master
    ;一个个文件。如果某个文件没有差异,它当然不会对该文件做任何操作
  • 最后,您得到一个(合并)提交;所有不同文件的所有补丁将作为一个提交;此提交将同时具有
    A
    master
    作为父级
具体回答您的问题:

只有D2实际更改的文件才会合并到主文件

或者git会尝试合并D2创建其分支时存在的每个文件,即使是未更改的文件

是的,也是。git将“尝试”它们,但发现没有任何更改,因此这是不可行的

D2在尝试合并之前是否应该从主分支合并到分支B,或者这无关紧要

这取决于您的工作流程(您实际使用master做了什么),但通常不会,没有技术理由“根据默认值”这样做。git不是svn,它可以进行任何类型的合并;没有(就像在“旧时代”一样,有一些限制,比如在svn中,所有“重新整合”的东西使合并变得复杂)

我猜git只合并更改过的文件,但我不是100%确定:)


这就是“合并”的意思。“合并”并不意味着将所有内容从A复制到B,而是要查看在这两者之间发生了什么变化,与公共父级C有关。

查看此问题的答案:查看此问题的答案: