为什么git cherry-pick冲突包括先前提交的更改

问题描述 投票:1回答:1

我有一个临时分支,我为一个功能做了一些提交,我需要从主分支进行这些提交。我尝试使用git checkout -b branch_name从master分支检出分支,然后使用git cherry-pick hash从分段分支中选择我想要的第一个提交。出于某种原因,与樱桃选择发生了冲突,但是冲突包括从之前提交的更改到樱桃挑选,这是为什么?

git cherry-pick
1个回答
8
投票

TL; DR您看到的内容与Git如何记录和存储文件历史记录与其他VCS相比直接相关。

The Basics

掌握它的最简单方法是考虑修订(或版本)的概念。

传统上,版本控制系统通过存储文件现在如何以及它们在先前版本中的方式(这也称为delta或Δ)之间的差异来记录工作目录中文件的修订版。

另一方面,Git通过存储工作目录中所有文件的快照来记录修订版。

使用an image书中使用的Pro Git可以很好地说明这一点:

enter image description here

在这里,您可以看到传统VCS如何仅在修订版之间存储每个文件中的差异。

在Git中,它看起来更像是这样(再次from the Pro Git book):

enter image description here

您会看到每个修订都与工作目录中所有文件的快照相关联。但是,the documentation说:

为了提高效率,如果文件没有改变,Git不会再次存储文件 - 只是指向它已存储的先前相同文件的链接。

但是,从概念上讲,您仍然可以将每个提交视为指向整个工作目录的快照。

Cherry-picking

现在,考虑当你挑选提交时会发生什么。假设我们想要挑选与Version 5相对应的提交:

git cherry-pick <version-5>

Git将mergeHEAD引用的提交相关联的快照(即工作目录中的文件)与version-5相关联的快照。

现在,如果version-4修改了file B中的一行(导致file B1),其方式与file B在工作目录中的外观相冲突,那么您将会遇到冲突。这是重要的部分:

即使version-5(你挑选的那个)以不与任何东西冲突的方式修改相同的file B,冲突也会发生。

这是因为与version-5关联的快照包含file B2,这是file B在之前版本中经历的所有修改的结果。

© www.soinside.com 2019 - 2024. All rights reserved.