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

Pau*_*gar 21 git

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

有点像git checkout X+

Cas*_*bel 32

你无法真正做到这一点.git中的历史是一个有向无环图 - 每个提交都包含对其父项的引用,但父母没有引用它们的子代.

当您考虑从中创建多个分支的提交时,此处的问题应该变得明显.哪个"下次提交"是什么意思?对于父母,你可以编号(正常的合并提交有第一和第二个父母),但你如何与孩子一起做?即使你知道你正在试图做什么分支(例如你已经检查过master~4,现在你想看看master~3)它没有明确定义 - 你可能会遇到这样的情况:

- X (HEAD) - o - o - o - Y (master)
   \                    /
    o - o - o ----------
Run Code Online (Sandbox Code Playgroud)

也就是说,在简单的情况下,你可以这样做:

git checkout $(git rev-list HEAD..master | tail -n 1)
Run Code Online (Sandbox Code Playgroud)

显然,线性历史可以正常工作.随着合并... rev-list在历史中从现在到过去工作,向后追随它.我相信它首先遵循第一个父母,所以最后打印的东西将是HEAD跟随所有最后父母找到的提交.

编辑:这确实假设您知道要向前推进哪个分支.如果你没有......好吧,你几乎看不到所有refs的提交,这些提交有当前的HEAD作为父级 - 可能会勉强输出git rev-parse:

git rev-list --all --children | grep ^$(git rev-parse HEAD)
Run Code Online (Sandbox Code Playgroud)

然后从线上抓取另一个SHA1(使用awk,无论如何).如果有多个结果,你必须手动检查或做出任意选择......