在git中,我可以通过说HEAD^
或HEAD~1
来指定以前的修订版。走另一条路怎么样?假设我在修订版X上,我做git checkout X^
。我该怎么回去?
像git checkout X+
?
答案 0 :(得分:30)
你无法真正做到这一点。 git中的历史是一个有向无环图 - 每个提交都包含对其父项的引用,但父母没有引用它们的子代。
当您考虑从中创建多个分支的提交时,此处的问题应该变得明显。哪个“下次提交”是什么意思?对于父母,你可以编号(正常的合并提交有第一和第二个父母),但你如何与孩子一起做?即使你知道你想要进入哪个分支(例如你已经检查了master~4
,现在你想看master~3
)它没有明确定义 - 你可能处于某种情况像这样:
- X (HEAD) - o - o - o - Y (master)
\ /
o - o - o ----------
那就是说,在简单的情况下,你可以这样做:
git checkout $(git rev-list HEAD..master | tail -n 1)
显然,线性历史记录可以正常工作。通过合并... rev-list
在历史中从现在到过去工作,跟随它。我相信它首先遵循第一个父级,所以最后打印的内容将是跟随所有最后父母找到HEAD
之后的提交。
编辑:这确实假设您知道要向前推进哪个分支。如果你不......好吧,你几乎看不到所有refs的提交,这些提交将当前的HEAD作为父级 - 可能会更新git rev-parse
的输出:
git rev-list --all --children | grep ^$(git rev-parse HEAD)
然后从线上抓取另一个SHA1(使用awk,无论如何)。如果有多个结果,你必须手动检查或做出任意选择......
答案 1 :(得分:3)
我不认为这是可能的,因为Git提交只存储其父提交,而不存储其子项。
想象一下,提交会存储其子代。如果你要在这个提交中创建几个分支会发生什么,所以多个提交将此提交作为父提交?什么会是“HEAD +”?这是模糊和错误的。
从我对数据结构的了解中说: Git将历史存储为单链表,而您的操作需要双链表。
答案 2 :(得分:2)
据我所知,没有象征性的方式来引用提交的孩子。
我刚才能给你的最好的选择是--children
的{{1}}选项。在这里,我要求最近提交的四份提交内容,以及有关其子女的信息。请注意,在每个条目的“commit”行(最近的条目除外)上有一个额外的提交号,它指定该节点的子节点。您可以手动或通过一些shell脚本来获取该内容。
git rev-list