Git很强大,很灵活,这是毋庸置疑的。但也正因为它的强大造成了它的复杂,因此会有很多奇奇怪怪的问题出现。比如在git对接jenkins时就出现了这样一个初看很奇怪的问题,控制台输出如下:

+ 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时出现的问题也消失了。

总结

我们团队选择的是小乌龟作为git工具,这个工具还是挺好用的,但不可避免地会掩盖一些东西使我们无法触及git的本质。so还是需要多研究下git的命令行及git本身实现的一些机制。

Git之detached HEAD相关推荐

  1. git HEAD detached from origin 问题的解决

    git HEAD detached from origin 问题的解决 参考文章: (1)git HEAD detached from origin 问题的解决 (2)https://www.cnbl ...

  2. git * (HEAD detached from xxx) 的解决

    在使用git的过程中,若使用 git checkout < commit id>,那么,会进入游离状态,出现标题所示的提示,表示当前没有任何分支进行管理,git后台会生成一个匿名分支,但是 ...

  3. 淺入 Git:detached HEAD

    淺入 Git:detached HEAD https://titangene.github.io/article/git-detached-head.html 在 Git 的世界中,想回到過去,也許你 ...

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

    本文 Git 图片主要来自:图解 Git,非常感谢! 读完本文你将了解: 什么是 HEAD HEAD 游离状态的利与弊 具体解决操作 Thanks 什么是 HEAD Git 中的 HEAD 可以理解为 ...

  5. git branch detached

    detached(游离)分支,是一种特殊的分支, 1.在git checkout之前的commit之后,提交会出现 2.在reset 时会出现 特点: 1.假如HEAD离开了deached分支,分支就 ...

  6. git使用出现 Git HEAD detached from XXX解决

    head在git中代表指针,一般指向当前工作目录所在分支的最新提交.如果使用的是 git checkout ,即切换到指定的某一次提交,HEAD 就会处于 detached 状态(游离状态). 解决方 ...

  7. git detached head

    Git detatached head means you are not in the latest commit on your branch. What is Head in Git. It's ...

  8. 常用git命令思维图

    git常用命令思维导图 问题解决 一.大文件限制(超过100M) 报错提醒: remote: warning: Large files detected. remote: error: File xx ...

  9. Git笔记(一)——[commit, checkout]

    其实一直觉得自己是会用Git的,毕竟咱也是用Github的人啊!可是三月份找工作时候的一次面试颠覆了我的看法: Q: 用过Git吗?平常怎么用的? A: 用过的,一般就是add,commit,push ...

最新文章

  1. UVa 11059 - Maximum Product
  2. 怎么样让自己更加从容的面对生活
  3. asp服务器_200行代码,7个对象——让你了解ASP.NET Core框架的本质「3.x版」
  4. docker harbor 域名_超详细的搭建docker私服Harbor教程
  5. java内部类实现方式_Java内部类详解
  6. java concurrent int_java.util.concurrent.AtomicInteger
  7. eclipse下生成Java类图和时序图,生成UML图
  8. Qt4_基于项的图形视图
  9. [论文阅读] BCNet: Bidirectional collaboration network for edge-guided salient object detection
  10. 电脑屏保海底世界_电脑游戏假面骑士kiva中文版
  11. Atitit 命令行返回 cli 返回解析 tab分割csv格式 v4 t34.docx Atitit 命令行返回 cli 返回解析 csv 格式 cliutil 目录 1.1. 线使用tab
  12. Mac上WineSkin游戏无法正常运行
  13. (转)电脑内外接口全程图解
  14. 教你如何看headers
  15. mysql 闰年,[MySQL]--gt;查询5天之内过生日的同事中的闰年2月
  16. java抽奖活动_java抽奖思路
  17. 如何用HTML和css实现拼图,打造自己的html5拼图小游戏
  18. 淘宝MySQL数据库高可用实现方案
  19. 【每日早报】2019/10/10
  20. porphet论文_时间序列神器之争:Prophet VS LSTM

热门文章

  1. DDR2-DDR3-IP-CARE ---use
  2. TCGA数据库的利用(三)—做差异分析的三种方法
  3. 小猫爪:嵌入式小知识06-KEIL scf分散加载文件解析-链接代码至RAM
  4. 【智商都是硬伤】分析与逻辑思考能力测试
  5. Linux下电骡aMule Kademlia网络构建分析3
  6. 寻找ada语言爱好者
  7. 谷歌眼镜GDK开发指南之动态卡片
  8. 删掉炒股软件,重新做人
  9. Fragment的优雅实践并杂谈细节
  10. VR制作中必须踩的坑365之029(oculus2、UE4、UE5、VR记录一年的踩坑之旅)触感反馈/为VR控制器制作震动