我正在读这篇关于樱桃采摘的文章,那里有如下图:
但是,这张照片似乎对我有误导性.从我的简单测试来看,似乎不仅仅是区别,而是整合了整个文件内容.这是实验:我有这个提交图:
A--B \ C
Commit A
有这样的内容file.txt
:
l1 l2 l3
提交B
有一点变化:
l1 l2-new l3
提交C
有一点变化:
l1 l2 l3-new
所以现在我正在尝试使用cherry-pick 重放提交B
提交C
,
git cherry-pick B
我发生了冲突,
<<<<<<>>>>>> C
如果仅应用更改,则不应存在.因为我l2
在C
提交中没有触及行,所以应该顺利应用.我对吗?
Git
存储文件,但它在很多地方生成并使用差异.
A diff
记录提交前后受影响行的状态; 它还存储修改区域之前和之后的一行文本.Git
使用此信息可以避免数据丢失和不一致.
假设我们创建了分支命名A
,B
并且C
在您的描述中具有这些名称的提交中.
$ git diff A B -- file.txt diff --git a/file.txt b/file.txt index f0f2307..0acba21 100644 --- a/file.txt +++ b/file.txt @@ -1,3 +1,3 @@ l1 -l2 +l2-new l3
我要求在提交和提交之间Git
显示文件的更改.file.txt
A
B
格式是uniffied diff格式的变体,它在维基百科页面上有关于diff utility
.
简单来说,这diff
就是说:将文件的第2行更改为l2
,l2-new
但仅限于第1 l1
行和第3行l3
.即使只更改了文件的第2行,Git
也包括文件中的第1行和第3行diff
.它们是第2行发生的变化的背景.
备注:在这种情况下,文件很小,1-3行代表整个文件.Git
不使用整个文件,它只保护在更改前用1行更改的任何行块和更改后的1行.例如,如果文件有20行,我们改变第12和13行,则diff
包含第11-14行.
回到我们的diff
提交C
文件的样子:
l1 l2 l3-new
但为了应用它diff
,Git
期望它看起来像:
l1 l2 l3
由于其期望得不到满足,Git
无法diff
安全应用并决定这是一个冲突.
Git
需要上下文行?让我们说在提交时C
我们删除了第二行.该文件将如下所示:
l1 l3
然后我们挑选提交B
,并应用它引入的更改(将第2行更改l2
为l2-new
),而不验证上下文.该文件现在看起来像:
l1 l2-new
等一会!在哪里l3
?
我没有l3
在提交时删除该行C
,我也没有在提交时触及它B
.在不检查上下文的情况下应用diff可能会导致数据丢失. Git
在应用diff时总是检查上下文,我想所有使用diffs的程序都是一样的.