git - `git diff HEAD^` 的反义词是什么?

标签 git

在 git 中,我可以通过说 HEAD^HEAD~1 来指定以前的修订版。走另一条路怎么办?假设我使用的是修订版 X,并且执行 git checkout X^。我怎么回去?

类似 git checkout X+ 的东西?

最佳答案

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

当您考虑从中创建多个分支的提交时,这里的问题应该变得很明显。你的意思是哪个“下一次提交”?对于 parent ,您可以编号(正常的 merge 提交有第一和第二 parent ),但是对于 child ,您如何做到这一点?即使你知道你试图在哪个分支上(例如你已经 checkout master~4 现在你想看看 master~3)它不是定义明确 - 你可能会遇到这样的情况:

- X (HEAD) - o - o - o - Y (master)
   \                    /
    o - o - o ----------

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

git checkout $(git rev-list HEAD..master | tail -n 1)

显然,这对于线性历史来说效果很好。通过 merge ... rev-list 在历史中从现在到过去工作,向后跟踪。我相信它首先跟随第一个 parent ,所以最后打印的东西将是 HEAD 之后的提交,这是通过跟随所有最后一个 parent 找到的。

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

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

然后从行中获取另一个 SHA1(使用 awk,随便)。如果有多个结果,您将不得不手动检查或做出任意选择...

关于git - `git diff HEAD^` 的反义词是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3557014/

相关文章:

git - 如何解决 "git pull" merge 冲突到我之前的提交之一?

Git - 将 dist 文件夹部署到不同的远程

git - 使用代理获取私有(private)仓库

git - 如何查看 git 子模块指向哪个提交

git - 如何通过 Autohotkey 读取 Git Bash 中命令的输出

git - 将新创建的特定文件夹添加到 Git 中的 .gitignore

git突然开始每次都要求SSH key 密码

Git push 不退出

GIT:致命: 'master' 似乎不是 git 存储库

git - 您应该在哪个目录或文件路径中运行 eval ssh-agent?