我正在阅读有关采摘樱桃的this article,其中有以下图片:
然而,这张照片似乎误导了我。从我的简单测试来看,似乎不仅仅是差异,而是整合了整个文件内容。这是实验: 我有这个提交图:
A--B
\
C
提交A
在file.txt
中包含此内容:
l1
l2
l3
提交B
变化很小:
l1
l2-new
l3
提交C
变化很小:
l1
l2
l3-new
所以现在我正在尝试使用cherry-pick重播提交B
上的提交C
,
git cherry-pick B
我发生了冲突,
<<<<<<< HEAD
l2
l3-new
=======
l2-3
l3
>>>>>>> C
如果仅应用更改,则不应该存在。由于我在l2
提交中未触及C
行,因此应该应用顺利。我是对的吗?
答案 0 :(得分:5)
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行是{{ 1}}。即使只更改了文件的第2行,l3
也包含Git
中文件的第1行和第3行。它们是第2行发生的变化的背景。
备注:在这种情况下,文件较小,第1-3行代表整个文件。 diff
不使用整个文件,它只保护在更改前1行更改的任何行块和更改后的1行。例如,如果文件有20行,我们更改第12行和第13行,Git
包含第11-14行。
返回我们的diff
,在提交diff
上的文件如下:
C
但是为了应用l1
l2
l3-new
,diff
期望它看起来像:
Git
由于未满足其期望,l1
l2
l3
无法安全地应用Git
并确定这是冲突。
diff
需要上下文行?让我们在提交Git
时说我们删除了第二行。该文件将如下所示:
C
然后我们挑选提交l1
l3
,并应用它引入的更改(将第2行从B
更改为l2
),而不验证上下文 。该文件现在看起来像:
l2-new
等一下! l1
l2-new
在哪里?
我没有删除提交l3
上的行l3
,也没有在提交C
上触摸它。 在不检查上下文的情况下应用diff会导致数据丢失。 B
总是在应用diff时检查上下文,我想所有使用diffs的程序都会这样做。< / p>
答案 1 :(得分:2)
您最终会遇到冲突,因为这些更改太靠近了(它的行号条款)。上下文(通常是围绕实际差异块的3行)需要匹配,否则Git(和其他版本控制系统)会将更改标记为冲突。由于您的示例中的部分上下文已更改,因此将其标记为冲突。
答案 2 :(得分:0)
Git存储文件,而不是差异,所以mb因为行已关闭,git无法正确解析它。