手欠点了cherry-pick,git项目处于git detached HEAD状态
在查看代码提交历史时,手欠点了一下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 名即可。
弊:在这个基础上的提交会新开一个匿名分支且提交是无法可见保存的,一旦切到别的分支,游离状态以后的提交就不可追溯了。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接