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

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

git reset origin/master

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

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

5个解决方案
258 votes

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

reset && checkout

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

reset && checkout的内容存储在HEAD内,它包含当前提交的40字节SHA-1。


reset && checkout

如果您没有进行最新提交 - 意味着reset && checkout指向历史记录中的先前提交,则称为reset && checkout

enter image description here

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

enter image description here

enter image description here

关于如何从分离的HEAD中恢复的几个选项:


reset && 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>

reset && checkout

您也可以随时使用reset && checkout
HEAD将显示更新HEAD的任何更改,并检出所需的reflog条目将设置HEAD回到此提交。

每次修改HEAD时,reset && checkout中都会有一个新条目

git reflog
git checkout HEAD@{...}

这将使您回到所需的提交

enter image description here


reset && checkout

将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.
  • 注意:(自Git 2.7起)
    你也可以使用reset && checkout

reset && checkout

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

# 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

CodeWizard answered 2019-07-23T00:25:35Z
10 votes

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

如果

你是'独立的头'
(即输入<branch_name>;你看Switched to branch <branch_name>

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

然后

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

成果

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

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

Kay V answered 2019-07-23T00:27:02Z
4 votes

git reset 23b6772

看你是否在正确的位置:

git status

你会看到一些东西

在分支主机上你的分支是17个提交的'origin / master',   并且可以快进。

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

git push --force
amuliar answered 2019-07-23T00:27:50Z
3 votes

问题可以解读为:

我在HEAD处于分离状态,位于cd -,输入git cherry-pick -(因为我想压缩)。 现在我改变了主意,如何回到HEAD,发表于23b6772

直截了当的答案是:cd -

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

事实证明有!

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

顺便提一下,返回到* nix中的上一个当前目录顺便提一下cd -! 所以欢呼,一举两得。

antak answered 2019-07-23T00:28:58Z
0 votes

当您运行命令git checkout commit_id时,HEAD将从13ca5593d(say commit-id)分离,并且分支将在更长的时间内可用。

移回上一个位置运行命令步骤 - a)git pull origin branch_name(比如master)b)git checkout branch_namec)git pull origin branch_name

您将使用远程存储库中的更新提交返回到先前的位置。

Deepak Kumar answered 2019-07-23T00:29:40Z
translate from https://stackoverflow.com:/questions/34519665/how-to-move-head-back-to-a-previous-location-detached-head-undo-commits