与`git diff HEAD ^`相反的是什么?

时间:2010-08-24 13:37:38

标签: git

在git中,我可以通过说HEAD^HEAD~1来指定以前的修订版。走另一条路怎么样?假设我在修订版X上,我做git checkout X^。我该怎么回去?

git checkout X+

之类的东西

3 个答案:

答案 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