如何将HEAD移回到以前的位置? (分离头)

在git中,我试图通过在另一个分支中合并来执行一个壁球提交,然后通过以下方式将HEAD重置为前一个地方:

git reset origin/master

但我需要走出这一步。 我怎样才能将HEAD移回到之前的位置?

我有我需要将其提交到的提交的SHA1碎片( 23b6772 )。
我怎样才能回到这个提交?


在回答之前让我们添加一些背景,解释这是什么HEAD

First of all what is HEAD?

HEAD只是对当前分支上当前提交(最新)的引用。
任何时候只能有一个HEAD 。 (不包括git worktree

HEAD的内容存储在.git/HEAD ,它包含当前提交的40字节的SHA-1。


detached HEAD

如果你不在最新的提交 - 这意味着HEAD指向历史上的一个事先提交,它被称为detached HEAD

在这里输入图像描述

在命令行上它看起来像这样 - SHA-1而不是分支名称,因为HEAD没有指向当前分支的尖端

在这里输入图像描述


关于如何从分离的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将显示更新HEAD任何更改,并检出所需的reflog条目将把HEAD设置回此提交。

每当HEAD被修改时, 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 2.7开始)
    你也可以使用git rebase --no-autostash


  • git revert <sha-1>

    “撤销”给定的提交或提交范围。
    重置命令将“撤销”给定提交中所做的任何更改。
    一个新的提交与撤消补丁将被提交,而原始提交将保留在历史中。

    # add new commit with the undo of the original one.
    # the <sha-1> can be any commit(s) or commit range
    git revert <sha-1>
    

    这个模式说明哪个命令做什么。
    正如你可以看到那里reset && checkout修改HEAD

    在这里输入图像描述


    这是一种可能非常简单且易于记忆的方法。 检查2个条件并使用1个命令完成。 然后你回到正轨。

    如果

    你在'分离头'
    (即键入git status ;你看到HEAD detached at <commit_id>

    现有的分支适合您的需求
    (即键入git branch -v ;你会看到一个分支名称和一个代表你想要继续工作的相关提交信息)

    然后

    只需签出该分支(即键入git checkout <branch_name> ;您看到Switched to branch <branch_name> )。

    成果

    您现在可以像以前一样继续添加和提交您的工作; 更改将在<branch_name>上进行跟踪。

    请注意,如果您在HEAD分离时保存了工作,则在大多数情况下,工作将在上述过程中自动合并。 如果您看到关于合并冲突的消息,请不要惊慌。 有几个很好的教程,通过简单的步骤来解决冲突和完成合并。


    这个问题可以理解为:

    我在23b6772处于HEAD分离状态,并输入了git reset origin/master (因为我想压扁)。 现在我改变了主意,我该如何回到HEAD 23b6772

    直接的答案是: git reset 23b6772

    但是我碰到这个问题,因为每次我想引用前面的HEAD并且用谷歌搜索查看是否有任何形式的简写时,我都厌倦了键入(复制和粘贴)提交哈希或其缩写。

    原来有!

    git reset - (或者在我的情况下git cherry-pick -

    顺便说一句,与cd -相同cd -返回* nix中的前一个当前目录! 因此,欢呼声,一举两得。

    链接地址: http://www.djcxy.com/p/403.html

    上一篇: How to move HEAD back to a previous location? (Detached head)

    下一篇: calendar type elements in a list