Git之detached HEAD

今天遇到了和CSDN上博主相同的问题,就是使用git -branch -a 发现自己处于一个零时的分支上。这篇博文写的不错,转载记录一下。

转载:http://blog.csdn.net/lili625/article/details/46583217

+ git fetch --all
Fetching origin
Address ip地址 maps to git地址, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
+ git checkout master
Previous HEAD position was 8928318... add test file
Switched to branch ‘master‘
Your branch and ‘origin/master‘ have diverged,
and have 1487 and 409 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)
+ git pull
Address ip地址 maps to git地址, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
Auto-merging upgrade-framework/conf/shell.xml
CONFLICT (add/add): Merge conflict in upgrade-framework/conf/shell.xml
Auto-merging upgrade-framework/conf/replace.xml
CONFLICT (add/add): Merge conflict in upgrade-framework/conf/replace.xml
……

其中“Your branch and ‘origin/master’ have diverged”这句话引起了我的注意,翻译成汉语就是“你所在的分支和’origin/master’分支有分歧”,由于上一条命令是git checkout master,因此当前所在的分支是master,最终的含义是master分支和origin/master分支有分歧。我们都知道git仓库默认的分支是master,origin/master是远端与之对应的分支,为什么会有分歧呢?我们具体看一下。 
首先在本地master分支上运行git status检查了状态,发现nothing to commit,working directory clean。于是运行git checkout origin/master切换到origin/master分支看看有什么发现没有,果然有: 
 
切换分支后信息提示我正处于’detached HEAD’状态。detached是游离的意思,HEAD是git中具有特殊意义的名词。

你可以认为 HEAD(大写)是”current branch”(当下的分支)。当你用git checkout切换分支的时候,HEAD 修订版本重新指向新的分支。有的时候HEAD会指向一个没有分支名字的修订版本,这种情况叫”detached HEAD”。head(小写)是commit对象的引用,每个head都有一个名字(分支名字或者标签名字等等),但是默认情况下,每个叫master的repository都会有一个head, 一个repository可以包含任意数量的head。在任何时候,只要这个head被选择成为”current head“,那么这个head就成了HEAD,总是大写。——摘自segmentfalt

上面这段话摘自网络回答,定义HEAD的同时也解释了什么叫做’detached HEAD’,即现在HEAD指向的是一个没有分支名字的修订版本,“游离”于已知的所有分支之外。到这里,我猜测控制台报的错应该和游离HEAD有关系。自然而然地,如果想要解决git对接jenkins时报的错,那需要解决掉’detached HEAD’问题。 
于是我尝试commit: 
 
发现和在master分支时一样,没有需要commit的,但是红字标识HEAD detached at origin/master,再一次验证了HEAD从origin/master分支游离出去了。 
查看分支的最新修改: 
 
这里看到带上游离HEAD所在的未命名分支在内的三个分支的最新一次commit id都是a239482。回头看第一张图片,里面有句话“HEAD is now at c90b1ca…新增test.txt文件”。test.txt文件是我为了做测试弄清楚分支状况新增的文件,之后进行了一次修改,新增肯定在修改之前。不知道什么原因造成的HEAD仍然停留在新增test.txt文件这里没有继续向前走。

在网上搜查了很多资料,最后发现解决这个问题并不复杂。简单来说,游离HEAD的问题就在于它没有一个具体的分支名,那我们给它命个名:git branch temp c90b1ca(将HEAD指向的commit命名为分支temp),然后切换到分支master上,执行merge命令(git merge temp),最后push到远端。做完这一系列操作之后再次查看分支的最新修改,发现游离出去的分支不见了,取而代之的是temp分支。

不出意外,git对接jenkins时出现的问题也消失了。

时间: 2024-08-09 14:22:13

Git之detached HEAD的相关文章

git branch detached from jb4.2.2_1.0.0-ga

/*************************************************************************** * git branch detached from jb4.2.2_1.0.0-ga * 说明: * 将Android的U-Boot拿出来,结果遇分支不存在的问题. * * 2017-2-8 深圳 南山平山村 曾剑锋 ***************************************************************

git HEAD detached from origin 问题的解决

这个问题是因为分支选错了,所以说后续的提交都提交到了一个匿名分支之上,整个状态是游离了的 下面说一下我解决问题的步骤 1.查看在游离状态下提交的最新commit号 git branch -v 2.创建一个临时的分支,创建完成之后切换到该分支上查看一下 git branch temp 最新的commit号 3.切换到要合并的分支智商 git checkout 要合并临时分支的分支名称 4.合并分支 git merge temp 5.删除临时分支 git branch -d temp 6.推送合并后

Git HEAD detached from XXX (git HEAD 游离) 解决办法

什么是Head git中的head可以理解为一个指针,我们可以在命令行中输入 cat .git/HEAD查看当前的head指向哪儿,一般它指向当前工作目录所在分支的最新提交 Head游离状态的利与弊 HEAD 处于游离状态时,我们可以很方便地在历史版本之间互相切换,比如需要回到某次提交,直接 checkout 对应的 commit id 或者 tag 名即可. 它的弊端就是:在这个基础上的提交会新开一个匿名分支! 也就是说我们的提交是无法可见保存的,一旦切到别的分支,游离状态以后的提交就不可追溯

Linux git 多人协助开发实战

git 服务器搭建 创建公钥,准备免密登录 初始化一个版本库 git clone  git客户端 查看git状态 创建一个文件 添加到暂缓区 提交到版本库 查看git日志 checkout 从缓存区恢复文件到工作区 reset 版本区恢复到缓存区 查看git日志 reset --hard 工作区,缓存区被版本库重置 查看工作区与缓存区的差异 查看缓存区与版本库的差异 查看工作区与版本库的差异 演示git状态,精简状态 删除版本库的文件 从版本库恢复文件 查看文件提交的历史信息,便于bug追踪 b

Git系列①之仓库管理互联网托管平台github.com的使用

互联网项目托管平台github.com的使用 1.安装git客户端 # yum install -y git 配置git全局用户以及邮箱 [[email protected] ~]# git config --global user.name "jack" [[email protected] ~]# git config --global user.email "[email protected]" [[email protected] ~]# git confi

《个人-GIT使用方法》

本文章转载于:http://blog.csdn.net/gemmem/article/details/7290125 1. Git概念 1.1. Git库中由三部分组成 Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制..git目录位于工作目录内. 1) 工作目录:用户本地的目录: 2) Index(索引):将工作目录下所有文件(包含子目录)生成快照,存放到一个临时的存储区域,Git 称该区域

git fetch

git fetch从远程仓储导入commit到你的本地仓储. 这些fetch到的commit是做为一个远程分支存储在你本地的. 这样你可以在集成这些commit到你的项目前先看看都有些什么修改. 用法 git fetch <remote> 获取远程仓储所有的分支. git fetch <remote> <branch> 获取远程仓储指定的分支 讨论 当你想看看其他人都做了些什么工作的时候你可以使用fetch. 因为fetch到的内容是做为一个remote分支的形式展现出

git 和github简介

关于github不清楚的可以百度, 在这里,可以创建一个新的仓库 点击Create repository后会出现下面这些信息,其中第一块是仓库的url链接 第二块是你在本地目录中创建一个READEME.md文件,然后进行初始化,在add和commit提交到分支,然后再关联仓库,最后通过push 推送本地代码到github. 第三块其实就是已创建了本地仓库的前提下,执行第二块后面两行命令,推送代码到github $ git remote add origin [email protected]:L

git: fatal: Not a git repository (or any of the parent directories): .git

在看书 FlaskWeb开发:基于Python的Web应用开发实战 时,下载完源码后 git clone https://github.com/miguelgrinberg/flasky.git 试着 切换到 提交历史 1a, $ git checkout 1a,出现error: fatal: Not a git repository (or any of the parent directories): .git 这个提示表明现在不在一个git repository目录下,需要切换到flask