git能否知道要合并的分支有过时的变化?

时间:2013-06-17 19:39:34

标签: git version-control git-branch git-merge git-rebase

我是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。但是主人已经走得更远了 但B3最新testBranchC8最新master之间的唯一区别是我最初开始处理的2个文件中的更改科。但另外testBranch是"以免"自从发生其他修改以来master分支 那么如果我将testBranch合并到master会发生什么? git会发现合并的唯一变化是我最初处理的2个文件吗? 我会遇到冲突吗?我不应该合并,而是退缩吗?为什么呢?

1 个答案:

答案 0 :(得分:2)

  

我发现很难围绕这样一个事实:一切都在快照/提交而不是单个文件。

您之前使用过ClearCase吗? 如果是,请参阅this question,了解以文件为中心的VCS(此处为CVCS)与DVCS之间的差异,如git(that I introduce here)。

  

那么如果我将testBranch合并到master会怎样?   请问git会发现合并的唯一变化是我最初处理的2个文件吗?

  

但git如何“理解”分支中的不同代码已经被master中的代码淘汰了?由于时间戳?

由于每个提交都知道其父:允许在B3(合并到){{1}之间找到共同祖先提交}:C8

合并操作知道自C4以来发展了什么:只有2个文件,它只会合并到C4

另请参阅“What makes merging in DVCS easy?”。

  
    

合并操作知道自master以来发展了什么:只有2个文件,它只会合并到C4

  
     

master B1-C5不同   例如。 B2-C6C5中存在的B1中的函数可能已被删除   我不确定我是否理解如何解决这个问题并且它不会“重新包含”函数

它确实找出并且重新引入该功能,因为:

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

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

  • 合并将忽略master中的函数,因为无需修改报告。
  • 合并中将删除testBranch中已删除的函数,因为合并会忽略master中的所述函数(因为我之前提到过的原因:自共同祖先以来没有修改)
  

我会遇到冲突吗?

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

  

我不应该合并而是退缩吗?为什么呢?

如果您没有推送yes testBranch并且还有其他提交要做(但希望根据testBranch的最新版本执行它们,那么rebase会更好)