2

我是新手,git我发现很难理解所有内容都围绕快照/提交而不是单个文件的事实。
所以假设我的存储库中有一个树,如下所示。

C4 (HEAD,Master,Origin/Master)  
*  
C3  
*  
C2  
*  
C1  

现在我从这里分支出来:

B1 (HEAD, testBranch)  
*  
C4 (HEAD,Master,Origin/Master)  
*  
C3  
*  
C2  
*  
C1  

在我的testBranch我只修改了整个存储库的 2 个文件。只是 2.远程存储库中
的开发master仍在继续,所以最终我们有以下树:

                    C8(Master,Origin/Master)   
                    *   
B3(testBranch)    C7   
  *              *   
  B2           C6  
    *         *
     B1    C5   
       *  
       C4  
       *  
       C3  
       *  
       C2  
       *  
       C1  

现在我已经完成了分支的工作,并想合并到 master。但主人已经走得更远了。但是latest of和latest of
之间的唯一区别是我在 fork 分支时最初开始处理的 2 个文件的更改。但由于发生了其他修改,因此也“不会落后”分支。 那么如果我合并到会发生什么? 会发现合并的唯一更改是我最初处理的 2 个文件吗? 我会遇到冲突吗?我不应该进行合并而是进行变基吗?为什么?B3testBranchC8mastertestBranchmaster
testBranchmaster
git

4

1 回答 1

2

我发现很难理解所有内容都围绕快照/提交而不是单个文件的事实。

你以前用过 ClearCase 吗?
如果是,请参阅此问题,了解以文件为中心的 VCS(此处为CVCS)和DVCS(如 git)(我在此处介绍)之间的区别。

那么如果我合并testBranch到会发生什么master?git 会发现合并的唯一更改是我最初处理的 2 个文件吗?

是的

但是 git 如何“理解”分支中的不同代码已被 master 中的代码废弃?由于时间戳?

由于每个提交都知道其父: ,这允许在(合并到):之间找到共同的祖先提交。B3C8C4

合并操作知道从那时起发生了什么C4:只有 2 个文件,并且它只会将那些合并到master.

另请参阅“是什么让 DVCS 中的合并变得容易? ”。

合并操作知道从那时起发生了什么C4:只有 2 个文件,并且它只会将那些合并到master.

B1-C5 B2-C6不一样。
例如,C5其中存在B1的功能B2可能已被删除。
我不确定我是否理解它是如何解决这个问题的,它不会“重新包含”该功能

它确实会发现并且不会重新引入该功能,因为:

  • 该功能存在于C4(共同祖先)
  • 该函数存在于B2(因此合并的源分支上没有更改)
  • 该函数不再存在master(但它是一个更改,这里是一个删除,这会影响合并的目标分支)

合并是关于报告和合并从源分支到目标分支的修改。
您指的是仅在目标分支中进行的修改,而与共同祖先相比,源分支没有进化:

  • 合并将忽略该函数,testBranch因为没有要报告的修改。
  • 删除的函数master将被合并删除,因为合并忽略了所说的函数testBranch(因为我在前一点提到的原因:自共同祖先以来没有修改)

我会遇到冲突吗?

如果这两个文件在 master 中也发生了更改(并且如果这些更改发生在公共行上),您可能会发生冲突

我不应该进行合并而是进行变基吗?为什么?

如果你没有推送 yes testBranch,rebase 会更好,并且有其他提交要做(但希望基于最新版本来做master

于 2013-06-17T19:45:53.980 回答