我正在尝试验证序列中的每个提交,从第一个提交到当前提示。它不是真正的git bisect
,我不期待任何问题,并且提示有效。但我想确保每个提交都是自包含且正确的。
我可以使用HEAD ^从尖端返回一个,但是有一个“我从哪里前进”树木?也就是说,如果我有
o aaabbbccc (tip)
|
o abcdefabc
|
o fedcbafed
|
o abcdabcde
|
o deadbeefe (root)
我想这样做:
git checkout deadbeefe
build and test
git checkout current+1
<up two, return>
<up two, return>
但我无法弄清楚“当前+ 1”的树木。
答案 0 :(得分:4)
Git不存储父母与孩子之间的联系;只有从孩子到父母的链接。要查找提交的子项,您必须从存储库中的最少提交(分支提示,标记,HEAD等)开始,然后沿着父项链向上,直到您到达根节点或找到有问题的提交。 / p>
如果您的提交DAG是线性的,tip
是对最常见提交的引用,您可以执行以下操作来查找修订版deadbeefe
的子提交:
git rev-list deadbeefe..tip | tail -n 1
这会导致Git从tip
开始走到它到达deadbeefe
或根目录并打印出它遇到的所有提交。然后将输出传送到tail
以选择上次访问的提交,如果提交历史是线性的,则提交将是deadbeefe
的子项。
HEAD
是指当前已检出的提交,因此如果您需要当前提交的子项而不是deadbeefe
,请使用HEAD
。如果未指定,则需要提交的命令默认为HEAD
,因此您可以执行以下操作:
git rev-list ..tip | tail -n 1
同样,这只适用于DAG是线性的。如果提交历史记录不是线性的,则可以使用--ancestry-path
参数rev-list
。
每次想要移动到下一次提交时执行上述操作将是O(n ^ 2),但是Git是如此之快以至于在实践中通常无关紧要。如果你需要它是O(n),我会做以下事情:
git rev-list --reverse tip | while IFS= read -r rev; do
git checkout "${rev}" || handle_checkout_error_here
# build and test here
done
而且@ knittl是正确的 - 你想要的术语是提交,而不是树状。一些术语:
HEAD
,标签和/或分支时说出参考。