关于git:如何将HEAD移回以前的位置?

How to move HEAD back to a previous location? (Detached head) & Undo commits

在Git中,我试图合并另一个分支,然后通过以下方式将HEAD重置为原来的位置,从而实现squash commit

1
git reset origin/master

但我需要走出这个世界。如何将头部移回以前的位置?

我得到了我需要转移到的承诺的sha1 frag(23b6772)。我怎样才能回到这个承诺?


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

江户十一〔一〕号

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

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

江户十一〔七〕号

如果您没有进行最新的提交,这意味着HEAD指向的是历史上以前的提交,它称为detached HEAD

enter image description here

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

氧化镁

氧化镁关于如何从分离的头部恢复的几个选项:江户十一〔11〕。

1
2
3
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

这将签出指向所需提交的新分支。此命令将签出到给定的提交。此时,您可以创建一个分支并从这一点开始工作。

1
2
3
4
5
6
7
8
# 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>

号埃多克斯1〔12〕

您也可以使用refloggit reflog将显示更新HEAD的任何更改,并签出所需的reflog条目将HEAD设置回此提交。

每次修改磁头时,reflog中都会有一个新条目。

1
2
git reflog
git checkout HEAD@{...}

这将使你回到你想要的承诺

氧化镁

埃多克斯1〔18〕

"移动"你的头回到想要的承诺。

1
2
3
4
5
6
7
8
9
10
11
# 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

埃多克斯1〔20〕

"撤消"给定的提交或提交范围。重置命令将"撤消"在给定提交中所做的任何更改。将提交带有撤消补丁的新提交,而原始提交也将保留在历史记录中。

1
2
3
# 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 )

现有分支机构可满足您的需求(即,键入git branch -v;您会看到一个分支名称,其中包含一个表示您要继续的工作的相关提交消息)

然后

只需查看该分支(即,git checkout 型,见Switched to branch 型)。

结果

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

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


1
git reset 23b6772

要查看您的位置是否正确:

1
git status

你会看到一些东西

On branch master Your branch is behind 'origin/master' by 17 commits,
and can be fast-forwarded.

然后将头部固定到当前提交:

1
git push --force

问题可以理解为:

我和HEAD23b6772分居,打git reset origin/master(因为我想打壁球)。现在我改变主意了,我该怎么回到HEAD23b6772呢?

直截了当的回答是:git reset 23b6772

但我之所以回答这个问题,是因为每当我想引用以前的HEAD时,我都厌倦了输入(复制和粘贴)commit hashes或其缩写,并且在谷歌上搜索是否有任何速记。

原来是这样的!

git reset -(在我的例子中,git cherry-pick -)

顺便说一句,它与cd -相同,返回到*nix中的前一个当前目录!好啦,一石二鸟。


今天,我错误地签出了一个commit并开始处理它,在分离head状态下进行了一些commit。然后我用下面的命令将其推到远程分支

1
git push origin HEAD: <My-remote-branch>

然后

1
git checkout <My-remote-branch>

然后

1
git pull

我终于在我的分支中得到了我在分离头中所做的所有更改。


当您运行命令git checkout commit_id时,脱离13ca5593d(say commit-id)的头和分支将打开更长的时间。

移回上一个位置逐步运行命令-a)git pull origin branch_name(说master)b)Git结账分公司名称c)git pull来源分支机构名称

通过从远程存储库更新提交,您将返回到以前的位置。