git diff --check显示不相关的分支/文件的更改

时间:2018-07-31 17:26:33

标签: git whitespace git-diff git-log

背景

我正在尝试查看当前分支的空白错误(忽略 CR 在eol)。大多数文件使用 CRLF ,而我没有 core.whitespace 配置集。

这是原始命令:

git -c core.whitespace=trailing-space,cr-at-eol diff --check master..HEAD

HEAD 是指在 master 的较旧版本之上创建的分支 (“ 旧主”)。

问题在于git diff --check的行为方式异常: 不仅显示 master..HEAD 中的错误,还显示 oldmaster..master

问题

  • 是因为git diff --check比较了整个快照 给定的修订范围?

  • 在这种情况下,git loggit diff的行为为何不同?

  • 不应git diff --check仅比较已更改的行和已更改的行。 文件?

信息

master oldmaster (数字是巧合的):

$ git log --oneline oldmaster..master | wc -l
115

$ git diff --name-only oldmaster..master | wc -l
115

这正确显示了相关的提交:

$ git log --oneline master..HEAD | wc -l
4

这显示了正确的文件:

$ git log --oneline --name-only master..HEAD -- | grep -E '^[a-zA-Z]+/' \
  | sort -u | wc -l
4

由于某些原因,这些文件还包括在 oldmaster..master 中更改的文件:

$ git diff --name-only master..HEAD -- | wc -l
119

$ git -c core.whitespace=trailing-space,cr-at-eol diff --name-only \
  master..HEAD -- | wc -l
119

这两个文件还显示不相关的文件:

$ git diff --check master..HEAD -- | grep -E '^[a-zA-Z]+/' | cut -d : -f 1 \
  | sort -u | wc -l
30

$ git -c core.whitespace=trailing-space,cr-at-eol diff --check master..HEAD \
  -- | grep -E '^[a-zA-Z]+/' | cut -d : -f 1 | sort -u | wc -l
9

1 个答案:

答案 0 :(得分:2)

除了组合的差异(此处未使用)之外,CameraCharacteristics c = cameraManager.getCameraCharacteristics(cameraId); Rect activeArray = c.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE); int cropWidth = activeArray.width() / mZoomLevel; int cropHeight = activeArray.height() / mZoomLevel; int cropLeft = (activeArray.width() - cropWidth) / 2; int cropTop = (activeArray.height() - cropHeight) / 2; Rect cropRegion = new Rect(cropLeft, cropTop, cropLeft + cropWidth, cropTop + cropHeight) captureBuilder.set(CaptureRequest.SCALER_CROP_REGION, cropRegion); 严格比较两个快照 1 使用的语法-git diff vs git diff A B-在这里无关紧要。 Git提取快照A,提取快照B,然后比较这两个快照。您使用的所有标志选项(例如git diff A..B)都将应用于此特定比较。提交--check不必是A的祖先,反之亦然; Git不会查看这两个提交之间的任何提交;它只提取B,然后提取A,然后对它们进行比较。 2

B命令的作用非常不同:它遍历修订图。给定git log,Git会发现所有无法从 git log A..B到达的可从 B提交的提交。有关可达性的明确定义,请参见Think Like (a) Git

请注意,在将A-p一起使用时,以补丁的形式查看提交时,git log会将每个提交与其父(单个)进行比较。例如,如果在git log范围内有三个提交,则A..B首先显示git log -p A..B并运行B,然后显示git diff B^ B并运行{{1} },最后显示B^并运行git diff B^^ B^。 (这假设该范围内没有合并提交,但是默认情况下B^^会默认删除合并提交的补丁。)


1 要查看组合的差异,请在合并提交上使用git diff B^^^ B^^git log命令还会产生带有某些特定参数的组合差异,有时可能会产生错误:特别是三个点语法git show旨在比较{ {1}}和git diff提交git diff A...B,但有时会有所不同。另外,当您使用索引并且索引包含有冲突的合并时,纯A将产生组合的差异。

2 从技术上讲,它甚至不必提取两个快照,而只是直接从它们的树对象中工作。为了计算差异,它确实必须提取不同的斑点。对于相同的Blob,B知道它们是相同的,因为它们的哈希ID匹配。但是将其推断为“提取和比较”比较容易。