在查看代码提交历史时,手欠点了一下cherry-pick,导致提交项目时,提示HEAD detached at head。这篇文章就聊聊,前因后果及如何解决。

git cherry-pick

git cherry-pick可以理解为“挑拣”提交,它会获取某一个分支的单次提交,作为一个新的提交引入到当前分支上。

当需要在本地合入其他分支的提交时,如果不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用git cherry-pick了。

比如要提交第一次的代码到另外一个test分支,首先git checkout test切换到test分支,然后

git cherry-pick 4db0729d

git add -A

git commit -m “提交内容”

git push origin test,即可。

但是对于当前项目,并不需要合并之前的分支,而且项目处于“游离状态”。

下面就看看如何确定及如何解决。

git detached HEAD

在git使用的时候,经常会碰到DETACHED HEAD,首先可以通过命令来查看目前项目的状态:

$ git status
HEAD detached from 513fab6

如果此时执行commit提交时,还会出现类似的提示:

Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  513fab6 interrationRecord page completed

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch <new-branch-name> 513fab6

git checkout本质上是修改HEAD里面的内容来让它指向不同分支的,而HEAD文件指向的分支就是我们当前的分支,但是有时候HEAD不会指向任何分支,严谨的说是HEAD指向了一个没有分支名字的修订版本,此时已经处于游离状态了(detached HEAD)。这时候我们在进行commit操作不会提交到任何分支上。

如果项目中并没有需要提交代码,像本人这样是误操作的,最直接的解决方案便是直接git checkout想要的分支即可。但如果还需要合并修改的内容,则可考虑创建临时的分支,进行操作。

如果需要提交最新的内容,还需要分支的合并和处理,则可按照如下思路:1、基于本次提交创建一个临时分支;2、然后merge到当前工作分支;3、删除临时分支。

基于本次提交创建临时分支

输入

$git branch temp fef4501

使用“git branch 分支名 操作ID”命令能够创建一个新的分支,但要注意此时还没有切换到这个分支上,这个分支上面代码跟刚才提交完之后的一样。

切换到工作分支并合并代码

输入

$git checkout ask_11_16

切换到ask_11_16分支,这个分支是之前想要提交的分支。然后

$git merge temp

这行命令过后已经上次commit合并到ask_11_16上了,此时终端状态为

Your branch is ahead of 'origin/ask_11_16' by 1 commit.

只需要$git push即可把本次提交push到远程分支。这时候检查代码,正是想要的状态。

删除temp分支

删除temp分支:

$git branch -d temp

HEAD 游离状态的利与弊

利: 我们可以很方便地在历史版本之间互相切换,比如需要回到某次提交,直接 checkout 对应的 commit id 或者 tag 名即可。

弊:在这个基础上的提交会新开一个匿名分支且提交是无法可见保存的,一旦切到别的分支,游离状态以后的提交就不可追溯了。



手欠点了cherry-pick,git项目处于git detached HEAD状态插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://choupangxia.com/2020/12/15/git-detached-head/