【问题标题】:Can git figure out that the branch to be merged has obsolete changes?git 可以找出要合并的分支有过时的更改吗?
【发布时间】:2013-06-13 20:58:51
【问题描述】:

我是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 之间的唯一区别是我在fork 分支时最初开始处理的2 个文件的更改。但另外testBranch 是“避免落后于”master 分支,因为发生了其他修改。
那么如果我将testBranch 合并到master 会发生什么?
git 会发现合并的唯一更改是我最初处理的 2 个文件吗?
我会遇到冲突吗?我不应该进行合并而是进行变基吗?为什么?

【问题讨论】:

  • 尝试其中一个 git-branching tutorials。这些是网络上resources 很好地涵盖的一些基本问题。

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


【解决方案1】:

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

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

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

是的

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

由于每个提交都知道其父项:这允许在B3(合并到)C8:@987654332 之间找到一个共同祖先提交@。

合并操作知道自 C4 以来发生了什么变化:只有 2 个文件,它只会将那些文件合并到 master

另见“What makes merging in DVCS easy?”。

合并操作知道自 C4 以来发生了什么变化:只有 2 个文件,它只会将那些文件合并到 master

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

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

  • 该函数存在于C4(共同祖先)中
  • 该函数存在于B2 中(因此在合并的源分支上没有更改)
  • 那个函数在master中已经不存在了(但是这里是一个变化,一个删除,影响了合并的destination分支)

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

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

我会遇到冲突吗?

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

我不应该做一个合并而是一个变基吗?为什么?

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

【讨论】:

  • 但是git 如何“理解”分支中的不同代码已被master 中的代码废弃?由于时间戳? (顺便说一句,非常感谢你帮助我)
  • @Cratylus 我已经(再次)编辑了答案,以便添加指向其他关于 git 的有趣答案的链接。
  • The merge operation know what has evolved since C4: only 2 files, and it will merge only those to master.B1-C5 B2-C6 不同。例如。 C5 中存在于 B1B2 中的函数可能已被删除。我不确定我是否理解它是如何解决这个问题的,它不会“重新包含”该函数
  • @Cratylus 我已经编辑了答案(ter)以解决您之前的评论。
  • @Cratylus 我“拥有” ClearCase:stackoverflow.com/tags/clearcase/topusers(还有 git;)stackoverflow.com/tags/git/topusers
猜你喜欢
  • 2012-06-20
  • 1970-01-01
  • 2018-01-17
  • 2015-02-19
  • 2017-04-25
  • 2021-04-12
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
相关资源
最近更新 更多