大亮的实验室

码田003


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 公益404

双塔奇谋--致敬保罗艾伦

发表于 2018-10-16 | 分类于 杂文

我日:
“自古双塔可奇谋,如今传奇变成闲话蛋挞吧”

一路走好

保罗虽比不上盖茨雄才,投资管理 上有许多失败的决定,但他的生命精彩度却不输。花花公子,球队老板,摇滚乐队吉它和主唱,传媒电视,航天计划,当然和盖茨一样有公益和慈善(死后的大部分财产捐出)。
看到他的标签就知道这人性情。他实现了很多人的梦

昨天巨星陨落,微软创始人保罗艾伦癌症去世了,我也闲来搜些东东来致敬一下。
同时,也回顾一下关于友谊,比较下苹果公司的双塔。终究自己也是个工程师。对于了解他们的伟大传奇,更感兴趣。因为,后CEO时代,故事大多平平了。
如果万有引力要感谢那个苹果,微软就要感谢保罗。正是他先辍学,常去“拐搭”哈佛二年级的“三好学生”盖茨,讨论未来蓝图。才有所有后面的故事。
保罗,一个辍学大学生,拿5万美元买了QDOS的版权,另一个大学生用律师妈妈关系和IBM的自大,加上自己的专业能力。他们开始了个人电脑时代的霸业。

恰发小

他们都是绝顶聪明并且配合比另外的双塔默契。乔布斯和沃兹尼亚克在车库阶段有着火花,但此后,故事便没有后续了。沃兹是个天才,然而,没能改变一介工程师的命运。
在公司方向上有了巨大分歧,也让友谊小船翻了。他和乔曾有一次活动机会可以见面聊几句,就在乔去世前几个月。可是,虽然他们认出了彼此,但没有对话。这个画面感时足。

往日时光

故事再回到主线吧,发现保罗受父亲的影响很大。
首先,他的父亲是曾在美国陆军服役,所有他对军事相关的题材尤其热衷。这个二战迷,对应着航天梦,航海梦,博物馆梦。
其次,他的父亲当过20年的图书管理员,所有,他拥有的阅读量让他成为同龄人的异类,被盖茨所折服。
最后,再说沃兹,十几岁就玩无线电天才。他的父亲也是名工程师,军工导弹部门的。

两个小生,少年老成风云人物。
两个胡子,老成少年帝国栋梁。

吾日三简之元宵节

发表于 2018-03-02 | 分类于 杂文

子日:
“吾日三省吾身;为人谋而不忠乎?与朋友交而不信乎?传不习乎?”

而我把“日三简”做为简书的笔名,也受此意启发。
要三检(简):检查吾身是否有达到君子之要求。
第二层意思,三缄(简)其口,少说多做。
第三层意思,要勤奋悟道,坚持简书。

今天元宵节,人生中的第37个新年,也要过境了。然而,感觉却有点陌生了。
因为,这个春节,没有鞭炮烟花,没有回老家,只串了一窝亲戚,只因有了两个娃并且在北京。感叹年味的索然是否让孩子们将来没有回忆的画面,感觉只是假长一点,然后就是吃睡拉撒。我们不能只怪北京快节奏和生活的重压。我总想把年过成童年的样子。这是否有点过于理想化。自省一下,的确如此了。但未尝不可设计一下我的孩子们的童年。我调查了多多的新年感受,他就说:不开心都没有放鞭。

于是乎,决心今天下班就去少买鞭炮或者手把花,让沉闷的年惊喜。让传统继续,吓跑“年”兽。

日记模板

发表于 2018-02-28 | 分类于 杂文

以下是以若写日记名“python的debug方法”为例。
日记访问url组成如下:
2017/11/06/python-e7-9a-84debug-e6-96-b9-e6-b3-95/

日记名称转换方法如下:
1)使用python命令行,把把日记名称”python的debug方法“转换编码

1
2
>>> urllib.parse.quote('python的debug方法')
'python%E7%9A%84debug%E6%96%B9%E6%B3%95

2)注意把结果中的%号全部替换成-
在vim中可以使用快捷命令:%s/%/-/g

结果如下:
python-E7-9A-84debug-E6-96-B9-E6-B3-95

日记的标准模板如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
---
title: python的debug方法
tags:
- debug
- ide
- idle
- pdb模块
- python
- 命令行
- 断点调试
#id: 190
categories:
- python
- 开发语言
date: 2017-11-06 16:52:27
---

然后,就写日记的内容吧。

content


岁月当歌,人生几何。

2018-2-27书皮事件

发表于 2018-02-27 | 分类于 日记

昨日,是大儿子多多开学之日。在前晚突击作业后,终于算是能带着体面的心情去上学了。早上还算积极吧。看来还是个有点求知欲的,当然,是不是假期憋的就不得而知了。下学后,拿着新书和老师的一堆指令。然后,问题来了。

给书本包皮时,妈妈拿出上一学期包书的旧书皮,可多多执意要使用新书皮。并且,以老师要求用新的书皮为由,开始耍驴脾气。开始他的表演。把书架书都甩在地方,自己找新书皮。我和他妈开始以家风和说教攻心了。可是,他就是不听,几度想开门出走来要挟,被喝止后又跑到别的屋里反锁门。于是,我不再说了。提高声调“。你随意找吧,但不把书架复原到找前的样子,今晚就会挨顿打。”然后,我去了旁屋。他也知道我也是不是戏言,并且,爷爷和奶奶也是帮不了他的。开始收敛了些。并且,我再出来时,已经发现地上的书都回到书架,但乱放着。他跑到了爷奶的屋里寻求庇护了。我和老婆开了第二波“进攻”。对他说:“如果老师说你的书皮不够新,因此受批评或让重新包皮的话,你回来告诉我,他不提倡节俭,我能让他下岗。”也妈也说:“每个塑料皮都是工业化学生产的,能保护好书就可以,扔了会浪费,并且污染环境……”。我又重复了一次家风,脑中闪现了个经典名句:你应该为成为你们班唯一使用旧书皮的学生而感到骄傲!他爷奶也示意我有点喋喋不休了,说他现在小,听不懂那些大道理的。我继续强硬:道理可以以后懂,但现在必须先执行。到了睡觉时间,我的小闺女也需要老婆喂奶了。相安无事后,我帮他包了剩下的几本书。

今天早晨,我选择坐地铁能顺便送他上学。他虽然没有表示,但心里感觉是高兴的。路上,我没有提书皮的事,但分享了一下论语中他读过的句子。“君子,食无求饱,居无求安。志于道……”

教育从来不是小事,为师者的要求,会影响每个小孩的价值观,每个家庭的系列争吵和矛盾。我和老婆也沟通了许多。中国式教育的体质已经如此了,希望用其好的一面,而有所规避吧。风波后思考,大娃多多的青叛逆期不远矣,但愿到时,我能说“不”的不多,或该说的“不”已经说过了。

python的debug方法

发表于 2017-11-06 | 分类于 python , 开发语言

经过摸索在两大层面都可以进行debug调试。

一,命令行

debug是编码是非常重要的调试技巧,通过在运行过程中设置断点,帮助开发人员更好的理解运行过程。
Python中debug不像JAVA或者C++那样在IDE中设置断点那么直观。
Python的debug有两种方式: 1.在命令行中运行, 2.在脚本当中运行。两种方式都需要使用pdb模块。
方式一:在命令行中运行
$ python -m pdb my_script.py
方式二:脚本中运行

在需要设置断点的地方,插入方法 pdb.set_trace()

import pdb

def make_bread():
pdb.set_trace()
return “I don’t have time”

print(make_bread())
命令: 在进入调试状态之后,就可以输入命令进行调试了。
c: (continue)继续执行
w:(words)显示当前行的上下文信息
a:(arguments)打印当前函数的参数列表
s:(stop)执行当前行,并在顶一个可能的时机停止
n:(next)继续执行直到当前函数的下一行或者函数返回值

二,IDE中

本人使用IDLE(即python安装时带的)。
打开shell,代码窗口,和debugger。三大窗口。

  • 第一步,在代码中可以加断点。
  • 第二步,
    在shell命令行中可以准备些环境引用,包括,
    import sys
    sys.path.append(“”)
    当然,可以再import你写的包,或者第三方的包。
  • 第三步,可以通过包引用来选择测试你要的任意函数。在单步调试时,可以看到所有的变量,一目了然。

对于IDE中调试,改了代码后,要重启shell,并再次引用。这一点来看不如命令行调试。

VC权威剖析:MFC原理、机制与开发实例----读后感

发表于 2017-06-22 | 分类于 c/C++ , VC6和VS201X , 利器与技巧 , 开发语言

基础概念和消息映射

Image

窗口:

  • 按级别分:
    • 桌面窗口
      • 顶级窗口
        • 子窗口
      • 重叠或弹出窗口

CS_PARENTDC:

有此属性(并不是窗口风格),它可以继承父窗口的显示设备上下文。edit,button都是如此的。


WS_CHILD:

纯子窗口,只有客户区,并且客户区的显示界面要在WM_PAINT消息处理中进行绘制。edit,button都是如此的。


WS_OVERLAPPED:

若不同时指定WS_CHILD那么它是顶级窗口,总有标题栏WS_CAPTION和边框,并且自动设置WS_CLIPSIBLINGS。创建重叠窗口时可以指定默认大小选项CW_USEDEFAULT。


WS_POPUP:

弹出窗口创建时,也会自动设置WS_CLIPSIBLINGS。但其它风格必须专门指定,包括WS_CAPTION,也不能指定默认大小选项。




检索窗口:可以跨进程找到窗口的句柄,因为用的是CWnd的静态函数,如下:


FindWindow()

GetWindow()


以下相对来说是内部查找了。


用于找父窗口的:

CWnd::GetParent(),可以省略CWnd

但有可能父又是别人的子,所以

CWnd::GetParentOwner()


用于找子窗口的:

CWnd::GetTopWindow()

CWnd::GetDlgItem()


CWnd::GetDescendantWindow()——–通过ID号取得窗口指针

CWnd::GetWindowFromPoint(POINT)函数取得占用父窗口客户区指定点的子窗口。实参POINT是客户区坐标。

消息:

Image
  • 窗口消息(区别于线程消息):
窗口消息:除了WMCOMMAND外,所有WM开关的消息。与某类窗口紧密相关。

1,系统自动生成的窗口消息映射

2,通过类向导来生成的消息映射

3,通过宏ON_MESSAGE(message,memberFxn)

主要讲解以下三类消息,原因是类向导不能自动帮助生成,也没有系统建立好,要手工添加。包括自定义消息。

命令消息

菜单(工具栏,加速键)、按钮向窗口发送,要求执行某个功能操作的消息,与程序动作相关。

用宏ON_COMMAND(id,memberFxn)来建立消息映射。加入数组的第二参数为,CN_COMMAND(内容是0,而通知消息则是非零值)

通知消息

MFC为每个通知消息都定义了宏,如果控件的内容变化ON_EN_CHANGE,ON_EN_UPDATE,鼠标滚动等。

通过ON_CONTROL(wNotifyCode,id,memberFxn)来生成消息映射。其实它是ON_COMAND的重载而己。新控件都使用专门的ON_NOTIFY来建立了。它能传递更多的附加信息。如:

纯正,新式的通知消息使用如下:

ON_NOTIFY(TVN_KEYDOWN,IDC_TREE,OnKeydown)

注:在两层面变化了,通知代码和处理的函数原型上,后者有实参,并引入新的结构了。

不通过ON_CONTROL来消息映射的特殊通知消息。WM_CTLCOLOR


反射消息

由主窗口通过CWnd::ReflectLastMsg()发给子窗口,此函数调用了子窗口的OnChildNotify()—-ReflectChildNotify()

在其中,就是原始的switch了。

对旧式通知消息的反射消息和通知消息的反射消息时

—–OnCmdMsg()


Image


命令ID:

[0x8000,0xF000)———–全局命令,可由不同对象处理。菜单项的的ID值都在此范围内。

小于0x8000—————-局部命令,按钮

MFC应用程序角度—-CWndApp分析

接开发者地气的些设计。它的父和子,都是一个程序从生到死的维护者。在继承的应用类实例中,把这爷仨的属性都设置了,找到相应的归宿。

有三种主窗口:单选的。事实看看MFC应用程序向导即可。

单,多文档的主窗口都是CFrameWnd(后者派生的)。而基于对话框的就不用多说了。


Image











































m_pszAppName

向导中填写的工程名称,可以在CWndApp构造时传参指定。如果没有指定,会使用字符串资源“AFX_IDS_APP_TITLE”,如果还没设置这个串,将由可执行文件名代替。

属于CWndApp类

m_pszExeName

属于CWndApp类

m_pszProfileName

应用程序的INI配置文件名,在继承应用类中设置自己的配置文件 。

GetProfileString()等系列函数来配合。

属于CWndApp类(默认是执行程序.ini)

m_hInstance

模块在进程中的装入地址

属于CWndApp类

m_pMainWnd

在CSingleDocTemplate或CMultiDocTemplate构造时,就把资源文件绑定和主窗口框架类,文档类,视图类全都实例化,同时设置了此指针。基于对话框的也按其方式会设置此指针。注:没有命令行参数时,默认执行ID_FILE_NEW

文档,视图,都是MFC管理的,实例在堆上,不用手动回收。

当设置好,别忘记


ShowWindow(SW_SHOW);

UpdateWindow();

SetWindowText(“XXX程序”);


这样这个主窗口的消息循环,在Run时触发。

属于CWinThread。设置了此指针的UI窗口,在销毁时,都是安全的。



用向导也好,自己个性化改造也好,反正重载的initInstance函数至少有有模有样了。


命令行参数功能,有时在不同进程启动的相互调用时很有用。





双系统搭建及ubuntu和CentOS下安装Qt5

发表于 2017-06-20 | 分类于 Qt , ubuntu , windows , 利器与技巧 , 系统平台

把大象放冰箱里需要三步,同样,玩linux也需要。第一,制作USB启动盘,第二,安装系统,第三,安装Qt5。

第一篇,材料准备

有多种方式来制作USB启动盘。本人实验了两个,用vmware12和ultraISO.

虚机方式:

https://jingyan.baidu.com/article/fc07f98976710e12ffe519de.html


http://blog.csdn.net/qq_24369113/article/details/53179218


建立好空白虚机后,就是提示第一坑。

第一个坑,就是开启intel VT-x.从bios中设置。

重启,再来,可以了,不要装vmware-tool先,不然就在抢占CD-rom。



在我本机S1 yoga的bios上设置两处:

一,sercurity中的安全引导去掉

二,startup中的boot中选择both,即允许传统模式。


用烧录方式:

当然就是把ISO用ultraISO来烧录到USB中了。这个方式不用过多介绍。


当做好USB启用盘后,你F12引导从U盘进入系统,你会看到try和安装两个大按键的情况。我们即可进入第二篇章了。

第二篇章,系统安家

你是租房还是要买房?系统放到你的U盘上还是,想系统在你的硬盘上?这个问题赶快想,尤其是安装步骤到了分区时。但不管如何,选择安装到硬盘是入口。


如果是想在USB上玩linux,那当然安全,不会破环原来的系统。但是磁盘空间,硬件支持和使用体验必须是要慢被理解的。分区方法如下:(我的U盘就16G)

要在U盘上/dev/sdb建立新分支,一个主15G,一个交换分区9百M。

安装不必细说,当出现提示重启时,拔出U盘即可。


当你是个老司机,硬盘富余,且酷的话,来吧,装在硬盘上。并且让windows来当房东。这个意义深远了,因为,如果你想linux撤出,只要格式下那个分区即可。方便的代价就是要懂得原理并实现,还有找到利器,比如easybcd。



原理其实就是:

MBR—-grub2—-bootmgr(由grub来接管系统,在它的分支中选择windows还是linux)

现在:

MBR—-bootmgr—-grub(由windows提供的引导菜单,它当房东,grub就只管引导linux即可,不用去学习grub命令行,好主意)


那个利器就是编辑bootmgr的。所以,我用后面的引导模式了。


用windows的磁盘管理,压缩卷,把最后一个分区给缩小,然后就会多出一个空闲分区,这个就是给硬盘linux的“新房”。

然后,重启用U盘引导,这次同样选择安装到硬盘选项。在分区时,需要充分小心了。


先看看前人的指导:http://blog.csdn.net/pop_rain/article/details/70477085



在我的环境中最终分三个,/,/boot,/home分别为10G,200M,50G,注意引导要放在与/boot同映射的分区上。注意没有/swap区。

因为据说17.04后的版本不需要分交换分区了,而变成了交换文件的方式。

并且,如果你把引导装在了/boot对应的分区,grub2不会跑出来作怪,这是让windows来引导的前提。不然,得用工具修复MBR,所以,装完ubuntu,再重启应该是熟悉的wiondows不是grub。如果是后者,你分区错了。

当你再重启发现进入了熟悉的windows了,没有错,因为,房东管理着客户linux。此时,搬家已经完成,linux入住了,但房东没有给配好钥匙。进系统后,找那个利器吧。easybcd中加一个引导条目,分区选择为/boot那个系统分区。


再重启,windows给你选择权了,让你进linux去吧。不过,我碰到了问题。



最大的坑是:ext4 superblock checksum 。没错,这个是硬盘格式的错误。卡了我一下午。


一个国外帖子搞定了。

https://linuxexpresso.wordpress.com/2010/03/31/repair-a-broken-ext4-superblock-in-ubuntu/


先用USB安装盘,启动进去,用root修复好挂载/的那个分区/dev/sda7.

然后,重启硬盘引导后发现可以有root的命令行,看来修复硬盘格式有戏。

然后,就是把其它的两个linux分区修复。之后,ubuntu17.04的用户登陆界面出现。

但最后,反朴归真了,发现在busybox的initramfs的命令提示符下,用 (sudo) fsck.ext4 /dev/sda7,8,9,三次命令后,reboot即可。


终于是躺在我硬盘里的,与win7同床的,让微软引导的小弟系统呀。


第一件事,开启root。

技巧把$变成#,sudo -s.或sudo su

此时安装东东已经够了,但如果你想用root来登陆系统。继续下面操作。


然后执行: vi /etc/lightdm/lightdm.conf.


增加 greeter-show-manual-login=true allow-guest=false . 修改完的整个配置文件是


[SetDefaults]

greeter-session=unity-greeter

user-session=ubuntu

greeter-show-manual-login=true #手工输入登陆系统的用户名和密码

allow-guest=false #不允许guest登录


然后我们启动root帐号:

sudo passwd root

根据提示输入root帐号密码。


重启ubuntu,登录窗口会有“登录”选项,这时候我们就可以通过root登录了。


第三篇章 系统装修

与房东win7磨合得不错,但linux下没啥好玩的就有些寒酸了。装个Qt5来。


如果你是CentOS,这可以这么玩了。

{

一,编译器准备:


yum check-update

yum -y install gcc

yum -y install gcc-c++


—–解释

gcc: yum install gcc

g++: yum install gcc-c++

此外还有以下方法:

yum install make

– 或者

yum groupinstall “Development Tools”

– 或者(这个省事,把系列工具全搞定)

yum install gcc gcc-c++ kernel-devel

二,Qt5依赖库准备:


http://blog.csdn.net/shine_journey/article/details/50676421


#yum install mesa-libGL-devel mesa-libGLU-devel

#yum install freeglut-devel




}//end CentOS




ubuntu:

{

http://jingyan.baidu.com/article/7f41ecec1b7a2e593d095ce6.html


首先不可或缺的就是编译器与基本的函式库,如果系统没有安装的话,依照下面的方式安装:


$ sudo apt-get install build-essential


安装OpenGL Library


$ sudo apt-get install libgl1-mesa-dev


安装OpenGL Utilities


$ sudo apt-get install libglu1-mesa-dev


OpenGL Utilities 是一组建构于 OpenGL Library 之上的工具组,提供许多很方便的函式,使 OpenGL 更强大且更容易使用。


安装OpenGL Utility Toolkit

如果不行就把,sudo apt-get install libglut-dev命令改成

$ sudo apt-get install freeglut3-dev

}//end ubuntu


三.直接运行安装包

#sh qt-opensource-linux-x64-5.5.1.run


四.安装好之后,需要添加环境变量

#vim /etc/profile

在最后一行,添加以下内容:

export PATH=”/opt/Qt5.5.1/5.5/gcc_64/bin:$PATH”

export PATH=”/opt/Qt5.5.1/Tools/QtCreator/bin:$PATH”


如果第四步没有搞好,编译好的测试项目不能运行执行文件。本人就碰到了xcb的插件要求报错。原来在5.5以上的高级Qt版本中,引用了platform的概念。所以,要使用LD_LIBRARY_PATH来找那些库。当然,你找那个qtcreator.sh执行,里面有自动配置好系统环境的处理。


until now,enjoy!





git局网实战

发表于 2017-05-11 | 分类于 git , 利器与技巧

介绍个轻量级方案,让局网下使用git方便,抛砖引玉了。

  • 第一步,首先在A机上,把代码的目录变成仓库。

    用git init或者用GUI操作,这没啥新鲜的。

  • 第二步,在A机某个共享文件夹中建立个裸仓库(基于第一步的仓库)

    即使用命令:在第一步的目录中,而share则是本机的共享目录。

    git clone –bare . /c/Users/Administrator/Downloads/share/bare-cad.git

    但,此时,第一步的仓库并没有把第二步刚建立的仓库当成远程仓库。所以,还要手工建立联系。

    git remote add origin /c/Users/Administrator/Downloads/share/bare-cad.git

    再加上一个

    git push –set-upstream origin master

    可保万全,它设置了第一步仓库的上游或者说远端源是第二步仓库了。不信,你用git branch -a或git push来测试。

    到此,A机内循环通道完毕。

  • 第三步,在局网的其它机器B上,映射驱动器为A机的那个共享目录。

    Y:/bare-cad.git就是那个第二步建立的仓库。

    并同时克隆一个仓库在自己喜欢的目录下。

    git clone /Y/bare-cad.git

    上游或远程关系自动建立好,git pull/push都没问题了。

  • 第四步,开始协同开发,推拉自如。好像装箱和开箱,而这个中转箱,则为bare-cad.git.

翻墙小记

发表于 2017-03-23 | 分类于 web与移动开发 , 杂文
以为下了chrome和ssh 隧道技术以国外主机做支点,即可访问google了。

非也。因为,chrome不能使用默认的代理服务器功能。它需要专用的扩展。这块,它不如360,因为,在那里一设置好socks,百度ip查询一下,就显示为境外ip了。

但360也有不如chrome的地方,当所有的环节都通了时,facebook,youtube和google。这种大名鼎鼎的网站还是访问不了的,因为,360毕竟是要吃饭的。这几个url已经被硬编码进了浏览器。

当然,这是猜的。


总之,两个工具配合起来就完全太棒了。

首先,用翻墙了的360去查chrome的扩展,那可是海量的应用呀,大开眼界,虽然这些也能和360来配合。但我不做这种强扭瓜甜的事。

于是,找到了proxy_switchyomega2.4.5这个扩展的网页,拷贝出它的id。注意在网址中截取像ID的一串码,位长度多少忘记了。

然后,在一个专门提供离线扩展下载的网址里输入此id后,就能下载到crt文件。

这个就是扩展的安装包。可以被chrome无缝的使用,可以说是想插就插,方便的很呀。把下载的

Proxy-SwitchyOmega_v2.4.5.crx

直接拖入chrome后,就可以配置代理服务器的ip和端口了。

应用设置后,在chrome地址栏的右侧,可以看到启动和关闭代理服务器的开关了。

你来控制,说翻就翻吧。


装了这个chrome扩展后,后面的扩展和应用就会让你忍都忍不住,因为实在是太好用,太方便了。

随便推荐两个。

gmail和diigo annotate

git学习笔记

发表于 2017-03-14 | 分类于 git

基础概念


合并(merge):一般在分支到主线

快进:另一分支并没有更改过。

合并:两分支各自变化了,需要解决冲突

比如,如果要将开发中的分支(develop),合并到稳定分支(master),

首先切换的master分支:git checkout master。

然后执行合并操作:git merge develop。

如果有冲突,会提示你,调用git status查看冲突文件。

解决冲突,然后调用git add或git rm将解决后的文件暂存。

所有冲突解决后,git commit 提交更改。


分支衍合(rebase):一般在主线到分支

最好的场景是把主线的修复推向需要的支线。

分支衍合和分支合并的差别在于,分支衍合不会保留合并的日志,不留痕迹,而 分支合并则会保留合并的日志。

要将开发中的分支(develop),衍合到稳定分支(master)。

首先切换的master分支:git checkout master。

然后执行衍和操作:git rebase develop。

如果有冲突,会提示你,调用git status查看冲突文件。

解决冲突,然后调用git add或git rm将解决后的文件暂存。

所有冲突解决后,git rebase –continue 提交更改

后台详解


一个对象名,是根据内容sha出来的40字符串。

二个目录:git目录,工作目录

三个:

index,staging area,未入仓库的,由仓库管理的,暂存区

四种对象:每个对象都包括三部分:类型,大小和内容。

blob,git show

tree,git ls-tree

commit,git show -s –pretty=raw ,一个commit只指向一个tree,它用来标记某一个特定时间点的状态。包括时间戳,提交者,(parent)指向上次提交对象的指针,(tree)。

tag,git cat-file tag v1.5.0 用来标识某个提交的方法,包括对象名,对象类型,标签名,,标签创建者名字。


以下转来的思路清楚的后台逻辑:


————————————-

设想你现在位于 alpha/ 目录下,这里有一个文本文件 number.txt,里面的内容只有一个词:“first”。

现在执行 git init 将这个 alpha 文件夹初始化为 Git 仓库。

执行 git add number.txt 会将 number.txt 添加到 Git 的索引(index)中。这个索引记录了所有 Git 保持追踪的文件,现在它有了一个映射记录 number.txt -> first,同时 add 命令还会把一个包含了 first 字符串的二进制对象加入 Git 的对象数据库里。

现在执行 git commit -m first。这条命令会做三件事情。首先在对象数据库内创建一个树对象,用以记录 alpha 目录下的文件列表,这个对象有一个指针指向前面 git add 命令创建的 first 二进制对象;第二,这条命令还会创建一个 commit 对象用以代表刚刚提交的版本,它包含一个指针指向刚刚的树对象;第三,master 分支也会指向这个新创建的 commit 对象。

现在执行 git clone . ../beta。它会创建一个新目录 beta 并将其初始化为 Git 仓库,然后把 alpha 仓库的对象数据库中所有对象拷贝给 beta 的对象数据库,将 beta 的 master 分支像 alpha 的 master 一样指向相应的对象。它还根据 first提交的内容配置索引,并根据索引更新目录下的文件——也就是 number.txt。

现在切换到 beta 目录,修改 number.txt 的内容为“second”,执行 git add number.txt 和 git commit -m second,新创建的提交对象 second(译注:姑且称之为 second)会有一个指向父提交(first)的指针,表示 second 继承自 first,而 master 分支则指向 second 提交。

回到 alpha 目录,执行 git remote add beta ../beta,将 beta 仓库设为远程仓库。然后执行 git pull beta master。

在这条命令背后,它其实会执行 git fetch beta master,从 beta 仓库中找到 second 提交的相关对象拷贝到 alpha 仓库;把 alpha 中关于 beta 的 master 分支记录指向这个 second 提交;更新 FETCH_HEAD 指向刚刚从 beta 仓库拉取的 master 分支,还是这个 second 提交。

此外,pull 命令还会执行 git merge FETCH_HEAD。从 FETCH_HEAD 得知最近拉取的分支是 beta 仓库的 master 分支,据此拿到相应的对象,也就是 second 提交对象。此时 alpha 的 master 分支指着 first 提交,正好是 second 的祖先提交,于是对于 merge 命令来说只需要将 master 分支指向 second 提交即可。接下来 merge 命令还会更新索引以匹配 second 提交的内容,并且相应更新工作目录中的文件。

现在执行 git branch red,创建一个名为“red”、指向 second 提交的新分支。

然后执行 git checkout red。在 checkout 之前,HEAD 指向 master 分支,执行命令之后它就指向了 red 分支,使得 red 成为当前分支。

接下来把 number.txt 的内容修改为 “third”,执行 git add numbers.txt 和 run git commit -m third。

之后再执行 git push beta red,这条命令会把 alpha 仓库内跟 third 提交相关的对象拷贝至 beta 仓库,并且将(alpha 仓库内记录的)beta 仓库 red 分支指向 third 提交。就酱。

个人总结

事实上只有理解后台的动作,才能在命令中游刃有余。下面个人总结的,请大家抛砖。

后台的勤劳者

git clone

—后台把新仓库的同名分支和旧仓库的远程分支(相对于新仓库)做“自动追踪”映射了。

手工改的命令是:

git branch –set-upstream master origin/next

–set-upstream-to=origin/next master

在push后加下面的效果一致(关联阅读):注远程没有next也会生推过去,并设置了跟踪关系。

-u origin next


git pull <远程主机或仓库默认origin> <远程分支>:<本地分支>

—后台的动作包括fetch FETCH_HEAD(默认是远程的master并设置,在不加参数情况下,它也会全取来远程下面的所有分支)

—后台还有merge动作。前提是当前分支与远程分支存在追踪关系了。


git push<远程主机或仓库默认origin> <本地分支>:<远程分支>

—注意这是危险的,要先pull才好。它在后台只接受“快进”,并且要注意冒号前的分支所属


rebase

—后台有个删除动作的,为了让树看起来漂亮,他会像橡皮一样擦除本分支内的commit对象,然后做好搬运合并。所以,这一般都在非主分支上。


附个技巧:有点像“月光宝盒”哟


#保留你当前状态,包括未跟踪的垃圾文件,并最后再搞回来

git stash

git checkout fe9c4

#看代码等操作

git checkout master

git stash pop


注意pop是会删除stash对象的,而apply不会,要有多个stash时,用stash@{num}来指代。
12…4
ohala

ohala

39 日志
41 分类
112 标签
© 2018 ohala
感谢来访,欢迎指教 e_mail
|
回大本营喽: — motherland