我需要获取2次提交之间的文件更改列表,但不包括具有给定标记的提交。
我目前正在使用此行
git diff --oneline --diff-filter=AM FIRST_TAG HEAD -- SpecificFolder
因为我只需要在FIRST_TAG和现在之间添加或修改(在SpecificFolder目录内)的文件的名称
现在,我需要在此比较中排除标记为EXCLUDE_TAG / *的提交。 这是由git diff支持的吗?或者我应该做几个步骤,如
答案 0 :(得分:1)
您将需要您的多步骤流程或类似的东西。
"排除某些提交"是一个短语,在Git中 - 特别是应用于差异 - 没有多大意义。这就像说'#34;我想在那边,但不包括我的左臂。" : - )
从根本上说,这里的问题是:
git diff
比较了两个这样的快照
(使用"索引"和"工作树"基本上充当临时快照,而不是提交,这是永久和不变的快照)。
一旦得到比较结果,您可以通过各种方式减少它,例如使用--diff-filter
限制它,仅使用--name-only
打印文件名(我猜你的意思是代替{ {1}}此处,和/或仅查看--oneline
中的更改,但我们始终从两个特定快照开始。
同时,标记名称仅指定长链提交中的一些提交,例如:
SpecificFolder
这里,每轮 tag:v1.0
|
v
...--o--o--o <-- master
\
o--o--o <-- develop
^
|
tag:v1.1-rc1
节点代表一个提交。在o
上提交的最新提交或提示提交是您在运行master
时复制以进行工作的提交。 相同的提交 - 相同的快照 - 由标记git checkout master
命名,但是一旦您在v1.0
上进行新提交,标记就会保留它在哪里,分支名称向前移动以适应新的提交:
master
类似地,标记 tag:v1.0
|
v
...--o--o--o--o <-- master
\
o--o--o <-- develop
^
|
tag:v1.1-rc1
标识一个特定的提交,当前一个提交&#34;后面&#34; v1.1-rc1
的提示。
您可以运行develop
来比较两个特定的标记提交。这个完全忽略了每个其他提交:它只提取两个快照并进行比较。
因为在这种情况下,您只是寻找添加或修改过的文件,所以一次进行一次提交是有道理的:
git diff v1.0 v1.1-rc1
您现在可以运行 tag:EXCLUDE_TAG/2
|
v
o--o <-- feature
/
...--o--A--*--o <-- master
\
\ *--*
\ / \
*--* *--*--* <-- develop (HEAD)
\ /
*--*
^
|
tag:EXCLUDE_TAG/1
,其中git rev-list --ancestry-path A..HEAD
是一个定位提交A
的标识符,当前提交是分支A
的提示提交,这是目前的分支。这将打印出每个已加星标的提交的哈希ID(请注意,develop
的ID本身将不进行打印)。
从此列表中,您可以删除完全一个已加星标的提交的哈希ID,因为它的名称为A
。您可以使用EXCLUDE_TAG/1
找到这些内容。 (尝试没有选项,然后添加git for-each-ref 'refs/tags/EXCLUDE_TAG/*'
指令将其输出限制为你真正想要的。如果你有注释和轻量级标签的混合,请记住你可能必须&#34;剥离&#34;其中一些用于查找目标提交。--format
将对注释标记执行此操作,但不为轻量级标记生成输出。)请注意,此示例中的某些类似%(*objectname)
可能不在原始标记中提交哈希列表。
您现在拥有所有未排除的提交哈希值的列表。因此,您可以将任何一个提交与任何其他提交进行比较,例如将每个提交与其直接父提交进行比较,以查看在该提交中发生了哪些更改。但是这个策略存在一个缺陷:你将如何处理 merge 提交?在上图中,有一个合并提交,在EXCLUDE_TAG/2
的提示后面三步。它可能与其父提交中的任何一个或两者不同 - 事实上,如果它是邪恶合并,它将包含不在中的更改父(这是邪恶合并的定义:见Evil merges in git?)。你必须自己决定如何处理这类案件。