在 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/