在英文版Ubuntu 添加“文泉驿微米黑”和“文泉驿正黑”字体
下面的命令分别添加正黑和微米黑。
sudo apt-get install ttf-wqy-zenhei
sudo apt-get install ttf-wqy-microhei
[Linux FTP工具] lftp命令详解
一直想找一个在linux里能与FlashFXP比肩的ftp客户端,试过了若干种GUI的ftp client,有free的也有non-free的,但实际用过得同志应该清楚,说它们是lj,恐怕伤了作者的心,但又实在找不出其他形容。转了一圈又回 到lftp,没有GUI,对于初学者来说,虽然有一点点痛苦,但只要想想,lftp能在众多client中屹立不倒这么多年,而且至今仍然是linux 里最首推崇的利器,足以说明他的功能和易用性都是不错的。我的经验是,花一点时间来学lftp是值得的,不要再徒劳地寻找GUI FTP Client,在unix世界里,没有FlashFXP!
首先来说一下lftp登录站点的操作,有好几种方式,都非常简单。
1. 一气呵成式
$ lftp (ftp://)user:password@site:port
比较常用于网页或bbs上给出的现成链接,缺点是password显示为明文,推荐在月黑风高、四下无人的环境里偷偷输入...如果不幸背后有人
$ lftp (ftp://)user@site:port
然后系统会提示输入password,这是就是******了
2. 老实巴交型
$ lftp site -p port -u user,password
这是lftp说明文档里给出的标准方式,这一招比较费体力,请根据自己身体情况量力而行。如果体能一般,可以
$ lftp site:port -u user,password
似乎是略微省事一点儿,我一般也用这种方法
3. 五短之中暗藏一长
这是一个递归嵌套的招式%¥#@!×&
$ lftp
lftp:~>lftp user:password@site:port
就是说在lftp控制台里进行操作,和在系统终端是完全一样的,你仍然可以毫无顾忌地用使用前面两招,同时也可以用o或open代替lftp,后面站点用户名密码的格式也可以根据自己偏好输入
4. 终极大招
每次登录都狂敲一行user:password@site:port,长年累月,就算李铁来了也扛不住。所以还是要让lftp把常用的站点记下来,就象FlashFXP里的站台管理器,在lftp里,叫做bookmark,具体的咱们日后再说
登录完成第一件事就是想看看这个服务器上有什么好东东。
操 作和终端里是一样的,ls就是列出服务器目录。有一点要说明,第一次ls之后,目录表就被保存到了本地cache,这样再次ls就不能得到这个目录下最新 的列表,这时可以用rels重新下载目录表。这里的cache是lftp的默认设置,目的无非就是更快的得到列表,有时却不符和你的使用习惯。可以用 cache on和cache off开关cache,也可以用cache flush来清空cache。
更改目录也是cd,没什么可说的,lftp也支持tab匹配功能,大大减少了劳动强度。
lftp 支援了六种模式, ftp, ftps, http, https, hftp, fish and file(当然了 https 和 ftps 的支援必须在编译就和 openssl library 一起编译好)。
lftp 内建了 shell-like 的命令格式, 允许在背景同时执行多个命令(&)。所有背景执行的工作都是在同一个程序中(process), 能将前景执行的命令放到背景执行(Ctrl-z), 或从背景拿回前景执行(wait 或 fg), 甚至还可以经由上个命令的传回值来决定目前这个命令是否要执行(&& ||)。
在结束 lftp 时, 如果还有程序执行中, lftp 会将自己切换到 no hup 模式并放到背景执行。因此不必担心执行 lftp 当中无法登出。
!
可执行本地端 shell 中的命令, 如 !ls /usr/local/bin/
由於 lftp 并没有 lls(显示本地端档案列表的指令), 故可用 !ls 来替代。
alias []
定义别名
alias less more
alias reconnect "close; cd ."
直接输入 alias 即可看到目前定义了那些别名。如果只输入 alias name 的话, 则是取消 name 这个别名。
bookmark SUBCMD
设定书签, 可将目前站台及所在目录设成书签, 下次可直接进来, 不用再 cd 来 cd 去的
bookmark add name 用来新增名称为 name 的书签
bookmark del name 删除名称为 name 的书签
bookmark list 显示目前有设定那些书签(另外直接打 bookmark 和 bookmark list 的结果一样)
bookmark edit 呼叫编辑器修改书签 (~/.lftp/bookmarks)
cd 切换远端目录
cache SUBCMD
管理 lftp 的 cache
rels []
从 cache 中显示远端档案列表
rels 则不会从 cache 中读取
recls opts [path/]pattern
从 cache 中显示远端的档案列表, 应该算是 ls 的加强版, 有很多参数可用,应该是可用来产生各种不同>的档案列表以供其他程式使用。
recls 则不会从 cache 中读取
du options
计算远端整个目录占用容量
get OPTS -o
抓取远端档案
get rfile -o lfile
抓 rfile 到本地改名为 lfile
-c 为续传
-E 抓档完成后, 将远端的档案砍了
-a 为 ascii mode, 预设为 binary mode
-O 设定 base directory 为本地端放档案的目录
mget OPTS
下载远端档案(可用 wildcard expansion 也就是 *)
pget OPTS -o
使用多个连结来下载档案, 预设为五个。
-n 3 为叁个连结
jobs -v
显示目前有那些程序在背景执行
-v 显示详细的资讯(-v 可多加几个来显示更详细的资讯)
lcd
切换本地端的目录
mirror OPTS remote [local]
下载整个目录(楼上的 get 只能用来抓档案)
-c 续传
-e 这个要小心一些, 比较远端和本地端的档案, 假如远端没有的, 就将本地端的档案删除, 也就是将本地端和远端资料同步。
-R 上传整个目录
-n 只下载较新的档案
-r 不用递回到目录中
--parallel=n 同时下载 n 个档案(预设一次只下载一个)
module name args
载入模组
put OPTS -o
上传档案
mput OPTS
上传档案(可用 wildcard expansion 也就是 *)
mv
将远端的 file1 改名为 file2
mrm
用 wildcard expansion 方式来删除远端档案
open OPTS
开启某个站台
open -u , -p site
queue OPTS []
将 cmd 放到伫列中等待执行
-d index 将编号为 index 的 job 删除
-m index new_index 将编号为 index 的 job 移至编号 new_index, 插队专用。
-n index 在编号 index 之前新增一个 job
wait []
将背景执行中的程序移至前景(也可用 fg)
kill all|
删除全部的 jobs 或 job_no
repeat delay command
每隔 delay 秒, 重覆执行 command, 预设是每隔一秒
rm -r -f
移除远端档案
mkdir -p
建立远端目录
rmdir -f
移除远端目录
set OPT []
设定变数
直接键入 set 可看目前定义了那些变数
source
读取 file, 并执行 file 中的命令(应该是和 bash 中的 source 命令是一样的吧)
debug [|off] -o
设定 debug level 为 level
-o 将输出导向至 file
exit [|bg]
结束 lftp
此时若还有 jobs, 则会将 lftp 放至背景执行, 继续未完成的工作
history -w file-r file-c|-l cnt
和 bash 中的 history 功能一样
renlist []
只显示远端的档名
pwd -p
显示目前远端所在目录
-p 连登入密码也显示
scache []
只打 scache 显示目前所有的 session, 加上 session_no 可切换至其他的 session,
对於同时开启多个站台或同个站台不同目录间切换。
小弟有遇过某些站台, 一个 ip 只允许登入一次的,如果想同时抓好几个档案在不同目录下,就
只能一次抓一个,等到抓完了才能再切换到别的目录去抓第二个, 这时 lftp 的 queue 就派上
用场了。一般下了 get, mget 的话, 档案就直接开始下载了, 这时就无法再切换到其他目录了, 因此, 先将 queue 给停止, 首先下个 queue, 按 enter, 再下个 jobs 即可看到目前 qu
eue 是停止的。这时再将要抓的东东一个个加入 queue 中, 等到要抓的东东都进入 queue 后
, 再下 queue start 一次全部传送, 这样子可省去随时注意档案是否抓完,迼成困扰。
lftp localhost:/pub/Iso> queue
lftp localhost:/pub/Iso> jobs
0 queue (ftp://localhost)
Queue is stopped.
lftp localhost:/pub/Iso> queue get rettcd.iso
lftp localhost:/pub/Iso> jobs
0 queue (ftp://localhost)
Queue is stopped.
Commands queued:
1. get rettcd.iso
lftp localhost:/pub/Iso> queue mirror Linux/
lftp localhost:/pub/Iso> jobs
0 queue (ftp://localhost)
Queue is stopped.
Commands queued:
1. get rettcd.iso
2. mirror Linux/
lftp localhost:/pub/Iso> queue start
lftp localhost:/pub/Iso> jobs
0 queue (ftp://localhost)
Now executing: 1 get rettcd.iso
Commands queued:
1. mirror Linux/
1 get rettcd.iso
`rettcd.iso' at 4772864 (9%) 3.00M/s eta:14s Receiving data
相关文件
/etc/lftp.conf
全局配置文件,实际位置依赖系统配置文件目录,可能在/etc,也可能在/usr/local/etc
~/.lftp/rc, ~/.lftprc
用户配置文件,将在/etc/lftp.conf之后执行,所以这里面的设置会覆盖/etc/lftp.conf中的设置。
lftp 缺省不会显示 ftp 服务器的欢迎信息和错误信息,这在很多时候不方便,因为你有可能想知道这个服务器到底是因为没开机连不上,还是连接数已满。如果是这样,你可以在 ~/.lftprc 里写入一行
debug 3
就可以看到出错信息了。
更多的配置选项请查man手册或在lftp界面内用命令 set -a 获得。
~/.lftp/log
当lftp转为后台非挂起模式执行时,输出将重定向到这里
~/.lftp/bookmarks
这是lftp存储书签的地方,可以lftp查看bookmark命令
~/.lftp/cwd_history
这个文件用来存储访问过的站点的工作目录
碰到一个中文字符集显示的问题, Remote FTP Server 的 Charset 是 gb2312 的, 我若直接 ls, 所有中文字符都是乱码, 根本没有办法使用. 要这样给一个参数才行:
lftp ryun@www.example.com:/>set ftp:charset gb2312
然后再 ls 一下看看, 是不是亲切多了 ^____^
这里还有一个方法, 针对经常使用中文字符集FTP的朋友可以这样来设定配置文件:
touch ~/.lftp/rc
echo 'debug 4' >> ~/.lftp/rc
echo 'set ftp:charset GBK' >> ~/.lftp/rc
现在 lftp 后直接支持中文字符显示
无法被动模式连接,转为主动模式就可以列目录了:在 lftp 登录后执行:
set ftp:passive-mode no
Qt::ConnectionType 解析
signal/slot在底层会使用三种方式传递消息。参见QObject::connect()方法:
bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoCompatConnection )
最后一个参数是就是传递消息的方式了,有四个取值:
Qt::DirectConnection
When emitted, the signal is immediately delivered to the slot.
假设当前有4个slot连接到QPushButton::clicked(bool),当按钮被按下时,QT就把这4个slot按连接的时间顺序调用一遍。显然这种方式不能跨线程(传递消息)。
Qt::QueuedConnection
When emitted, the signal is queued until the event loop is able to deliver it to the slot.
假设当前有4个slot连接到QPushButton::clicked(bool),当按钮被按下时,QT就把这个signal包装成一个 QEvent,放到消息队列里。QApplication::exec()或者线程的QThread::exec()会从消息队列里取消息,然后调用 signal关联的几个slot。这种方式既可以在线程内传递消息,也可以跨线程传递消息。
Qt::BlockingQueuedConnection
Same as QueuedConnection, except that the current thread blocks until the slot has been delivered. This connection type should only be used for receivers in a different thread. Note that misuse of this type can lead to dead locks in your application.
与Qt::QueuedConnection类似,但是会阻塞等到关联的slot都被执行。这里出现了阻塞这个词,说明它是专门用来多线程间传递消息的。
Qt::AutoConnection
If the signal is emitted from the thread in which the receiving object lives, the slot is invoked directly, as with Qt::DirectConnection; otherwise the signal is queued, as with Qt::QueuedConnection.
这种连接类型根据signal和slot是否在同一个线程里自动选择Qt::DirectConnection或Qt::QueuedConnection
这样看来,第一种类型的效率肯定比第二种高,毕竟第二种方式需要将消息存储到队列,而且可能会涉及到大对象的复制(考虑sig_produced(BigObject bo),bo需要复制到队列里)。
在QtCreator上 使用版本控制系统Git
在一篇介绍Git的文章中,作者说版本控制系统是为懒人准备的,它让懒人们比那些善于备份文档的勤劳人拥有更干净的文件系统以及更多的可以活着的时间。对此我深表赞同。同时在现在快节奏的社会中,提高团队合作效率更是团队生存的关键。所以,这坚定了我选择版本控制系统的信念。
git是我第一个接触的版本控制系统。有同学说你怎么不用SVN啊,我反驳:Git是Linux之父LinusTorvalds一手打造的,对于Linux系统和开源项目的管理当然好啦。其实我在QtCreator上搭建git的时候也是费了一番周折呢,现在终于成功了,高兴得想写一篇文章来总结一下。有不对的地方请尽管提出来,我会改正的。
我目前的开发环境:Ubuntu11.10、QtCreator2.41、Qt4.8。
保证正确地安装了QtCreator了吗?请看这里。
现在开始安装相关组件了:首先是git。Ctrl+Alt+T打开终端,输入sudoapt-get install git,回车,安装git。
为了方便地使用git,还必须安装gitk这个git的图形端。命令:sudoapt-get install gitk。
随后是团队开发必须的OpenSSH了。因为要和很多台主机进行通信,所以我们必须确保你们的连接是安全的,这里OpenSSH能满足我们的需求。安装命令是:sudoapt-get installopenssh-client。如果你自己创建一个代码库并且让自己的机器成为服务器,那么你还需要安装OpenSSH服务器版本,命令:sudoapt-get install openssh-server。
有安装OpenSSH问题的,可以移步至:这里。
安装完git后,我们看到,QtCreator已经检测到了git的存在。在版本控制和工具菜单里面都有git选项。
网上有大量git命令行相关的文章,我也不再赘述了,我就介绍git怎样和QtCreator一起使用。注意:QtCreator按照规范将路径中的所有中文转为\nnn(n为一个数字)的形式,在git中这样会导致定位失败(因为git可以识别中文路径)。
创建一个新的项目吧,快捷键Ctrl+n。记得项目的路径中不能有中文,必须是纯英文的形式,在这里我建立一个名为“test”的纯C项目。
点击下一步,出现版本控制的选项,选择git,如下图。我们在创建项目的时候会有一个.user文件,保存了一些用户杂项配置,但是不同用户的喜好不同,因此此文件并没有被git管理,不得不说QtCreator这一点为我们考虑得十分细致。
下一步,接下来就不要我说了吧,完成。创建了一个纯C的项目,其实就是HelloWorld。我们假设这个HelloWorld就是第一个版本,我们要将这个版本作为初始版本,那么我们应该点击“工具➡Git➡Commit……“作为我们的第一次提交,也是第一个版本。
填写作者和Email信息后,就可以写说明了。这里对“说明”输入框作一些说明:首先在我这个QtCreator版本一输入中文就崩溃(自动退出),很恼人的,所以这次我就没有填写中文信息了,但是使用git命令(命令:gitcommit,打开GNUnano编辑器)就可以填写中文。此外注意了吗?第一行是用粗体标志的呢,第二行为空,这是因为很多的信息服务(如接下来介绍的log)会将第一行作为题目,后面的作为正文。命令
填写好了,并且选择了需要提交的文件之后,点击提交,这样git就为我们储存了一个版本的信息了。
想要看看自己提交的版本信息吗?点击“工具➡Git➡Log“,可以显示提交的版本信息。如下图:
点击2552bae,就会显示用英文显示的版本信息,英文不好的同学们就糟糕了……
接下来我就要对这个项目做一些修改了,我们让它再显示一个文字:Hellogit!,并且命名这个版本为1.1。首先我们对源文件main.c进行修改,修改后的main.c如下所示:
#include<stdio.h>
intmain(void)
{
printf("Hellogit!\n");
printf("HelloWorld!\n");
return0;
}
其中蓝色字体部分是我们添加的。接下来我们保存一下,但这并不意味着提交到git中了,因为当你点击“工具➡Git➡状态“时,下面的输出会显示这一串文字:
#Changes not staged for commit:
#(use "git add <file>..." to update what will becommitted)
#(use "git checkout -- <file>..." to discard changesin working directory)
#
#modified: main.c
#
#Untracked files:
#(use "git add <file>..." to include in what will becommitted)
#
#test.pro.user
nochanges added to commit (use "git add" and/or "gitcommit -a")
显示了我们的main.c已经修改,但未提交至git(test.pro.user未受git管理,因为上文说过了,每一个用户杂项都由一个.user保存着,失去它不会对项目的设置构成影响)。于是我们还得再提交(commit)一下了。
填完了后点击提交,新的版本1.1就完成了。怎么样,是不是很简单啊。
查看一下log(工具➡Git➡Log),现在有两个版本了!
假设我们的1.1版本写得不好,或者把原有的代码改混乱了,我们想还原到原来的版本1.0那该怎么办呢?很简单,使用gitk就可以解决问题。打开gitk,出现这样的界面:
选择Ver1.0,点击右键,选择“Resetnaster branch tohere”,在弹出的对话框中选择Hard,并且单击OK就完成了版本的还原。需要注意的是,选择Hard模式意味着在新版本上的一切修改都作废,所以要慎重处理。

回到QtCreator界面,发现提示重新载入文件,点击“全部是”就可以了。
提到版本控制,就不得不提到它的一个重要的功能:分支功能。假如我们制作项目需要一些差异化的版本(例如Windows7家庭版和Windows7旗舰版等),但是它们都是拥有相同的部分,仅仅有一些部分是不同的,那么我们完全可以先制作相同的底层部分,然后创建多个分支,分别制作,这样可以拥有两个版本进行评估,最终选择一个更好的版本,也可以两个版本分别发售。在这一点上,git又帮了我们大忙,下面我就介绍在QtCreator上是怎样使用git的分支功能的。有不对的地方请尽管提出来,我会改正的。
我目前的开发环境:Ubuntu11.10、QtCreator2.41、Qt4.8。
首先打开QtCreator,点击“工具➡Git➡Log”来查看我们的Log。如下图:
我们看到第一行中间的括号(HEAD,master),它表示了当前head指针指向的是这个版本,并且这个版本所在的分支是master。怎样查看分支呢?很简单,点击“工具➡Git➡Branches...”就行了。
这里有一个master分支,正是我们以前编辑的分支。接下来我们创建另外一个分支,点击“添加”,创建一个名为Experimental的分支吧(不要选“跟踪本地分支master”)。然后我们先点击Experimental分支,然后点击checkout来切换到Experimental分支。关闭对话框,接下来的动作就在Experimental分支上进行了。
我们在main.c上进行一点修改,去掉HelloWorld显示,改为显示三角形的面积。
1 |
<span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;"><span style="color:#000080;">#include</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;"><stdio.h></span></span></span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;"><span style="color:#000080;">#include</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;"><math.h></span></span></span> <span style="color:#C0C0C0;"> </span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;"><span style="color:#808000;">float</span><span style="color:#C0C0C0;"> </span>AreaOfTriangle<span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#808000;">float</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">a,</span><span style="color:#C0C0C0;"> </span><span style="color:#808000;">float</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">b,</span><span style="color:#C0C0C0;"> </span><span style="color:#808000;">float</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">c</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">)</span></span></span> <span style="color:#000000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">{</span></span></span> <span style="color:#C0C0C0;"> </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;"><span style="color:#808000;">float</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">p</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">=</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">a</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">+</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">b</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">+</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">c</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">)</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">/</span><span style="color:#C0C0C0;"> </span><span style="color:#000080;">2.0f</span><span style="color:#000000;">;</span></span></span> <span style="color:#C0C0C0;"> </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;"><span style="color:#808000;">return</span><span style="color:#C0C0C0;"> </span>sqrt<span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">p</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">*</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">p</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">-</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">a</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">)</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">*</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">p</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">-</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">b</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">)</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">*</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">p</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">-</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">c</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">)</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">);</span></span></span> <span style="color:#000000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">}</span></span></span> <span style="color:#C0C0C0;"> </span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;"><span style="color:#808000;">int</span><span style="color:#C0C0C0;"> </span>main<span style="color:#000000;">(</span><span style="color:#808000;">void</span><span style="color:#000000;">)</span></span></span> <span style="color:#000000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">{</span></span></span> <span style="color:#C0C0C0;"> </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">printf<span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">"Hello</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">git!\n"</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">);</span></span></span> <span style="color:#C0C0C0;"> </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">printf<span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">"The</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">area</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">of</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">a</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">triangle</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">is:</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">%f\n"</span><span style="color:#000000;">,</span></span></span> <span style="color:#C0C0C0;"> </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">AreaOfTriangle<span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#000080;">6.0f</span><span style="color:#000000;">,</span><span style="color:#C0C0C0;"> </span><span style="color:#000080;">6.0f</span><span style="color:#000000;">,</span><span style="color:#C0C0C0;"> </span><span style="color:#000080;">6.0f</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">)</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">);</span></span></span> <span style="color:#C0C0C0;"> </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;"><span style="color:#808000;">return</span><span style="color:#C0C0C0;"> </span><span style="color:#000080;">0</span><span style="color:#000000;">;</span></span></span> <span style="color:#000000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">}</span></span></span> |
其中蓝色的部分是我们更改过的代码,编译运行后我们可以提交这段代码。我们就将这段代码的版本定义为1.2a,提交界面如下图所示:
提交完了后查看版本信息:
1 |
<span style="color:#000000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">* a4cbfc4 (HEAD, Experimental) </span></span><span style="font-size:12px;">蒋彩阳 </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">Ver. 1.2a 2012-10-27 10:28:11 +0800</span></span></span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">* a03507a (master) </span></span><span style="font-size:12px;">蒋彩阳 </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">Ver. 1.1 2012-10-24 08:56:34 +0800</span></span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">* 2552bae </span></span><span style="font-size:12px;">蒋彩阳 </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">Ver. 1.0 2012-10-20 11:27:13 +0800</span></span> |
此时HEAD指针指向了Experimental分支里面的Ver.1.2a版本了。
这个版本也算是成功的了,于是我将精力转向了另一个版本,我想让它实现对圆锥体积的计算。首先我们要将HEAD指针回调。点击“工具➡Git➡Branches...”,点击master分支进行checkout,切换到master分支,我们看到我们的main.c回到了原来的状态。查看一下Log看是否正确地切换?接下来我们再对main.c进行修改,让它能够计算圆锥的体积:
1 |
<span style="color:#000000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;"><span style="color:#000080;">#include</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;"><stdio.h></span></span></span></span> <span style="color:#C0C0C0;"> </span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;"><span style="color:#808000;">float</span><span style="color:#C0C0C0;"> </span>VolumeOfTaper<span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#808000;">float</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">radius,</span><span style="color:#C0C0C0;"> </span><span style="color:#808000;">float</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">height</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">)</span></span></span> <span style="color:#000000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">{</span></span></span> <span style="color:#C0C0C0;"> </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;"><span style="color:#808000;">return</span><span style="color:#C0C0C0;"> </span><span style="color:#000080;">3.1416f</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">*</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">radius</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">*</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">radius</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">*</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">height</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">/</span><span style="color:#C0C0C0;"> </span><span style="color:#000080;">3.0f</span><span style="color:#000000;">;</span></span></span> <span style="color:#000000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">}</span></span></span> <span style="color:#C0C0C0;"> </span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;"><span style="color:#808000;">int</span><span style="color:#C0C0C0;"> </span>main<span style="color:#000000;">(</span><span style="color:#808000;">void</span><span style="color:#000000;">)</span></span></span> <span style="color:#000000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">{</span></span></span> <span style="color:#C0C0C0;"> </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">printf<span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">"Hello</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">git!\n"</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">);</span></span></span> <span style="color:#C0C0C0;"> </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">printf<span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">"The</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">volume</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">of</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">taper</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">is</span><span style="color:#C0C0C0;"> </span><span style="color:#008000;">%f\n"</span><span style="color:#000000;">,</span></span></span> <span style="color:#C0C0C0;"> </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">VolumeOfTaper<span style="color:#000000;">(</span><span style="color:#C0C0C0;"> </span><span style="color:#000080;">10.0f</span><span style="color:#000000;">,</span><span style="color:#C0C0C0;"> </span><span style="color:#000080;">5.0f</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">)</span><span style="color:#C0C0C0;"> </span><span style="color:#000000;">);</span></span></span> <span style="color:#C0C0C0;"> </span><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;"><span style="color:#808000;">return</span><span style="color:#C0C0C0;"> </span><span style="color:#000080;">0</span><span style="color:#000000;">;</span></span></span> <span style="color:#000000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">}</span></span></span> |
提交一下,这次将其的版本命名为Ver.1.2b,这样我们项目的两个版本都做好了。如果我们想查看Experimental分支下的当前版本Ver.1.2a的情况,仍然可以使用“工具➡Git➡Branches...”并对Experimental进行checkout就可以了。
嗯,我想知道这两个版本究竟有什么不一样,要来回切换分支并且花很长的时间来找不同吗?哪有这么麻烦,很简单,使用“工具➡Git➡Branches...”,选择一个分支,这里是Experimental,点击diff,来看看和已经checkout了的master分支究竟有什么不同。下面是截图:
1 |
<span style="color:#000000;"><span style="font-family:'DejaVu Sans', sans-serif;">diff --git a/main.c b/main.c</span></span> <span style="color:#000080;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">index c450bd0..e9b2f1f 100644</span></span></span> <span style="color:#000080;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">--- a/main.c</span></span></span> <span style="color:#000080;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">+++ b/main.c</span></span></span> <span style="color:#0000FF;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">@@ -1,17 +1,15 @@</span></span></span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">#include <stdio.h></span></span> <span style="color:#FF0000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">-#include <math.h></span></span></span> <span style="color:#FF0000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">-float AreaOfTriangle( float a, float b, float c )</span></span></span> <span style="color:#00AA00;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">+float VolumeOfTaper( float radius, float height )</span></span></span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">{</span></span> <span style="color:#FF0000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">- float p = ( a + b + c ) / 2.0f;</span></span></span> <span style="color:#FF0000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">- return sqrt( p * ( p - a ) * ( p - b ) * ( p - c ) );</span></span></span> <span style="color:#00AA00;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">+ return 3.1416f * radius * radius * height / 3.0f;</span></span></span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">}</span></span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">int main(void)</span></span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">{</span></span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">printf( "Hello git!\n" );</span></span> <span style="color:#FF0000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">- printf( "The area of a triangle is: %f\n",</span></span></span> <span style="color:#FF0000;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">- AreaOfTriangle( 6.0f, 6.0f, 6.0f ) );</span></span></span> <span style="color:#00AA00;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">+ printf( "The volume of taper is %f\n",</span></span></span> <span style="color:#00AA00;"><span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">+ VolumeOfTaper( 10.0f, 5.0f ) );</span></span></span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">return 0;</span></span> <span style="font-family:'DejaVu Sans Mono', monospace;"><span style="font-size:12px;">}</span></span> |
这样看不就一清二楚了嘛。
此外还可以将某个分支删除(在“工具➡Git➡Branches...”中),为某个分支进行重命名,以及更加强大的gitk工具,这里就不再向大家介绍了。只要大家入门了,这篇教程就达到目的了。还希望大家一起努力,利用强大的编程工具制作出更加强大的作品来。