`git for-each-ref` 中的 `--contains` 选项有什么作用?
What Does `--contains` Option Do in `git for-each-ref`?
--contains
选项在 git for-each-ref
中有什么作用?
如果它的 revlist 在命令行上的 --contains
选项之后指定了提交,它是否只是 return 一个引用? (例如 git for-each-ref refs/heads --contains feature/test
只有 return 那些在他们的 revlist 中包含提交 feature/test
的头部?(即它们与第一个提交之间的提交列表,即 git rev-list <ref>
)) ?
Git 文档(v. 2.31.1;参见 here) are actually outdated: the Notes
section at the bottom states you can use the --merged
and --no-merged
options together, but this was made incompatible with this commit。
文档中提供的定义含糊不清:它重复使用了“包含”一词,但没有阐明其含义。引用是仅指向一个 SHA 的名称。 “包含”的想法表明引用是指多次提交,这仅在其 git rev-list
.
的上下文中才有意义
一个提交可以在另一个提交之后或之前(简单地通过提交时间),但是如果从该提交无法到达它(即如果提交没有合并到它的分支),那么提交不知道它,所以不能说“包含”它。
这就是为什么 --merged
和 --no-merged
在一起是有意义的:它将 return 可以从 --merged
和 [=81=(至少其中之一)访问的提交] --no-merged
.
“包含”是什么意思?...“有直接父级 X”? “有祖先X”? “有表哥 X”?
更新:
看来我使用的是 Git 的旧版本。同时使用 --merged
和 --no-merged
在 v2.28.1 中不兼容,但现在在 v2.31.1 中兼容。因此,Git 文档并没有过时。
似乎 this commit 是在 2017 年 3 月 21 日制作的,比 v2.31.1 早得多(不确定它到底是用哪个版本提交的)。
其次,@LeGEC 的回答似乎是有道理的(相对于 --contains
/--no-contains
意思是“给我在 之后提交的引用 " 和 --merged
/--no-merged
的意思是 "给我在他们 之前有这个提交的引用 "。
不过,如果 Git 文档能够得到进一步澄清,那就太好了。在他们所做的定义中使用这个词非常模糊。
因为 Git 是一个有向无环图 (DAG),提交指向一个方向上的链表形式的其他提交:在时间上倒退到他们的祖先。因此,名称 --merged
/--no-merged
及其在“可达性”方面的描述是有道理的。
“包含”是指“在 和可达 之后”(即子级),还是简单地“在”之后(即及时提交)?
由于这是一个管道命令(在自定义脚本中使用),我需要确切地知道它的作用以及它是如何工作的,这样我的脚本就不会产生任何意外的副作用。
也许我误解了你的问题,如果相关请更新你的问题。
documentation 给出了这些选项的正确(但可能是简洁?)描述,
这是一种不同的表达方式:
--merged develop
表示“在 develop
之前”
--no-merged master
表示“不在 master
之前”
--contains feature1
表示“在 feature1
之后”
--no-contains feature2
表示“不在 feature2
之后”
这4个选项实际上是兼容的:
git for-each-ref --merged develop --no-merged master --contains feature1 --no-contains feature2
将列出以下引用:
- 已合并到
develop
,但尚未合并到 master
,
- 包含
feature1
(例如:feature1
以某种方式合并到它们中),但不包含 feature2
[更新] 一个 ref 指向一个 commit,一个 commit 有指向它的 parents 的指针。通过这种关系,git 中的提交形成了一个图形(实际上是一个 DAG)。
“merged in”(或者我错误的“comes before”)意思是“是……的祖先”,“包含”(或者我错误的“comes after”)意思是“是……的后代”。
你提到git rev-list
:如果git rev-list commitB
列出commitA
的sha,那么你可以说:
commitB
包含 commitA
commitA
合并到 commitB
--contains
选项在 git for-each-ref
中有什么作用?
如果它的 revlist 在命令行上的 --contains
选项之后指定了提交,它是否只是 return 一个引用? (例如 git for-each-ref refs/heads --contains feature/test
只有 return 那些在他们的 revlist 中包含提交 feature/test
的头部?(即它们与第一个提交之间的提交列表,即 git rev-list <ref>
)) ?
Git 文档(v. 2.31.1;参见 here) are actually outdated: the Notes
section at the bottom states you can use the --merged
and --no-merged
options together, but this was made incompatible with this commit。
文档中提供的定义含糊不清:它重复使用了“包含”一词,但没有阐明其含义。引用是仅指向一个 SHA 的名称。 “包含”的想法表明引用是指多次提交,这仅在其 git rev-list
.
一个提交可以在另一个提交之后或之前(简单地通过提交时间),但是如果从该提交无法到达它(即如果提交没有合并到它的分支),那么提交不知道它,所以不能说“包含”它。
这就是为什么 --merged
和 --no-merged
在一起是有意义的:它将 return 可以从 --merged
和 [=81=(至少其中之一)访问的提交] --no-merged
.
“包含”是什么意思?...“有直接父级 X”? “有祖先X”? “有表哥 X”?
更新:
看来我使用的是 Git 的旧版本。同时使用 --merged
和 --no-merged
在 v2.28.1 中不兼容,但现在在 v2.31.1 中兼容。因此,Git 文档并没有过时。
似乎 this commit 是在 2017 年 3 月 21 日制作的,比 v2.31.1 早得多(不确定它到底是用哪个版本提交的)。
其次,@LeGEC 的回答似乎是有道理的(相对于 --contains
/--no-contains
意思是“给我在 之后提交的引用 " 和 --merged
/--no-merged
的意思是 "给我在他们 之前有这个提交的引用 "。
不过,如果 Git 文档能够得到进一步澄清,那就太好了。在他们所做的定义中使用这个词非常模糊。
因为 Git 是一个有向无环图 (DAG),提交指向一个方向上的链表形式的其他提交:在时间上倒退到他们的祖先。因此,名称 --merged
/--no-merged
及其在“可达性”方面的描述是有道理的。
“包含”是指“在 和可达 之后”(即子级),还是简单地“在”之后(即及时提交)?
由于这是一个管道命令(在自定义脚本中使用),我需要确切地知道它的作用以及它是如何工作的,这样我的脚本就不会产生任何意外的副作用。
也许我误解了你的问题,如果相关请更新你的问题。
documentation 给出了这些选项的正确(但可能是简洁?)描述,
这是一种不同的表达方式:
--merged develop
表示“在develop
之前”--no-merged master
表示“不在master
之前”--contains feature1
表示“在feature1
之后”--no-contains feature2
表示“不在feature2
之后”
这4个选项实际上是兼容的:
git for-each-ref --merged develop --no-merged master --contains feature1 --no-contains feature2
将列出以下引用:
- 已合并到
develop
,但尚未合并到master
, - 包含
feature1
(例如:feature1
以某种方式合并到它们中),但不包含feature2
[更新] 一个 ref 指向一个 commit,一个 commit 有指向它的 parents 的指针。通过这种关系,git 中的提交形成了一个图形(实际上是一个 DAG)。
“merged in”(或者我错误的“comes before”)意思是“是……的祖先”,“包含”(或者我错误的“comes after”)意思是“是……的后代”。
你提到git rev-list
:如果git rev-list commitB
列出commitA
的sha,那么你可以说:
commitB
包含commitA
commitA
合并到commitB