Git之detached HEAD
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相关推荐
- git HEAD detached from origin 问题的解决
git HEAD detached from origin 问题的解决 参考文章: (1)git HEAD detached from origin 问题的解决 (2)https://www.cnbl ...
- git * (HEAD detached from xxx) 的解决
在使用git的过程中,若使用 git checkout < commit id>,那么,会进入游离状态,出现标题所示的提示,表示当前没有任何分支进行管理,git后台会生成一个匿名分支,但是 ...
- 淺入 Git:detached HEAD
淺入 Git:detached HEAD https://titangene.github.io/article/git-detached-head.html 在 Git 的世界中,想回到過去,也許你 ...
- Git HEAD detached from XXX (git HEAD 游离) 解决办法
本文 Git 图片主要来自:图解 Git,非常感谢! 读完本文你将了解: 什么是 HEAD HEAD 游离状态的利与弊 具体解决操作 Thanks 什么是 HEAD Git 中的 HEAD 可以理解为 ...
- git branch detached
detached(游离)分支,是一种特殊的分支, 1.在git checkout之前的commit之后,提交会出现 2.在reset 时会出现 特点: 1.假如HEAD离开了deached分支,分支就 ...
- git使用出现 Git HEAD detached from XXX解决
head在git中代表指针,一般指向当前工作目录所在分支的最新提交.如果使用的是 git checkout ,即切换到指定的某一次提交,HEAD 就会处于 detached 状态(游离状态). 解决方 ...
- git detached head
Git detatached head means you are not in the latest commit on your branch. What is Head in Git. It's ...
- 常用git命令思维图
git常用命令思维导图 问题解决 一.大文件限制(超过100M) 报错提醒: remote: warning: Large files detected. remote: error: File xx ...
- Git笔记(一)——[commit, checkout]
其实一直觉得自己是会用Git的,毕竟咱也是用Github的人啊!可是三月份找工作时候的一次面试颠覆了我的看法: Q: 用过Git吗?平常怎么用的? A: 用过的,一般就是add,commit,push ...
最新文章
- UVa 11059 - Maximum Product
- 怎么样让自己更加从容的面对生活
- asp服务器_200行代码,7个对象——让你了解ASP.NET Core框架的本质「3.x版」
- docker harbor 域名_超详细的搭建docker私服Harbor教程
- java内部类实现方式_Java内部类详解
- java concurrent int_java.util.concurrent.AtomicInteger
- eclipse下生成Java类图和时序图,生成UML图
- Qt4_基于项的图形视图
- [论文阅读] BCNet: Bidirectional collaboration network for edge-guided salient object detection
- 电脑屏保海底世界_电脑游戏假面骑士kiva中文版
- Atitit 命令行返回 cli 返回解析 tab分割csv格式 v4 t34.docx Atitit 命令行返回 cli 返回解析 csv 格式 cliutil 目录 1.1. 线使用tab
- Mac上WineSkin游戏无法正常运行
- (转)电脑内外接口全程图解
- 教你如何看headers
- mysql 闰年,[MySQL]--gt;查询5天之内过生日的同事中的闰年2月
- java抽奖活动_java抽奖思路
- 如何用HTML和css实现拼图,打造自己的html5拼图小游戏
- 淘宝MySQL数据库高可用实现方案
- 【每日早报】2019/10/10
- porphet论文_时间序列神器之争:Prophet VS LSTM