Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“git diff HEAD^”的反面是什么?_Git - Fatal编程技术网

“git diff HEAD^”的反面是什么?

“git diff HEAD^”的反面是什么?,git,Git,在git中,我可以通过说HEAD^或HEAD~1来指定以前的版本。走另一条路怎么样?假设我在修订版X上,我执行了git checkout X^。我怎么回去 类似于git checkout X+?的东西我认为这是不可能的,因为git提交只存储其父提交,而不存储其子提交 设想一个commit将存储其子项。如果在此提交上创建多个分支,那么多个提交将此提交作为父级,会发生什么情况?那么什么是“头+”?这是不明确和错误的 从数据结构中我了解到: Git将历史存储为一个单链表,而您的操作将需要一个双链表。您

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


类似于git checkout X+?

的东西我认为这是不可能的,因为git提交只存储其父提交,而不存储其子提交

设想一个commit将存储其子项。如果在此提交上创建多个分支,那么多个提交将此提交作为父级,会发生什么情况?那么什么是“头+”?这是不明确和错误的

从数据结构中我了解到:
Git将历史存储为一个单链表,而您的操作将需要一个双链表。

您不能真正做到这一点。git中的历史记录是a-每个提交都包含对其父级的引用,但父级没有对其子级的引用

当您考虑从中创建多个分支的提交时,这里的问题应该变得很明显。你说的“下一次承诺”是什么意思?对于父级,您可以进行编号(正常的合并提交有第一个和第二个父级),但如何对子级进行编号?即使您知道您要在哪个分支上(例如,您已签出
master~4
,现在您想查看
master~3
),它也没有很好的定义-您可能处于以下情况:

- X (HEAD) - o - o - o - Y (master)
   \                    /
    o - o - o ----------
git checkout $(git rev-list HEAD..master | tail -n 1)
也就是说,在简单的情况下,您可以这样做:

- X (HEAD) - o - o - o - Y (master)
   \                    /
    o - o - o ----------
git checkout $(git rev-list HEAD..master | tail -n 1)
显然,这对线性历史很有用。与合并<代码>修订列表在历史中从现在到过去,然后向后运行。我相信它首先跟随第一个父级,所以最后打印的内容将是跟随所有最后一个父级找到的提交后

编辑:这确实假设您知道要向哪个分支前进。如果你不。。。好吧,您几乎无法查看所有引用以当前头部作为父级的提交-可能会将
git rev parse的输出变为灰色:

git rev-list --all --children | grep ^$(git rev-parse HEAD)

然后从线中抓取另一个SHA1(使用awk,无论什么)。如果有多个结果,您必须手动检查或做出任意选择,但据我所知,没有符号方式引用提交的子项

我刚才能给您提供的最好的选项是
git rev list
--children
选项。在这里,我要求将最近的四项承诺打印出来,并附上关于他们孩子的信息。请注意,在每个条目(除最近的条目外)的“提交”行上有一个额外的提交编号,它指定该节点的子节点。您可以手动获取,也可以通过一些shell脚本获取,以访问孩子

$ git rev-list --children --pretty HEAD~3...

commit 20dba296ad1d48ec90f9319e2c13b245e849f698
Author: Somebody <____@____.net>
Date:   Thu May 6 19:10:38 2010 -0400

    Support for complex trig/pow.

commit 9d42b5bac1721a847a39c25672e577c7101c8ff0 20dba296ad1d48ec90f9319e2c13b245e849f698
Author: Somebody <____@____.net>
Date:   Wed May 5 21:55:07 2010 -0400

    Fix doc formatting warning.

commit 72bed3baa9df71cb224dfa8388b5969d50f5567c 9d42b5bac1721a847a39c25672e577c7101c8ff0
Merge: b8244cb61491c9cdb83d36e57f8eb49773e44f6b 899c3dd3f9f419f200b84ca0abe59d7ac3d5bb53
Author: Somebody <____@____.net>
Date:   Wed May 5 21:54:59 2010 -0400

    Merge branch 'master' 

commit 899c3dd3f9f419f200b84ca0abe59d7ac3d5bb53 72bed3baa9df71cb224dfa8388b5969d50f5567c
Author: Somebody <____@____.net>
Date:   Wed May 5 21:19:11 2010 -0400

    Fix link
$git rev list——孩子们——漂亮的头~3。。。
提交20DBA296AD48EC90F9319E2C13B245E849F698
作者:某人
日期:2010年5月6日星期四19:10:38-0400
支持复杂触发/电源。
提交9d42b5bac1721a847a39c25672e577c7101c8ff0 20DBA296AD18EC90F9319E2C13B245E849F698
作者:某人
日期:星期三2010年5月5日21:55:07-0400
修复文档格式警告。
提交72bed3baa9df71cb224dfa8388b5969d50f5567c 9D42B5BAC172A1A847A39C25672E577C7101C8FF0
合并:b8244cb61491c9cdb83d36e57f8eb49773e44f6b 899c3dd3f9f419f200b84ca0abe59d7ac3d5bb53
作者:某人
日期:星期三2010年5月5日21:54:59-0400
合并分支“主”
提交899c3dd3f9f419f200b84ca0abe59d7ac3d5bb53 72BED3BAA9DF71CB224DFA8388B599D50F5567C
作者:某人
日期:2010年5月5日星期三21:19:11-0400
固定链接

比这更糟一点-看看我关于模棱两可的回答吧,即使父母知道孩子的情况。你真的想要HEAD^的反面,还是想要一种“回去”的方式?(您可以使用HEAD@{1}返回到以前的HEAD。)从技术上讲,同样的问题以另一种方式存在,即,如果HEAD位于点Y,则
HEAD^
跟随哪个路径?这两个分支可能都是主。。。我认为另一个答案可能更准确,关于每个提交存储父提交,
HEAD^
使用它。