如何将HEAD移回以前的位置? (独立头)&撤消提交

时间:2015-12-29 21:53:03

标签: git git-checkout git-reset git-revert git-reflog

在git中,我试图通过合并另一个分支来执行squash commit,然后通过以下方式将HEAD重置为之前的位置:

git reset origin/master

但我需要走出这一步。 如何将HEAD移回上一个位置?

我有将其移动到的提交的SHA1 frag(23b6772) 我怎样才能回到这个提交?

8 个答案:

答案 0 :(得分:270)

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

First of all what is HEAD?

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

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

detached HEAD

如果您没有进行最新提交 - 意味着HEAD指向历史记录中的先前提交,则称为 detached HEAD 。< / p>

enter image description here

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

enter image description here

enter image description here

关于如何从分离的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@{...}

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

enter image description here

<强> git reset --hard <commit_id>

&#34;移动&#34;你的HEAD回到了想要的提交。

# 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

<强> git revert <sha-1>

&#34;撤消&#34;给定的提交或提交范围 reset命令将&#34; undo&#34;在给定的提交中做出的任何更改 将提交具有撤消补丁的新提交,同时原始提交也将保留在历史记录中。

# 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

enter image description here

答案 1 :(得分:10)

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

如果

你是'超级头'的人 (即键入git status;您会看到HEAD detached at <commit_id>

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

然后

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

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

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

答案 2 :(得分:6)

git reset 23b6772

查看您是否在正确的位置上:

git status

您会看到一些东西

  

在分支主服务器上,您的分支在“ origin / master”后面落后了17次提交,   并且可以快速转发。

然后将HEAD修复为当前提交:

git push --force

答案 3 :(得分:3)

问题可以理解为:

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

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

但是我遇到了这个问题,因为每次我想引用之前的HEAD时,我都厌倦了输入(复制和粘贴)提交哈希或其缩写,并且谷歌搜索是否有任何类型的速记

事实证明有!

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

cd -一样,返回* nix中的前一个当前目录是偶然的!所以欢呼,一举两得。

答案 4 :(得分:0)

当您运行命令git checkout commit_id时,HEAD从13ca5593d(say commit-id)脱离,分支将不再可用。

移回先前的位置,明智地运行命令- a)git pull origin branch_name(比如master) b)git checkout branch_name c)git pull origin branch_name

您将通过远程存储库中的最新提交返回到先前的位置。

答案 5 :(得分:0)

今天,我错误地检查了一次提交并开始进行处理,这使一些提交脱离了HEAD状态。然后我使用以下命令将其推送到远程分支

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

然后

git checkout <My-remote-branch>

然后

git pull 

我终于获得了在分离HEAD中所做的所有更改

答案 6 :(得分:0)

这可能不是技术解决方案,但可以。 (如果您的队友在本地拥有相同的分支机构)

让我们假设您的分支名称为 branch-xxx

解决步骤:

  • 不进行更新或提取-没有任何内容
  • 只需在计算机上从 branch-xxx 创建一个新分支( branch-yyy
  • 仅此而已,所有现有更改都将在此新分支( branch-yyy )中。您可以在该分支机构继续工作。

注意:同样,这不是技术解决方案,但肯定会有所帮助。

答案 7 :(得分:0)

将最后一个未推送的提交移到新分支

如果您的问题是您开始在 WRONG_BRANCH 上提交,并且想要将那些最后未推送的提交移动到 RIGHT_BRANCH,那么最简单的方法是

  1. git checkout WRONG_BRANCH
  2. git branch RIGHT_BRANCH
  3. git reset —-hard LAST_PUSHED_COMMIT
  4. git checkout RIGHT_BRANCH

此时,如果您运行 git log HEAD,您将看到您的所有提交都在 RIGHT_BRACH 中。

数据

  • WRONG_BRANCH 是您提交的更改(尚未推送)现在所在的位置
  • RIGHT_BRANCH 是您提交的更改(尚未推送)的位置
  • LAST_PUSHED_COMMIT 是您要将 WRONG_BRANCH 恢复到的位置