ref^指的是在ref之前的提交,那么在ref之后的提交呢?
例如,如果我签出12345,我如何签出下一次提交?
是的,Git是一个DAG节点指针结构树。我如何找到这个之后的提交?
ref^指的是在ref之前的提交,那么在ref之后的提交呢?
例如,如果我签出12345,我如何签出下一次提交?
是的,Git是一个DAG节点指针结构树。我如何找到这个之后的提交?
当前回答
我用下面的方法找到了下一个孩子:
git log --reverse --children -n1 HEAD (where 'n' is the number of children to show)
其他回答
《Hudson》(现在的Jenkins)的创造者Kohsuke Kawaguchi(2013年11月)写道: Kohsuke / git-children-of:
给定一个提交,找到该提交的直接子节点。
#!/bin/bash -e
# given a commit, find immediate children of that commit.
for arg in "$@"; do
for commit in $(git rev-parse $arg^0); do
for child in $(git log --format='%H %P' --all | grep -F " $commit" | cut -f1 -d' '); do
git describe $child
done
done
done
正如这个线程所说明的,在一个基于DAG(有向无环图)表示的历史的VCS中,没有“一个父”或“一个子”。
C1 -> C2 -> C3
/ \
A -> B E -> F
\ /
D1 -> D2 ----/
提交的顺序是通过“拓扑顺序”或“日期顺序”来完成的(参见GitPro书籍)。
但是从Git 1.6.0开始,你可以列出提交的子对象。
git rev-list --children
git log --children
注意:对于父提交,你有同样的问题,后缀^ to一个修订参数表示该提交对象的第一个父。^<n>表示<n>的第1个父节点(即rev^等同于rev^1)。
如果你在分支foo上,并发出“git merge bar”,那么foo将是第一个父节点。 例如:第一个父节点是你合并时所在的分支,第二个父节点是你合并的分支上的提交。
Tomas Lycken在使用Git提交来驱动实时编码会话中给出了一种简洁的方法,即在提交堆栈的末尾创建定义良好的标记。本质上
git config --global alias.next '!git checkout `git rev-list HEAD..demo-end | tail -1`'
“demo-end”是最后一个标签。
要列出所有的提交,从当前提交开始,然后是它的子提交,等等-基本上是标准的git日志,但在时间上相反,使用类似于
git log --reverse --ancestry-path 894e8b4e93d8f3^..master
其中894e8b4e93d8f3是您想要显示的第一个提交。
注意:当使用DOS命令提示符时,必须转义插入符号:
git log --reverse --ancestry-path 894e8b4e93d8f3^^..master
如果你心中没有特定的“目的地”提交,而是想查看可能在任何分支上的子提交,你可以使用这个命令:
git rev-list --children --all | grep ^${COMMIT}
如果你想看到所有的子结点和孙子结点,你必须递归地使用rev-list——children,如下所示:
git rev-list --children --all | \
egrep ^\($(git rev-list --children --all | \
grep ^${COMMIT} | \
sed 's/ /|/g')\)
(只提供孙辈的版本将使用更复杂的sed和/或cut。)
最后,你可以输入一个log——graph命令来查看树结构,如下所示:
git log --graph --oneline --decorate \
\^${COMMIT}^@ \
$(git rev-list --children --all | \
egrep ^\($(git rev-list --children --all | \
grep ^${COMMIT} | \
sed 's/ /|/g')\))
注意:上面的命令都假设你已经将shell变量${COMMIT}设置为你感兴趣的子提交的某个引用(分支,标签,sha1)。
这显示了当前HEAD的所有子元素的列表。
git rev-list --parents --all | awk -v h="$(git rev-parse HEAD)" 'index($0,h)>1{print$1}'
它只打印所有以HEAD为父文件的提交。
你可以稍微加快一下速度,把^HEAD放在|之前,那么HEAD的祖先就不会被搜索。
如果你想打印另一个提交或分支的子文件,只需把它放在HEAD的位置(在更快的版本中,在两个HEAD位置)。