我有一个临时分支,我为一个功能做了一些提交,我需要从主分支进行这些提交。我尝试使用git checkout -b branch_name
从master分支检出分支,然后使用git cherry-pick hash
从分段分支中选择我想要的第一个提交。出于某种原因,与樱桃选择发生了冲突,但是冲突包括从之前提交的更改到樱桃挑选,这是为什么?
TL; DR您看到的内容与Git如何记录和存储文件历史记录与其他VCS相比直接相关。
掌握它的最简单方法是考虑修订(或版本)的概念。
传统上,版本控制系统通过存储文件现在如何以及它们在先前版本中的方式(这也称为delta或Δ)之间的差异来记录工作目录中文件的修订版。
另一方面,Git通过存储工作目录中所有文件的快照来记录修订版。
使用an image书中使用的Pro Git可以很好地说明这一点:
在这里,您可以看到传统VCS如何仅在修订版之间存储每个文件中的差异。
在Git中,它看起来更像是这样(再次from the Pro Git book):
您会看到每个修订都与工作目录中所有文件的快照相关联。但是,the documentation说:
为了提高效率,如果文件没有改变,Git不会再次存储文件 - 只是指向它已存储的先前相同文件的链接。
但是,从概念上讲,您仍然可以将每个提交视为指向整个工作目录的快照。
现在,考虑当你挑选提交时会发生什么。假设我们想要挑选与Version 5
相对应的提交:
git cherry-pick <version-5>
Git将merge
与HEAD
引用的提交相关联的快照(即工作目录中的文件)与version-5
相关联的快照。
现在,如果version-4
修改了file B
中的一行(导致file B1
),其方式与file B
在工作目录中的外观相冲突,那么您将会遇到冲突。这是重要的部分:
即使
version-5
(你挑选的那个)以不与任何东西冲突的方式修改相同的file B
,冲突也会发生。
这是因为与version-5
关联的快照包含file B2
,这是file B
在之前版本中经历的所有修改的结果。