ref^指的是在ref之前的提交,那么在ref之后的提交呢?

例如,如果我签出12345,我如何签出下一次提交?

是的,Git是一个DAG节点指针结构树。我如何找到这个之后的提交?


当前回答

这显示了当前HEAD的所有子元素的列表。

git rev-list --parents --all | awk -v h="$(git rev-parse HEAD)" 'index($0,h)>1{print$1}'

它只打印所有以HEAD为父文件的提交。

你可以稍微加快一下速度,把^HEAD放在|之前,那么HEAD的祖先就不会被搜索。

如果你想打印另一个提交或分支的子文件,只需把它放在HEAD的位置(在更快的版本中,在两个HEAD位置)。

其他回答

我明白你的意思。让人沮丧的是,有足够多的语法可以转到以前的提交,但没有一个语法可以转到下一个提交。在复杂的历史中,“下一次提交是什么”的问题变得相当困难,但在复杂的合并中,“前一次”提交也会出现同样的困难。在简单的情况下,在具有线性历史记录的单个分支中(即使只是局部地针对一些有限数量的提交),向前和向后移动将是很好的和有意义的。

然而,这样做的真正问题是,子提交没有被引用;它只是一个反向链表。找到子提交需要进行搜索,这并不太糟糕,但Git可能不想把它放入refspec逻辑中。

无论如何,我遇到了这个问题,因为我只是想在历史上一步一步地向前迈进,做测试,有时你必须向前迈进,而不是后退。嗯,经过深思熟虑,我想出了这个解决方案:

在你所处的位置之前选择一个承诺。这可能是一个分支。如果你在分支~10,“git checkout分支~9”,“git checkout分支~8”得到下一个之后,“git checkout分支~7”等等。

如果需要的话,在脚本中递减这个数字应该非常容易。比解析Git版本列表简单得多。

我在~/.gitconfig中有这个别名

first-child = "!f() { git log  --reverse --ancestry-path --pretty=%H $1..${2:-HEAD} | head -1; }; f"

我需要一个命令来快速签出下一次提交。 我最终得到了这个别名:

[alias]
next = "!f() { CMIT=$(git log --ancestry-path --format=%H ${commit}..${1} | tail -1) && git checkout $CMIT; }; f"

你需要指定你想要遍历的分支,例如:

git next master

您可以通过直接编辑它来将其添加到.gitconfig文件中。

输出示例:

~/home/myRepo | dd9e66ee  git next master
Previous HEAD position was dd9e66e Update README
HEAD is now at d71c74b Rename project; update to JUnit5

通过运行这个命令,你进入分离的头部模式,当然:)

我尝试过许多不同的解决方案,但没有一个对我有效。我得自己想办法。

查找下一个提交

function n() {
    git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
}

查找之前的提交

function p() {
    git checkout HEAD^1
}

我用下面的方法找到了下一个孩子:

git log --reverse --children -n1 HEAD (where 'n' is the number of children to show)