如何结账提交的孩子?

时间:2016-03-06 06:46:00

标签: git git-branch git-bash git-commit git-checkout

如何引用HEAD的提交提前

例如,在 HEAD后面1提交的提交是HEAD~1。

相对于HEAD,我如何向相反的方向移动?

基本上,我做了git checkout HEAD~1 3次。现在我想继续前进1次提交,有效地撤消我的上一次git checkout HEAD~1。我怎么能这样做?

我知道提交的一个分支就像一个单独的链表,每个提交只指向它的父。因此,如果遍历一个提交的孩子是不合理的,我想知道如何在他们之间进行处理。

5 个答案:

答案 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@{...}

这会让你回到你想要的提交

enter image description here

<强> 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.
  • 注意:(Since Git 2.7
    您也可以使用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 loggit reflog,您可以通过其SHA直接签到提交

git checkout [SHA-of-the-commit]