如何将HEAD移回到之前的位置? (分离头)
在混帐,我试图通过合并在另一个分支,然后通过重置HEAD
到以前的地方做一个壁球提交:
git reset origin/master
但我需要走出这一点。 我怎样才能将HEAD移回到之前的位置?
我有我需要移动到提交的SHA1碎片( 23b6772
)。
我怎样才能回到这个提交?
在回答之前,让我们添加一些背景,说明这是什么头。
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
这将检出指向所需提交的新分支。
这个命令将签出一个给定的提交。
在这一点上,你可以创build一个分支,并从这一点开始工作。
# 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>
“撤销”给定的提交或提交范围。
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
修改头。
这是一个可能非常简单易记的方法。 检查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
(因为我想压扁)。 现在我改变了主意,我该如何回到23b6772
HEAD
?
直接的答案是: git reset 23b6772
但是我碰到这个问题,因为每次我想引用前面的HEAD
并且用谷歌search查看是否有任何forms的速记,我厌倦了键入(复制和粘贴)提交散列或其缩写。
原来是这样!
git reset -
(或者在我的情况下git cherry-pick -
)
顺便说一句,与cd -
相同cd -
返回到* nix中以前的当前目录 ! 所以欢呼,一箭双雕。