我是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
最新testBranch
和C8
最新master
之间的唯一区别是我最初开始处理的2个文件中的更改科。但另外testBranch
是"以免"自从发生其他修改以来master
分支
那么如果我将testBranch
合并到master
会发生什么?
git
会发现合并的唯一变化是我最初处理的2个文件吗?
我会遇到冲突吗?我不应该合并,而是退缩吗?为什么呢?
答案 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-C6
和C5
中存在的B1
中的函数可能已被删除 我不确定我是否理解如何解决这个问题并且它不会“重新包含”函数
它确实找出并且不重新引入该功能,因为:
B2
(共同祖先)C4
中(因此合并的源分支上没有变化)B2
中不再存在该功能(但这是一个更改,此处删除,影响合并的目标分支)合并是关于报告和合并从源分支到目标分支的修改 您指的是目标分支中的修改,而源分支与共同祖先相比尚未进化:
master
中的函数,因为无需修改报告。testBranch
中已删除的函数,因为合并会忽略master
中的所述函数(因为我之前提到过的原因:自共同祖先以来没有修改)我会遇到冲突吗?
如果这两个文件在master中也发生了变化(如果这些更改发生在公共行上),则可能会发生冲突
我不应该合并而是退缩吗?为什么呢?
如果您没有推送yes testBranch
并且还有其他提交要做(但希望根据testBranch
的最新版本执行它们,那么rebase会更好)