如何引用HEAD的提交提前?
例如,在 HEAD后面1提交的提交是HEAD~1。
相对于HEAD,我如何向相反的方向移动?
基本上,我做了git checkout HEAD~1
3次。现在我想继续前进1次提交,有效地撤消我的上一次git checkout HEAD~1
。我怎么能这样做?
我知道提交的一个分支就像一个单独的链表,每个提交只指向它的父。因此,如果遍历一个提交的孩子是不合理的,我想知道如何在他们之间进行处理。
答案 0 :(得分:2)
提交可以拥有无限的孩子。如果您想查看追溯到提交的所有历史记录,您可以
git log --all --ancestry-path ^$commit
或只是
git branch --contains $commit
git tag --contains $commit
显示他们的名字。
使用您想要的任何显示选项。如果要自动查找父级是特定提交的提交,可以从
开始child-commits() {
git rev-list --all --ancestry-path --parents ^$1^{} \
| awk /$(git rev-parse $1^{})'/ {print $1}'
}
但如果你只是想看看你去过哪里,请使用
git reflog
显示影响你头部的因素,以及原因。
答案 1 :(得分:1)
简言之:
git checkout $(git log --all --ancestry-path ^HEAD --format=format:%H | tail -n 1)
说明:
git log
命令将为您提供当前所在位置的孩子(--all --ancestry-path
)(^HEAD
)仅打印哈希值(--format=format:%H
)。然后我们将(|
)管道传递给tail
命令,只询问最后一行,该行应该包含子提交的哈希值。 (管道到尾部是依赖于平台的,但可能适用于大多数Mac或类Unix系统。)
最后,git checkout $(...)
部分只是在子shell中运行另一部分并获取子提交的哈希值,然后将其检出。
警告:如果您有多个子提交/提交谱系,则遍历的顺序将按git log
进行,这可能(或可能不是)符合您的预期。
答案 2 :(得分:0)
如果您的更改被推送到远程,您将能够访问该子项,但不能使用HEAD作为参考。但是您可以使用git reflog
获取所有提交的历史记录并签出所需的提交
答案 3 :(得分:0)
阅读本文,了解设置新HEAD的所有方法
How to move HEAD back to a previous location? (Detached head)
基本上,您需要决定要切换到哪个提交,并简单地以各种方式签出此提交,如上面链接中所述。
git checkout
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
这将检查指向所需提交的新分支 此命令将结帐到给定的提交 此时,您可以创建一个分支,并从此开始工作。
# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
#in order to be able to update the code.
git checkout <commit-id>
# create a new branch forked to the given commit
git checkout -b <branch name>
git reflog
您也可以随时使用reflog
git reflog
git checkout HEAD@{...}
这会让你回到你想要的提交
git reset HEAD --hard <commit_id>
强> “移动”你的头回到所需的提交。
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
git rebase --no-autostash
。这是可以做什么的一般模式。
答案 4 :(得分:0)
您可以使用
git checkout HEAD@{n}
将HEAD向前移动n
提交。
另一种可能的解决方法是
git checkout [branch-name]
返回branch-name
的HEAD,然后
git checkout HEAD~[n]
在您的情况下n
可以是2。
此外,使用git log
或git reflog
,您可以通过其SHA直接签到提交
git checkout [SHA-of-the-commit]